From eppstein@ics.uci.edu Mon Aug 5 00:44:35 2002 From: eppstein@ics.uci.edu (David Eppstein) Date: Sun, 04 Aug 2002 16:44:35 -0700 Subject: [Image-SIG] How to get 1.1.3 on MacOS X? Message-ID: <78382777.1028479475@[192.168.1.102]> I am currently using PIL 1.1.2 under MacPython (with a W user interface) to make web photo albums but am very frustrated with the lack of antialiasing when downsampling -- using smoothing instead results in very soft images. The new ANTIALIAS filter in 1.1.3 looks to be the perfect cure for this problem, and I'm hoping it will also fix the warnings I've been getting about obsolete regexp packages. But, the only distribution I've seen of 1.1.3 is the source. Is it possible to get this working under MacPython without a recent version of CodeWarrior (I do have a very old CW and a recent gcc), and is there information available somewhere on how to do this, or is there a compiled version available anywhere? Failing that, is there another OS X Python version I should be using, and if so what's involved in setting it up and creating GUI-based standalone applications with it? Please copy me on any responses since I only look at this list sporadically. -- David Eppstein UC Irvine Dept. of Information & Computer Science eppstein@ics.uci.edu http://www.ics.uci.edu/~eppstein/ From Jack.Jansen@cwi.nl Mon Aug 5 09:51:10 2002 From: Jack.Jansen@cwi.nl (Jack Jansen) Date: Mon, 5 Aug 2002 10:51:10 +0200 Subject: [Image-SIG] How to get 1.1.3 on MacOS X? In-Reply-To: <78382777.1028479475@[192.168.1.102]> Message-ID: <7D52D496-A850-11D6-B3C4-0030655234CE@cwi.nl> On Monday, August 5, 2002, at 01:44 , David Eppstein wrote: > I am currently using PIL 1.1.2 under MacPython (with a W user > interface) to make web photo albums but am very frustrated with the > lack of antialiasing when downsampling -- using smoothing instead > results in very soft images. The new ANTIALIAS filter in 1.1.3 looks to > be the perfect cure for this problem, and I'm hoping it will also fix > the warnings I've been getting about obsolete regexp packages. But, > the only distribution I've seen of 1.1.3 is the source. Is it possible > to get this working under MacPython without a recent version of > CodeWarrior (I do have a very old CW and a recent gcc), and is there > information available somewhere on how to do this, or is there a > compiled version available anywhere? David, if I find the time I'll try to upgrade pil to 1.1.3 for the next (2.3) MacPython release. But that could be a while off... > > Failing that, is there another OS X Python version I should be using, > and if so what's involved in setting it up and creating GUI-based > standalone applications with it? If you use OSX unix-Python (a.k.a. MachoPython) there should be no problem building pil from source yourself (assuming you have the OSX developer tools). But: if you want a fully functional W you'll probably have to build Python from the CVS sources (or, again, wait for 2.3). -- - Jack Jansen http://www.cwi.nl/~jack - - If I can't dance I don't want to be part of your revolution -- Emma Goldman - From gherman@darwin.in-berlin.de Mon Aug 5 14:38:44 2002 From: gherman@darwin.in-berlin.de (Dinu Gherman) Date: Mon, 5 Aug 2002 15:38:44 +0200 Subject: [Image-SIG] PIL/JPEG trouble Message-ID: --Apple-Mail-1-855400444 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Hi, I've just joined this mailing list after running into a problem that seems to be a reoccurring one, at least if I look into the list archives. I thought it should not occur anymore after PIL moved to using distutils, but maybe it's me doing something wrong? Has any- body else succeeded in compiling PIL with JPEG support on Mac OS X? Thanks, Dinu Forwarded from Pythonmac-SIG: > Von: Dinu Gherman > Datum: Mo, 05. Aug. 2002 12:05:56 Europe/Berlin > An: pythonmac-sig@python.org > Betreff: [Pythonmac-SIG] PIL/JPEG trouble > > Hi, I've got some trouble on OS X telling PIL where to find the JPEG > library. This results in "IOError: decoder jpeg not available" errors. > > I've installed JIG's library libjpeg.a into /usr/local/lib and its > tools into /usr/local/bin (wrjpgcom, rdjpgcom, jpegtran, djpeg, cjpeg). > I've also tried a configure pass with --with-jpeg=/usr/local/lib but > all in vain. > > I've attached a sample installation script which should automatically > fetch zlib, jpeg and pil from the net and install them the "canonical" > way... Below I've also pasted the results of running PIL's > MiniTest/test.py. > > Does anybody have an idea? > > Thanks, > > Dinu > > > [localhost:Imaging-1.1.3] dinu% python MiniTest/test.py > ***************************************************************** > Failure in example: _info(Image.open("Images/lena.jpg")) > from line #24 of test.testimage > Exception raised: > Traceback (most recent call last): > File "MiniTest/doctest.py", line 499, in _run_examples_inner > exec compile(source, "", "single") in globs > File "", line 1, in ? > File "MiniTest/test.py", line 12, in _info > im.load() > File "PIL/ImageFile.py", line 140, in load > d = Image._getdecoder(self.mode, d, a, self.decoderconfig) > File "PIL/Image.py", line 255, in _getdecoder > raise IOError("decoder %s not available" % decoder_name) > IOError: decoder jpeg not available > ***************************************************************** > Failure in example: type(im.im) # internal image attribute > from line #31 of test.testimage > Expected: > Got: > 1 items had failures: > 2 of 40 in test.testimage > ***Test Failed*** 2 failures. > *** 2 tests of 40 failed. > > --Apple-Mail-1-855400444 Content-Disposition: attachment; filename=install.py Content-Transfer-Encoding: 7bit Content-Type: application/text; x-mac-creator=522A6368; x-unix-mode=0644; x-mac-type=54455854; name="install.py" #! /usr/bin/env python """install.py - a funky install script. Sample usage: python install.py zlib jpeg pil python install.py pil """ import os, string, sys from os.path import basename, join from urllib import urlopen ############################################################################### # Package descriptions ############################################################################### jpeg = { "name": "JPEG Support for PIL", "homepage": "http://www.ijg.org", "download": "http://www.ijg.org/files/jpegsrc.v6b.tar.gz", "install": """\ tar xfz jpegsrc.v6b.tar.gz cd jpeg-6b ./configure make make test sudo make install sudo make install-lib """} zlib = { "name": "Zlib", "homepage": "http://www.gzip.org/zlib/", "download": "http://www.gzip.org/zlib/zlib-1.1.4.tar.gz", "install": """\ tar xfz zlib-1.1.4.tar.gz cd zlib-1.1.4 ./configure make sudo make install """} pil = { "name": "PythonWare's PIL 1.1.3", "homepage": "http://www.pythonware.com/products/python/index.htm", "download": "http://www.pythonware.com/downloads/Imaging-1.1.3.tar.gz", "install": """\ tar xfz Imaging-1.1.3.tar.gz cd Imaging-1.1.3 cd libImaging ./configure make cd .. python setup.py build sudo python setup.py install """} ############################################################################### # Installation ############################################################################### def install(packages): dir = os.getcwd() for p in packages: try: p = globals()[p] except: print "Skipping", p continue # get package details name = p['name'] url = p['download'] instructions = p['install'] # download, if needed path = join(dir, basename(url)) if not os.path.exists(path): print "Downloading", name data = urlopen(url).read() open(path, "wb").write(data) # install print "Installing", name open('install.sh', 'w').write(instructions) os.system('tcsh -f install.sh') if __name__ == '__main__': packages = sys.argv[1:] install(packages) --Apple-Mail-1-855400444-- From mauricio.inforcati@cenpra.gov.br Mon Aug 5 20:50:33 2002 From: mauricio.inforcati@cenpra.gov.br (Mauricio Caliggiuri Inforcati) Date: Mon, 5 Aug 2002 16:50:33 -0300 Subject: [Image-SIG] Reading 16bit image Message-ID: <200208051650.33685.mauricio.inforcati@cenpra.gov.br> Hi, how can I use the "raw decoder" to read a binary 16 bit image? I tried doing this: >> import Image >> data =3D open('binary_file').read() #string buffer with data >> size =3D (256 256) #this is really its size >> mode =3D 'F;16' >> image =3D Image.fromstrin(mode,size,data,"raw") Python tells me this mode (F;16) does not exist. So, wich mode must I use= for=20 16 bit images? Could somebody help me? thanks, Mauricio Inforcati From aureli@ipk.fhg.de Tue Aug 6 10:03:38 2002 From: aureli@ipk.fhg.de (Aureli Soria Frisch) Date: Tue, 6 Aug 2002 11:03:38 +0200 Subject: [Image-SIG] Reading 16bit image In-Reply-To: <200208051650.33685.mauricio.inforcati@cenpra.gov.br> References: <200208051650.33685.mauricio.inforcati@cenpra.gov.br> Message-ID: >how can I use the "raw decoder" to read a binary 16 bit image? >I tried doing this: > >>> import Image >>> data = open('binary_file').read() #string buffer with data >>> size = (256 256) #this is really its size >>> mode = 'F;16' >>> image = Image.fromstrin(mode,size,data,"raw") > >Python tells me this mode (F;16) does not exist. So, wich mode must I use for >16 bit images? >Could somebody help me? I submitted a while ago a question related to the possibility of opening TIF files with 16 bit depth that remained with no answer... It would be interesting to know how to work with 16 bit files in PIL in general (it does not seem to be possible with the open source version of PIL)... Thanks, Aureli -- ################################# Aureli Soria Frisch Fraunhofer IPK Dept. Pattern Recognition post: Pascalstr. 8-9, 10587 Berlin, Germany e-mail: aureli@ipk.fhg.de fon: +49 30 39006-143 fax: +49 30 3917517 web: http://vision.fhg.de/~aureli/web-aureli_en.html ################################# From volkmer@mpi-cbg.de Fri Aug 9 10:36:11 2002 From: volkmer@mpi-cbg.de (Michael Volkmer) Date: Fri, 09 Aug 2002 11:36:11 +0200 Subject: [Image-SIG] Reading 16bit image References: <200208051650.33685.mauricio.inforcati@cenpra.gov.br> Message-ID: <3D538D0B.2060701@mpi-cbg.de> I use PIL 1.1.3 to read uncompressed 16 bit TIFF images. LZW compressed tiffs doesn't work for me. PIL uses the "I,16" mode in the default Image.open(). I addition I added the following line to the TiffImagePlugin.py OPEN_INFO : (1, 1, (16,), ()): ("I;16", "I;16") I'm not shure if this is really needed. Most of the PIL functions doesn't seem to work in this mode so I converted the Image to 32bit with im = Image.open().convert("I") in order to access the image data with putpixel()/getpixel() at least. M. Volkmer Am 08/06/2002 11:03 AM, Aureli Soria Frisch schrieb: > >> how can I use the "raw decoder" to read a binary 16 bit image? >> I tried doing this: >> >>>> import Image >>>> data = open('binary_file').read() #string buffer with data >>>> size = (256 256) #this is really its size >>>> mode = 'F;16' >>>> image = Image.fromstrin(mode,size,data,"raw") >>> >> >> Python tells me this mode (F;16) does not exist. So, wich mode must I >> use for >> 16 bit images? >> Could somebody help me? > > > I submitted a while ago a question related to the possibility of > opening TIF files with 16 bit depth that remained with no answer... > > It would be interesting to know how to work with 16 bit files in PIL > in general (it does not seem to be possible with the open source > version of PIL)... > > Thanks, > Aureli From rtrocca@libero.it Fri Aug 9 16:08:21 2002 From: rtrocca@libero.it (Riccardo Trocca) Date: Fri, 09 Aug 2002 17:08:21 +0200 Subject: [Image-SIG] built installer for PIL 1.1.3 for python2.2 on win32 Message-ID: <3D53DAE5.6080103@libero.it> Well, the title says it all. If somebody is interested, you can find it at: http://spazioinwind.libero.it/trikachu/Python_Image_Processing.html Riccardo From anthra.norell@bluewin.ch Fri Aug 9 16:17:41 2002 From: anthra.norell@bluewin.ch (Frederic Rentsch) Date: Fri, 09 Aug 2002 17:17:41 +0200 Subject: [Image-SIG] Importing and reloading Message-ID: <3D53DD15.2000607@bluewin.ch> Who knows where ImageOps is? The manual explains it, but if I say "import ImageOps" it says "ImportError: No module named ImageOps". The downloading references name packages, not their contents. I am using the library for Windows. And a more general question. "import MODULE" doesn't work for modules being developed. The formula for a forced import is "reload (MODULE)". I haven't found an equivalent reloading alternative to "from MODULE import .". Running modules under construction being such a prevalent mode of operation., there just has to be a trick. Frederic From rtrocca@libero.it Fri Aug 9 16:21:35 2002 From: rtrocca@libero.it (Riccardo Trocca) Date: Fri, 09 Aug 2002 17:21:35 +0200 Subject: [Image-SIG] built installer for PIL 1.1.3 for python2.2 on win32 CORRECTION Message-ID: <3D53DDFF.7040005@libero.it> Sorry, I was in a hurry... The right URL is: http://spazioinwind.libero.it/rtrocca/Python_Image_Processing.html Anyway I use this mail to say that it is just my first attempt at building it and I've used a old tifflib I had. I'd like to receive suggestions and I'll revuild it with a new tiflib. Futhermore I hope that next week I'll be able to upload some modules I made that allows python to read AVI files, QuickTime movies and frames from a framegrabber. Riccardo From klimek@grc.nasa.gov Fri Aug 9 18:19:06 2002 From: klimek@grc.nasa.gov (Bob Klimek) Date: Fri, 09 Aug 2002 13:19:06 -0400 Subject: Fwd: Re: [Image-SIG] Reading 16bit image Message-ID: <4.2.2.20020809131415.00aa0198@parrot.grc.nasa.gov> I've managed to read in a 16-bit TIFF image in the following way. I don't know if it will work for all 16-bit images but here it goes. It read 16-bit images save by a package called IMAP. imgDir = '/home/klimek/Images/16-bit' inFile = os.path.abspath(os.path.join(imgDir, '16-bit-IMAP.tif')) f = open(inFile, 'rb') allData = f.read() f.close() offset = 8 # this was determined from "StripOffsets" tag by reading an 8-bit IMAP image data = allData[offset : 1024*1024*16/8+offset] # 16-bit saved by IMAP im = Image.fromstring("F", (1024,1024), data, "raw", "F;16", 0,1) pix1 = im.getpixel((50,50)) pix2 = im.getpixel((500,300)) print pix1, pix2 Bob >Date: Fri, 09 Aug 2002 11:36:11 +0200 > >I use PIL 1.1.3 to read uncompressed 16 bit TIFF images. LZW compressed >tiffs doesn't work for me. >PIL uses the "I,16" mode in the default Image.open(). I addition I added >the following line to the TiffImagePlugin.py OPEN_INFO : > >(1, 1, (16,), ()): ("I;16", "I;16") >I'm not shure if this is really needed. > >Most of the PIL functions doesn't seem to work in this mode so I >converted the Image to 32bit with >im = Image.open().convert("I") in order to access the image data >with putpixel()/getpixel() at least. > >M. Volkmer > >Am 08/06/2002 11:03 AM, Aureli Soria Frisch schrieb: > >> >>>how can I use the "raw decoder" to read a binary 16 bit image? >>>I tried doing this: >>> >>>>> import Image >>>>> data = open('binary_file').read() #string buffer with data >>>>> size = (256 256) #this is really its size >>>>> mode = 'F;16' >>>>> image = Image.fromstrin(mode,size,data,"raw") >>> >>>Python tells me this mode (F;16) does not exist. So, wich mode must I >>>use for >>>16 bit images? >>>Could somebody help me? >> >> >>I submitted a while ago a question related to the possibility of opening >>TIF files with 16 bit depth that remained with no answer... >> >>It would be interesting to know how to work with 16 bit files in PIL in >>general (it does not seem to be possible with the open source version of >>PIL)... >> >>Thanks, >>Aureli > > > > > >_______________________________________________ >Image-SIG maillist - Image-SIG@python.org >http://mail.python.org/mailman/listinfo/image-sig From tim@tp-software.com Sun Aug 11 23:28:40 2002 From: tim@tp-software.com (Tim Penhey) Date: Sun, 11 Aug 2002 23:28:40 +0100 Subject: [Image-SIG] PIL 1.1.3 and Python 2.2.1 on Win2k Message-ID: I am attempting to build PIL 1.1.3 on Win2k, and having a few problems. I grabbed the zlib win32 binaries, and built the jpeg libs. However I don't have tcl/tk installed except for what came with the Python 2.2.1 from python.org for Windows. The PIL code requires tk.h. Can someone point me in the direction of what else I am going to need to build it? I will provide the resulting binaries if desired, or a VC++ project file. Thanks, Tim From hassan@dotfunk.com Mon Aug 12 19:14:32 2002 From: hassan@dotfunk.com (Scott Hassan) Date: Mon, 12 Aug 2002 11:14:32 -0700 (PDT) Subject: [Image-SIG] PIL: Image.py: blend function Message-ID: <15703.64264.108489.6753@blue.dotfunk.com> Why does the new PIL 1.1.3 blend function limit the range of alpha in the positive? When this is limited, you cannot brighten an Image...only darken it. Verion 1.1.1 works differently. I changed the line "elif alpha >= 1.0:" to read "elif alpha == 1.0:" and everything works now. Scott ----------------------------------------------------------------------------- def blend(im1, im2, alpha): "Interpolate between images." if alpha <= 0.0: return im1 elif alpha >= 1.0: return im2 im1.load() im2.load() return im1._new(core.blend(im1.im, im2.im, alpha)) From shichang@icubed.com Tue Aug 13 01:18:49 2002 From: shichang@icubed.com (icubed) Date: Mon, 12 Aug 2002 17:18:49 -0700 Subject: [Image-SIG] Error in compiling PIL using VC 6 - Message-ID: hi, all When i try to compile latest PIL using VC6, I got the following error: Dibc. .... error C2632: 'int' followed by 'int' is illegal How to solve this problem? Thanks. shichang From bh@intevation.de Tue Aug 13 09:59:57 2002 From: bh@intevation.de (Bernhard Herzog) Date: 13 Aug 2002 10:59:57 +0200 Subject: [Image-SIG] Error in compiling PIL using VC 6 - In-Reply-To: References: Message-ID: <6qr8h3rv5e.fsf@thetis.intevation.de> "icubed" writes: > hi, all > When i try to compile latest PIL using VC6, I got the following error: > > Dibc. > .... error C2632: 'int' followed by 'int' is illegal > > How to solve this problem? I'm not sure if it was exactly the same error, but fixed it by including basetsd.h before Imaging.h in the files where it was a problem. The comment I put into the files reads: /* include this under windows because it defines INT32 and UINT32 as * typedefs which won't work if it's included after ImPlatform.h which * contains preprocessor macros with those names */ #include Bernhard -- Intevation GmbH http://intevation.de/ Sketch http://sketch.sourceforge.net/ MapIt! http://www.mapit.de/ From dahn@llnl.gov Wed Aug 14 19:56:34 2002 From: dahn@llnl.gov (Dong H. Ahn) Date: Wed, 14 Aug 2002 11:56:34 -0700 Subject: [Image-SIG] Python2.2 and PIL1.1.3 Message-ID: <5.0.0.25.2.20020814115100.02fdb220@mail-lc.llnl.gov> Hi all, I'm trying to install PIL1.1.3 for Python 2.2.1 in Irix and Tru64 platforms. It seemed to compile and install well, but it complained as follows when I was trying to use it with script files provided under Scripts (e.g. viewer.py): /usr/apps/python/opt/lib/python2.2/site-packages/PIL/Image.py:53: RuntimeWarning: Python C API version mismatch for module _imaging: This Python has API version 1011, module _imaging has version 1010. import _imaging /usr/apps/python/opt/lib/python2.2/site-packages/PIL/ImageTk.py:123: RuntimeWarning: Python C API version mismatch for module _imagingtk: This Python has API version 1011, module _imagingtk has version 1010. After this complaints, everything appears to work well. Does anyone know how to address this complaints? Best, -Dong Ahn --.--; Dong Hyuk Ahn Development Environment Group Lawrence Livermore National Laboratory T3520, Room 1145, L-550 925-422-1939 From fredrik@pythonware.com Wed Aug 14 21:13:19 2002 From: fredrik@pythonware.com (Fredrik Lundh) Date: Wed, 14 Aug 2002 22:13:19 +0200 Subject: [Image-SIG] Python2.2 and PIL1.1.3 References: <5.0.0.25.2.20020814115100.02fdb220@mail-lc.llnl.gov> Message-ID: <00e901c243cf$0a7a8c90$ced241d5@hagrid> Dong H. Ahn wrote: > /usr/apps/python/opt/lib/python2.2/site-packages/PIL/Image.py:53: > RuntimeWarning: Python C API version mismatch for module _imaging: This > Python has API version 1011, module _imaging has version 1010. > import _imaging > /usr/apps/python/opt/lib/python2.2/site-packages/PIL/ImageTk.py:123: > RuntimeWarning: Python C API version mismatch for module _imagingtk: This > Python has API version 1011, module _imagingtk has version 1010. this means that you've built the library using include files for Python 2.1, but are running them with a 2.2 interpreter. one common reason is that you had a 2.1 interpreter installed as "python" when you ran the build file. From jpablo@kan.ajusco.upn.mx Thu Aug 15 23:37:24 2002 From: jpablo@kan.ajusco.upn.mx (Juan Pablo Romero) Date: 15 Aug 2002 17:37:24 -0500 Subject: [Image-SIG] printing under windows Message-ID: <1029451044.7753.19.camel@kan.ajusco.upn.mx> Hi all! I'm building a little app using tkinter/windows; it draws something on the screen and possible prints it. Right now I'm using Tkinter.Canvas. My questions is: There exist some way to print canvas content in windows (without exporting to postscript)? I realize that I could do the drawings using PIL and then save the images in several formats; but I'd like to use something like a metafile. Thanks in advance. Juan Pablo From Schutte@fel.tno.nl Sat Aug 17 10:23:13 2002 From: Schutte@fel.tno.nl (Klamer Schutte) Date: Sat, 17 Aug 2002 11:23:13 +0200 Subject: [Image-SIG] Reading 16bit image References: <200208051650.33685.mauricio.inforcati@cenpra.gov.br> Message-ID: <3D5E1601.94ECE332@fel.tno.nl> Aureli, All over the PIL source there seem to be hooks for 16 bit TIFF support. I hacked the code a while ago to have it working to my needs (reading 16 bit usigned int tiffs) and it sort of worked (arithmetic not defined on 16 bits, so casting to 32 bit / float needed). If you really are interested I will dust it off and package it so you can use it as well. Klamer Aureli Soria Frisch wrote: > > >how can I use the "raw decoder" to read a binary 16 bit image? > >I tried doing this: > > > >>> import Image > >>> data = open('binary_file').read() #string buffer with data > >>> size = (256 256) #this is really its size > >>> mode = 'F;16' > >>> image = Image.fromstrin(mode,size,data,"raw") > > > >Python tells me this mode (F;16) does not exist. So, wich mode must I use for > >16 bit images? > >Could somebody help me? > > I submitted a while ago a question related to the possibility of > opening TIF files with 16 bit depth that remained with no answer... > > It would be interesting to know how to work with 16 bit files in PIL > in general (it does not seem to be possible with the open source > version of PIL)... > > Thanks, > Aureli > -- > ################################# > Aureli Soria Frisch > Fraunhofer IPK > Dept. Pattern Recognition > > post: Pascalstr. 8-9, 10587 Berlin, Germany > e-mail: aureli@ipk.fhg.de > fon: +49 30 39006-143 > fax: +49 30 3917517 > web: http://vision.fhg.de/~aureli/web-aureli_en.html > ################################# > > _______________________________________________ > Image-SIG maillist - Image-SIG@python.org > http://mail.python.org/mailman/listinfo/image-sig From peter@redrockmanage.com Tue Aug 20 15:06:58 2002 From: peter@redrockmanage.com (Peter Dyson) Date: Wed, 21 Aug 2002 00:06:58 +1000 Subject: [Image-SIG] re: resize filter types Message-ID: <3D624D02.8060008@redrockmanage.com> Hi, I see the imaging lib has 3 different resize filters - nearest, bilinear and bicubic. Are there any plans for a fractal interpolation filter as demonstrated here: http://www.dpreview.com/learn/Glossary/Digital_Imaging/Interpolation_01.htm Any comments are appreciated. -- regards, Peter Dyson peter@redrockmanage.com ICQ: 9839053 From jh@comunit.de Tue Aug 20 14:47:27 2002 From: jh@comunit.de (Janko Hauser) Date: Tue, 20 Aug 2002 15:47:27 +0200 Subject: [Image-SIG] re: resize filter types References: <3D624D02.8060008@redrockmanage.com> Message-ID: <3D62486F.7040807@comunit.de> This is a multi-part message in MIME format. --------------010303090507090205050101 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Peter Dyson wrote: > Hi, > > I see the imaging lib has 3 different resize filters - nearest, > bilinear and bicubic. Are there any plans for a fractal interpolation > filter as demonstrated here: > http://www.dpreview.com/learn/Glossary/Digital_Imaging/Interpolation_01.htm > > > Any comments are appreciated. The newest version of PIL has also an antialiasing filter, which gives very good results. An example is attached, it's not as good as the fractal filter mentioned there, but a lot better than the bicubic filter and a lot smaller than the fractal jpg :-) HTH, __Janko --------------010303090507090205050101 Content-Type: image/jpeg; name="tmp.jpg" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="tmp.jpg" /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwh MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAAR CAC0Ad0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDjXmGKjZww4pGjbHNR4INecexZId0qCaQG nSbtpqoSSeaaRLGbdxq7DGcCqwxTxMV71VxIsOhFRihZDJ3pXBWkkDYuw4zUTuBxTWmPQGqj s+TzTsJsnPzNViEYFVI5VH3ql+1IOhpiuW3HFVnQmgXIYdaYZc1OoCeWSaQ/L1qQOMUx8Hmn qDY0yCkEgJpMUJGSadhEqyAU4SjNTRWxbtUyWWWxinYZB5gIqF+TWqtgf7tXbXSPMYZWlYfN YwooGzmrIyBjFdpbaJEqjdHVn+yLPHMfNHIhOocOlyE4Ip325Aw4rp59EiMhKx8VSuNBJUlE o5A50UYdSjXtVuPUo24xVKPTXifEi960RoszIGRetRyD5kPF6gGaY16jDpSjRrrGNtH9jXIO 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 KKliRqxj5akTrRRTBFuPmriqNo4ooqOoH//Z --------------010303090507090205050101-- From wcc@wolfgangs.com Wed Aug 21 22:55:31 2002 From: wcc@wolfgangs.com (Wolfgang Schorer) Date: Wed, 21 Aug 2002 16:55:31 -0500 Subject: [Image-SIG] Decorder error -2 Message-ID: <20020821165531.5d5c393d.wcc@wolfgangs.com> I installed PIL (apparently with no errors). Now, when I want to read an jpg-file in Python, I always get the error: decoder error -2 when reading file The opening of the file works fine; it reads the header. Any hints? Thanks in advance. Wolf From sfaulconer@cfl.rr.com Thu Aug 22 04:29:11 2002 From: sfaulconer@cfl.rr.com (Steven Faulconer) Date: Wed, 21 Aug 2002 22:29:11 -0500 Subject: [Image-SIG] 'Compile' problem Message-ID: <3D645A87.7000603@cfl.rr.com> Hello everyone, I'm just getting started in learning python, and since most of my normal work involves image manipulation, I thought I would give the PIL a run through. I'm having a bit of difficulty getting it installed properly. Quick specs: Linux (Crux 0.9.3) Tcl/Tk 8.4b1 Python 2.2.1 (installed and working ok) GCC 2.95.3 I've compiled the Imaging core library (libImaging.a) without a problem, I then run 'python setup.py build' and I get the following error: ------ gcc -DNDEBUG -O3 -Wall -Wstrict-prototypes -fPIC -IlibImaging -I/usr/include/python2.2 -c _imagingtk.c -o build/temp.linux-i686-2.2/_imagingtk.o -O2 -march=i686 -pipe gcc -DNDEBUG -O3 -Wall -Wstrict-prototypes -fPIC -IlibImaging -I/usr/include/python2.2 -c Tk/tkImaging.c -o build/temp.linux-i686-2.2/tkImaging.o -O2 -march=i686 -pipe Tk/tkImaging.c: In function `PyImagingPhoto': Tk/tkImaging.c:165: too few arguments to function `Tk_PhotoPutBlock' Tk/tkImaging.c:175: too few arguments to function `Tk_PhotoPutBlock' Tk/tkImaging.c:182: too few arguments to function `Tk_PhotoPutBlock' error: command 'gcc' failed with exit status 1 ------ Attempting to build the modules by hand (make -f Makefile.pre.in boot;make) gets the same message. Obviously, I've got something misconfigured/broke. I understand the error message ok, just not quite sure how to resolve it. Does PIL not support Tcl/Tk 8.4? Thanks for any information you can send. Steven From joshjunk@pacbell.net Thu Aug 22 09:15:31 2002 From: joshjunk@pacbell.net (Josh Levenberg) Date: Thu, 22 Aug 2002 01:15:31 -0700 Subject: [Image-SIG] PILdriver Message-ID: <3D649DA3.9090601@pacbell.net> This is a multi-part message in MIME format. --Boundary_(ID_KzB0J+GTafxUWrQENTWj1w) Content-type: text/plain; charset=us-ascii; format=flowed Content-transfer-encoding: 7BIT I've been playing with the PILdriver recently, and have made some enhancements and bug fixes. Ported to newer PIL 1.1.3 (resize, offset) Added autocontrast, ..., solarize from ImageOps Also resize2 with a specified method Added help facility to print usage (I can get rid of Python 2-isms if needed (startswith, endswith, list comprehensions, string methods)) Fixed bug in image attribute functions (pop->do_pop) Fixed bug in paste (paste does not return an image, so None ended up on the stack) Corrected usage for ImageEnhance functions, plus other minor usage fixups I've attached the modified version. Please CC me in discussions as I'm not subscribed to this list. -- Josh Levenberg --Boundary_(ID_KzB0J+GTafxUWrQENTWj1w) Content-type: text/plain; name=pildriverJ.py Content-transfer-encoding: 7BIT Content-disposition: inline; filename=pildriverJ.py #!/usr/bin/env python """PILdriver, an image-processing calculator using PIL. An instance of class PILDriver is essentially a software stack machine (Polish-notation interpreter) for sequencing PIL image transformations. The state of the instance is the interpreter stack. The only method one will normally invoke after initialization is the `execute' method. This takes an argument list of tokens, pushes them onto the instance's stack, and then tries to clear the stack by successive evaluation of PILdriver operators. Any part of the stack not cleaned off persists and is part of the evaluation context for the next call of the execute method. PILDriver doesn't catch any exceptions, on the theory that these are actually diagnostic information that should be interpreted by the calling code. When called as a script, the command-line arguments are passed to a PILDriver instance. If there are no command-line arguments, the module runs an interactive interpreter, each line of which is split into space-separated tokens and passed to the execute method. In the method descriptions below, a first line beginning with the string `usage:' means this method can be invoked with the token that follows it. Following <>-enclosed arguments describe how the method interprets the entries on the stack. Each argument specification begins with a type specification: either `int', `float', `string', or `image'. All operations consume their arguments off the stack (use `dup' to keep copies around). Use `verbose 1' to see the stack state displayed before each operation. Usage examples: `show crop 0 0 200 300 open test.png' loads test.png, crops out a portion of its upper-left-hand corner and displays the cropped portion. `save rotated.png rotate 30 open test.tiff' loads test.tiff, rotates it 30 degrees, and saves the result as rotated.png (in PNG format). Update August 21, 2002: Ported to newer PIL 1.1.3 (resize, offset) Added autocontrast, ..., solarize from ImageOps Also resize2 with a specified method Added help facility to print usage (I can get rid of Python 2-isms if needed (startswith, endswith, list comprehensions, string methods)) Fixed bug in image attribute functions (pop->do_pop) Fixed bug in paste (paste does not return an image, so None ended up on the stack) Corrected usage for ImageEnhance functions, plus other minor usage fixups -- Josh Levenberg """ # by Eric S. Raymond # $Id: //modules/pil/Scripts/pildriver.py#3 $ # TO DO: # 1. Add PILFont capabilities, once that's documented. # 2. Add PILDraw operations. # 3. Add support for composing and decomposing multiple-image files. # import Image, string class PILDriver: verbose = 0 def do_verbose(self): """usage: verbose Set verbosity flag from top of stack. """ self.verbose = self.do_pop() # The evaluation stack (internal only) stack = [] # Stack of pending operations def push(self, item): "Push an argument onto the evaluation stack." self.stack = [item] + self.stack def top(self): "Return the top-of-stack element." return self.stack[0] # Stack manipulation (callable) def do_clear(self): """usage: clear Clear the stack. """ self.stack = [] def do_pop(self): """usage: pop Discard the top element on the stack. """ top = self.stack[0] self.stack = self.stack[1:] return top def do_dup(self): """usage: dup Duplicate the top-of-stack item. """ if hasattr(self, 'format'): # If it's an image, do a real copy dup = self.stack[0].copy() else: dup = self.stack[0] self.stack = [dup] + self.stack def do_swap(self): """usage: swap Swap the top-of-stack item with the next one down. """ self.stack = [self.stack[1], self.stack[0]] + self.stack[2:] # Image module functions (callable) def do_new(self): """usage: new Create and push a greyscale image of given size and color. """ xsize = int(self.do_pop()) ysize = int(self.do_pop()) color = int(self.do_pop()) self.push(Image.new("L", (xsize, ysize), color)) def do_open(self): """usage: open Open the indicated image, read it, push the image on the stack. """ self.push(Image.open(self.do_pop())) def do_blend(self): """usage: blend Replace two images and an alpha with the blended image. """ image1 = self.do_pop() image2 = self.do_pop() alpha = float(self.do_pop()) self.push(Image.blend(image1, image2, alpha)) def do_composite(self): """usage: composite Replace two images and a mask with their composite. """ image1 = self.do_pop() image2 = self.do_pop() mask = self.do_pop() self.push(Image.composite(image1, image2, mask)) def do_merge(self): """usage: merge [ [ []]] Merge top-of stack images in a way described by the mode. """ mode = self.do_pop() bandlist = [] for band in mode: bandlist.append(self.do_pop()) self.push(Image.merge(mode, bandlist)) # Image class methods def do_convert(self): """usage: convert Convert the top image to the given mode. """ mode = self.do_pop() image = self.do_pop() self.push(image.convert(mode)) def do_copy(self): """usage: copy Make and push a true copy of the top image. """ self.dup() def do_crop(self): """usage: crop Crop and push a rectangular region from the current image. """ left = int(self.do_pop()) upper = int(self.do_pop()) right = int(self.do_pop()) lower = int(self.do_pop()) image = self.do_pop() self.push(image.crop((left, upper, right, lower))) def do_draft(self): """usage: draft Configure the loader for a given mode and size. """ mode = self.do_pop() xsize = int(self.do_pop()) ysize = int(self.do_pop()) self.push(self.draft(mode, (xsize, ysize))) def do_filter(self): """usage: filter Process the top image with the given filter. """ import ImageFilter filter = eval("ImageFilter." + string.upper(self.do_pop())) image = self.do_pop() self.push(image.filter(filter)) def do_getbbox(self): """usage: getbbox Push left, upper, right, and lower pixel coordinates of the top image. """ bounding_box = self.do_pop().getbbox() self.push(bounding_box[3]) self.push(bounding_box[2]) self.push(bounding_box[1]) self.push(bounding_box[0]) def do_getextrema(self): """usage: extrema Push minimum and maximum pixel values of the top image. """ extrema = self.do_pop().extrema() self.push(extrema[1]) self.push(extrema[0]) def do_paste(self): """usage: paste Paste figure image into ground with upper left at given offsets. """ figure = self.do_pop() xoff = int(self.do_pop()) yoff = int(self.do_pop()) ground = self.do_pop() if figure.mode == "RGBA": ground.paste(figure, (xoff, yoff), figure) else: ground.paste(figure, (xoff, yoff)) self.push(ground) def do_resize(self): """usage: resize Resize the top image. """ xsize = int(self.do_pop()) ysize = int(self.do_pop()) image = self.do_pop() self.push(image.resize((xsize, ysize))) def do_resize2(self): """usage: resize2 Resize the top image. Method can be one of: nearest, bilinear, bicubic, antialias. """ xsize = int(self.do_pop()) ysize = int(self.do_pop()) method = eval("Image." + string.upper(self.do_pop())) image = self.do_pop() self.push(image.resize((xsize, ysize), method)) def do_rotate(self): """usage: rotate Rotate image through a given angle """ angle = int(self.do_pop()) image = self.do_pop() self.push(image.rotate(angle)) def do_save(self): """usage: save Save image with default options. """ filename = self.do_pop() image = self.do_pop() image.save(filename) def do_save2(self): """usage: save2 Save image with specified options. """ filename = self.do_pop() options = self.do_pop() image = self.do_pop() image.save(filename, None, options) def do_show(self): """usage: show Display and pop the top image. """ self.do_pop().show() def do_thumbnail(self): """usage: thumbnail Modify the top image in the stack to contain a thumbnail of itself. """ ysize = int(self.do_pop()) xsize = int(self.do_pop()) self.top().thumbnail((xsize, ysize)) def do_transpose(self): """usage: transpose Transpose the top image. """ transpose = string.upper(self.do_pop()) image = self.do_pop() self.push(image.transpose(transpose)) # Image attributes def do_format(self): """usage: format Push the format of the top image onto the stack. """ self.push(self.do_pop().format) def do_mode(self): """usage: mode Push the mode of the top image onto the stack. """ self.push(self.do_pop().mode) def do_size(self): """usage: size Push the image size on the stack as (x, y). """ size = self.do_pop().size self.push(size[1]) self.push(size[0]) # ImageChops operations def do_invert(self): """usage: invert Invert the top image. """ import ImageChops self.push(ImageChops.invert(self.do_pop())) def do_lighter(self): """usage: lighter Pop the two top images, push an image of the lighter pixels of both. """ import ImageChops image1 = self.do_pop() image2 = self.do_pop() self.push(ImageChops.lighter(image1, image2)) def do_darker(self): """usage: darker Pop the two top images, push an image of the darker pixels of both. """ import ImageChops image1 = self.do_pop() image2 = self.do_pop() self.push(ImageChops.darker(image1, image2)) def do_difference(self): """usage: difference Pop the two top images, push the difference image """ import ImageChops image1 = self.do_pop() image2 = self.do_pop() self.push(ImageChops.difference(image1, image2)) def do_multiply(self): """usage: multiply Pop the two top images, push the multiplication image. """ import ImageChops image1 = self.do_pop() image2 = self.do_pop() self.push(ImageChops.multiply(image1, image2)) def do_offset(self): """usage: offset Offset the pixels in the top image. """ import ImageChops xoff = int(self.do_pop()) yoff = int(self.do_pop()) image = self.do_pop() self.push(ImageChops.offset(image, xoff, yoff)) def do_screen(self): """usage: screen Pop the two top images, superimpose their inverted versions. """ import ImageChops image2 = self.do_pop() image1 = self.do_pop() self.push(ImageChops.screen(image1, image2)) def do_add(self): """usage: add Pop the two top images, produce the scaled sum with offset. """ import ImageChops image1 = self.do_pop() image2 = self.do_pop() scale = float(self.do_pop()) offset = int(self.do_pop()) self.push(ImageChops.add(image1, image2, scale, offset)) def do_subtract(self): """usage: subtract Pop the two top images, produce the scaled difference with offset. """ import ImageChops image1 = self.do_pop() image2 = self.do_pop() scale = float(self.do_pop()) offset = int(self.do_pop()) self.push(ImageChops.subtract(image1, image2, scale, offset)) # ImageEnhance classes def do_color(self): """usage: color Enhance color in the top image. """ import ImageEnhance factor = float(self.do_pop()) image = self.do_pop() enhancer = ImageEnhance.Color(image) self.push(enhancer.enhance(factor)) def do_contrast(self): """usage: contrast Enhance contrast in the top image. """ import ImageEnhance factor = float(self.do_pop()) image = self.do_pop() enhancer = ImageEnhance.Color(image) self.push(enhancer.enhance(factor)) def do_brightness(self): """usage: brightness Enhance brightness in the top image. """ import ImageEnhance factor = float(self.do_pop()) image = self.do_pop() enhancer = ImageEnhance.Color(image) self.push(enhancer.enhance(factor)) def do_sharpness(self): """usage: sharpness Enhance sharpness in the top image. """ import ImageEnhance factor = float(self.do_pop()) image = self.do_pop() enhancer = ImageEnhance.Color(image) self.push(enhancer.enhance(factor)) # ImageOps functions def do_autocontrast(self): """usage: autocontrast Maximize image contrast. Remaps the image so that the darkest pixel becomes black (0), and the lightest becomes white (255). """ import ImageOps image = self.do_pop() self.push(ImageOps.autocontrast(image)) def do_autocontrast2(self): """usage: autocontrast2 Maximize image contrast. Calculates a histogram of the input image, removes cutoff percent of the lightest and darkest pixels from the histogram, and remaps the image so that the darkest pixel becomes black (0), and the lightest becomes white (255). """ import ImageOps cutoff = float(self.do_pop()) image = self.do_pop() self.push(ImageOps.autocontrast(image, cutoff)) def do_colorize(self): """usage: colorize Colorize grayscale image. This function calculates a colour wedge mapping all black pixels in the source image to the (k_r, k_g, k_b), and all white pixels to (w_r, w_g, w_b). """ import ImageOps k_r = int(self.do_pop()) k_g = int(self.do_pop()) k_b = int(self.do_pop()) w_r = int(self.do_pop()) w_g = int(self.do_pop()) w_b = int(self.do_pop()) image = self.do_pop() self.push(ImageOps.colorize(image, (k_r, k_g, k_b), (w_r, w_g, w_b))) def do_cropall(self): """usage: cropall Remove border pixels from all four edges. """ import ImageOps border = int(self.do_pop()) image = self.do_pop() self.push(ImageOps.crop(image, border)) def do_equalize(self): """usage: equalize Equalize the image histogram. This function applies a non-linear mapping to the input image, in order to create a uniform distribution of grayscale values in the output image. """ import ImageOps image = self.do_pop() self.push(ImageOps.equalize(image)) def do_fit(self): """usage: fit Returns a sized and cropped version of the image, cropped to the requested aspect ratio and size. The (wid,hi) argument is the requested output size in pixels. The method argument is what resampling method to use: one of nearest, bilinear, bicubic, antialias. The bleed argument allows you to remove a border around the outside the image (from all four edges). The value is a decimal percentage (use 0.01 for one percent). The value 0 is no border. The centering argument is used to control the cropping position. (0.5, 0.5) is center cropping (i.e. if cropping the width, take 50% off of the left side (and therefore 50% off the right side), and same with top/bottom). (0.0, 0.0) will crop from the top left corner (i.e. if cropping the width, take all of the crop off of the right side, and if cropping the height, take all of it off the bottom). (1.0, 0.0) will crop from the bottom left corner, etc. (i.e. if cropping the width, take all of the crop off the left side, and if cropping the height take none from the top (and therefore all off the bottom)). """ import ImageOps width = int(self.do_pop()) height = int(self.do_pop()) method = eval("Image." + string.upper(self.do_pop())) bleed = float(self.do_pop()) image = self.do_pop() self.push(ImageOps.posterize(image, bits)) def do_posterize(self): """usage: posterize Reduce the number of bits for each colour channel. """ import ImageOps bits = int(self.do_pop()) image = self.do_pop() self.push(ImageOps.posterize(image, bits)) def do_solarize(self): """usage: solarize Invert all pixel values above the given threshold. """ import ImageOps threshold = int(self.do_pop()) image = self.do_pop() self.push(ImageOps.solarize(image, threshold)) # help/usage facillity def do_help(self): """usage: help Gives a list of commands. """ command_list = [ key[3:] for key in self.__class__.__dict__.keys() if key.startswith('do_') ] command_list.sort() print '''Try 'usage "command"' where command is one of:''' print ', '.join(command_list) def do_usage(self): """usage: usage "" Give usage for command. Command should be enclosed in quotes. """ command=self.do_pop() if command.endswith('"'): command=command[:-1] if command.endswith("'"): command=command[:-1] if command.startswith('"'): command=command[1:] if command.startswith("'"): command=command[1:] funcname = "do_"+command if hasattr(self, funcname): print getattr(self, funcname).__doc__ else: print "Unrecognized command",command # The interpreter loop def execute(self, list): "Interpret a list of PILDriver commands." list.reverse() while len(list) > 0: self.push(list[0]) list = list[1:] if self.verbose: print "Stack: " + `self.stack` top = self.top() if type(top) != type(""): continue; funcname = "do_" + top if not hasattr(self, funcname): continue else: self.do_pop() func = getattr(self, funcname) func() if __name__ == '__main__': import sys try: import readline except ImportError: pass # not available on all platforms # If we see command-line arguments, interpret them as a stack state # and execute. Otherwise go interactive. driver = PILDriver() if len(sys.argv[1:]) > 0: driver.execute(sys.argv[1:]) else: print "PILDriver says hello." while 1: try: line = raw_input('pildriver> '); except EOFError: print "\nPILDriver says goodbye." break driver.execute(string.split(line)) print driver.stack # The following sets edit modes for GNU EMACS # Local Variables: # mode:python # End: --Boundary_(ID_KzB0J+GTafxUWrQENTWj1w)-- From joshjunk@pacbell.net Thu Aug 22 09:18:22 2002 From: joshjunk@pacbell.net (Josh Levenberg) Date: Thu, 22 Aug 2002 01:18:22 -0700 Subject: [Image-SIG] Bug in ImageOps.equalize Message-ID: <3D649E4E.70606@pacbell.net> It complains about "operator.add" if you run equalize on an image. Fix is simple: add "import operator" to the top of the file "ImageOps.py", or to just the function equalize. -- Josh Levenberg From joshjunk@pacbell.net Thu Aug 22 09:23:12 2002 From: joshjunk@pacbell.net (Josh Levenberg) Date: Thu, 22 Aug 2002 01:23:12 -0700 Subject: [Image-SIG] Feature request: Median filter Message-ID: <3D649F70.9070903@pacbell.net> I've tried several python implementations of a median filter. So far my fastest (included below) is still quite slow (it takes minutes rather than seconds). Is there a way of speeding this up? Is there going to be a median filter included in future versions of PIL? Thanks! def MedianOnString(imstr, imsize, kernelsize): (width,height) = imsize rows=[imstr[row*width:(row+1)*width] for row in range(height)] retrows=['']*height for x in range(width): sys.stdout.write('.') mnx = max(x-kernelsize, 0) mxx = min(x+kernelsize+1, width) window=[] for y in range(min(kernelsize+1, height)): window.append(rows[y][mnx:mxx]) for y in range(height): if y>kernelsize: # remove first row from window del window[0] if y+kernelsize <3D5E1601.94ECE332@fel.tno.nl> Message-ID: <3D640101.D4CA72B0@fel.tno.nl> This is a multi-part message in MIME format. --------------76AC3200840C968C229A5F70 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit With regard to 16 bit TIFF support: Please find attached - diffs for Imaging-1.1.3 - changes sources of Imaging-1.1.3 The changes sources are for when you don't have/know patch; in that caes just replace the source files. Otherwise use patch; recompile and re-install Imaging-1.1.3. What is changed in the sources: - ability to read 16 bit unsigned TIFF files using Image.open - ability to use Image.show (by adding convert to 'L' mode (uint8)) - ability to use Image.getextrema and Image.point Image.show, Image.getextrema and Image.point all work similar to the 32 int cases; so something like: import Image im16 = Image.open('img.tif') min,max = im16.getextrema() scale = 255.0 / (max - min) offset = - min * scale im16c = im16.point(lambda i: i * scale + offset) im16c.show() will show a strechted image (sorry, typed from memory). Other PIL functions are not (yet ?) converted for 16 int use. Note that im16.convert('I') will give a 32 bit int image, which is better supported in PIL; or use im16c.convert('L') and have an 8 bit image. Feedback is appreciated! Klamer Schutte Schutte@fel.tno.nl Klamer Schutte wrote: > Aureli Soria Frisch wrote: > > I submitted a while ago a question related to the possibility of > > opening TIF files with 16 bit depth that remained with no answer... > > > > It would be interesting to know how to work with 16 bit files in PIL > > in general (it does not seem to be possible with the open source > > version of PIL)... --------------76AC3200840C968C229A5F70 Content-Type: text/plain; charset=us-ascii; name="diffs.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs.txt" diff -cr Imaging-1.1.3/PIL/Image.py Imaging-1.1.3-KS/PIL/Image.py *** Imaging-1.1.3/PIL/Image.py Thu Mar 14 20:55:04 2002 --- Imaging-1.1.3-KS/PIL/Image.py Wed Aug 21 22:09:57 2002 *************** *** 1,6 **** # # The Python Imaging Library. ! # $Id: //modules/pil/PIL/Image.py#17 $ # # the Image class wrapper # --- 1,6 ---- # # The Python Imaging Library. ! # $Id: Image.py,v 1.2 2002/08/21 20:09:19 klamer Exp $ # # the Image class wrapper # *************** *** 145,150 **** --- 145,151 ---- # official modes "1": ("L", "L", ("1",)), "L": ("L", "L", ("L",)), + "I;16" : ("L", "I;16", ("I;16",)), "I": ("L", "I", ("I",)), "F": ("L", "F", ("F",)), "P": ("RGB", "L", ("P",)), *************** *** 625,631 **** def point(self, lut, mode=None): "Map image through lookup table" ! if self.mode in ("I", "F"): # floating point; lut must be a valid expression scale, offset = _getscaleoffset(lut) self.load() --- 626,632 ---- def point(self, lut, mode=None): "Map image through lookup table" ! if self.mode in ("I", "I;16", "F"): # floating point; lut must be a valid expression scale, offset = _getscaleoffset(lut) self.load() diff -cr Imaging-1.1.3/PIL/TiffImagePlugin.py Imaging-1.1.3-KS/PIL/TiffImagePlugin.py *** Imaging-1.1.3/PIL/TiffImagePlugin.py Sun Mar 10 17:57:39 2002 --- Imaging-1.1.3-KS/PIL/TiffImagePlugin.py Wed Aug 21 22:12:37 2002 *************** *** 1,6 **** # # The Python Imaging Library. ! # $Id: //modules/pil/PIL/TiffImagePlugin.py#5 $ # # TIFF file handling # --- 1,6 ---- # # The Python Imaging Library. ! # $Id: TiffImagePlugin.py,v 1.1 2002/08/21 20:11:01 klamer Exp $ # # TIFF file handling # *************** *** 106,112 **** (0, 1, (8,), ()): ("L", "L;I"), (1, 1, (1,), ()): ("1", "1"), (1, 1, (8,), ()): ("L", "L"), ! (1, 2, (16,), ()): ("I;16", "I;16"), (1, 2, (32,), ()): ("I", "I;32S"), (1, 3, (32,), ()): ("F", "F;32F"), (2, 1, (8,8,8), ()): ("RGB", "RGB"), --- 106,113 ---- (0, 1, (8,), ()): ("L", "L;I"), (1, 1, (1,), ()): ("1", "1"), (1, 1, (8,), ()): ("L", "L"), ! (1, 1, (16,), ()): ("I;16", "I;16"), ! (1, 2, (16,), ()): ("I;16S", "I;16S"), (1, 2, (32,), ()): ("I", "I;32S"), (1, 3, (32,), ()): ("F", "F;32F"), (2, 1, (8,8,8), ()): ("RGB", "RGB"), *************** *** 331,336 **** --- 332,338 ---- elif tag in (X_RESOLUTION, Y_RESOLUTION): # identify rational data fields typ = 5 + continue else: typ = 3 for v in value: *************** *** 568,574 **** "L": ("L", 1, 1, (8,), None), "P": ("P", 3, 1, (8,), None), "I": ("I;32S", 1, 2, (32,), None), ! "I;16": ("I;16", 1, 2, (16,), None), "F": ("F;32F", 1, 3, (32,), None), "RGB": ("RGB", 2, 1, (8,8,8), None), "RGBX": ("RGBX", 2, 1, (8,8,8,8), 0), --- 570,577 ---- "L": ("L", 1, 1, (8,), None), "P": ("P", 3, 1, (8,), None), "I": ("I;32S", 1, 2, (32,), None), ! "I;16": ("I;16", 1, 1, (16,), None), ! "I;16S": ("I;16S", 1, 2, (16,), None), "F": ("F;32F", 1, 3, (32,), None), "RGB": ("RGB", 2, 1, (8,8,8), None), "RGBX": ("RGBX", 2, 1, (8,8,8,8), 0), diff -cr Imaging-1.1.3/_imaging.c Imaging-1.1.3-KS/_imaging.c *** Imaging-1.1.3/_imaging.c Sun Mar 10 17:57:40 2002 --- Imaging-1.1.3-KS/_imaging.c Wed Aug 21 22:13:16 2002 *************** *** 1,6 **** /* * The Python Imaging Library. ! * $Id: //modules/pil/_imaging.c#11 $ * * the imaging library bindings * --- 1,6 ---- /* * The Python Imaging Library. ! * $Id: _imaging.c,v 1.1 2002/08/21 20:13:00 klamer Exp $ * * the imaging library bindings * *************** *** 1415,1420 **** --- 1415,1421 ---- union { UINT8 u[2]; INT32 i[2]; + UINT16 i16[2]; FLOAT32 f[2]; } extrema; int status; *************** *** 1431,1436 **** --- 1432,1440 ---- return Py_BuildValue("ii", extrema.i[0], extrema.i[1]); case 2: return Py_BuildValue("dd", extrema.f[0], extrema.f[1]); + case 3: + if (strcmp(self->image->mode, "I;16") == 0) + return Py_BuildValue("ii", extrema.i16[0], extrema.i16[1]); } Py_INCREF(Py_None); diff -cr Imaging-1.1.3/libImaging/Convert.c Imaging-1.1.3-KS/libImaging/Convert.c *** Imaging-1.1.3/libImaging/Convert.c Sun Mar 10 17:57:40 2002 --- Imaging-1.1.3-KS/libImaging/Convert.c Wed Aug 21 22:14:10 2002 *************** *** 1,6 **** /* * The Python Imaging Library ! * $Id: //modules/pil/libImaging/Convert.c#3 $ * * convert images * --- 1,6 ---- /* * The Python Imaging Library ! * $Id: Convert.c,v 1.1 2002/08/21 20:13:39 klamer Exp $ * * convert images * *************** *** 408,413 **** --- 408,423 ---- } static void + l2i16(UINT8* out, const UINT8* in, int xsize) + { + int x; + for (x = 0; x < xsize; x++, in++) { + *out++ = *in; + *out++ = 0; + } + } + + static void i2i16b(UINT8* out, const UINT8* in_, int xsize) { int x, v; *************** *** 429,434 **** --- 439,455 ---- } static void + i162l(UINT8* out, const UINT8* in, int xsize) + { + int x; + for (x = 0; x < xsize; x++, in += 2) + if (in[1] != 0) + *out++ = 255; + else + *out++ = in[0]; + } + + static void i16b2i(UINT8* out_, const UINT8* in, int xsize) { int x; *************** *** 510,515 **** --- 531,539 ---- { "I", "I;16B", i2i16b }, { "I;16B", "I", i16b2i }, + { "L", "I;16", l2i16 }, + { "I;16", "L", i162l }, + { NULL } }; *************** *** 905,911 **** --- 929,943 ---- } if (!convert) + #ifdef notdef return (Imaging) ImagingError_ValueError("conversion not supported"); + #else + { + static char buf[256]; + sprintf(buf, "conversion from %s to %s not supported", imIn->mode, mode); + return (Imaging) ImagingError_ValueError(buf); + } + #endif imOut = ImagingNew2(mode, imOut, imIn); if (!imOut) diff -cr Imaging-1.1.3/libImaging/GetBBox.c Imaging-1.1.3-KS/libImaging/GetBBox.c *** Imaging-1.1.3/libImaging/GetBBox.c Sun Mar 10 17:57:40 2002 --- Imaging-1.1.3-KS/libImaging/GetBBox.c Wed Aug 21 22:14:59 2002 *************** *** 1,6 **** /* * The Python Imaging Library ! * $Id: //modules/pil/libImaging/GetBBox.c#2 $ * * get bounding box for image * --- 1,6 ---- /* * The Python Imaging Library ! * $Id: GetBBox.c,v 1.1 2002/08/21 20:14:29 klamer Exp $ * * get bounding box for image * *************** *** 163,168 **** --- 163,186 ---- ((FLOAT32*) extrema)[0] = fmin; ((FLOAT32*) extrema)[1] = fmax; break; + case IMAGING_TYPE_SPECIAL: + if (strcmp(im->mode,"I;16") == 0) + { + imin = imax = ((UINT16*)im->image8[0])[0]; + for (y = 0; y < im->ysize; y++) { + UINT16* in = (UINT16 *)im->image[y]; + for (x = 0; x < im->xsize; x++) { + if (imin > in[x]) + imin = in[x]; + else if (imax < in[x]) + imax = in[x]; + } + } + ((UINT16*) extrema)[0] = (UINT16) imin; + ((UINT16*) extrema)[1] = (UINT16) imax; + break; + } + /* FALL THROUGH */ default: ImagingError_ModeError(); return -1; diff -cr Imaging-1.1.3/libImaging/Point.c Imaging-1.1.3-KS/libImaging/Point.c *** Imaging-1.1.3/libImaging/Point.c Sun Mar 10 17:57:40 2002 --- Imaging-1.1.3-KS/libImaging/Point.c Wed Aug 21 22:15:51 2002 *************** *** 1,6 **** /* * The Python Imaging Library ! * $Id: //modules/pil/libImaging/Point.c#2 $ * * point (pixel) translation * --- 1,6 ---- /* * The Python Imaging Library ! * $Id: Point.c,v 1.1 2002/08/21 20:15:22 klamer Exp $ * * point (pixel) translation * *************** *** 113,119 **** Imaging imOut; int x, y; ! if (!imIn || strcmp(imIn->mode, "I") != 0 && strcmp(imIn->mode, "F") != 0) return (Imaging) ImagingError_ModeError(); imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); --- 113,121 ---- Imaging imOut; int x, y; ! if (!imIn || (strcmp(imIn->mode, "I") != 0) && ! (strcmp(imIn->mode, "I;16") != 0) && ! (strcmp(imIn->mode, "F") != 0)) return (Imaging) ImagingError_ModeError(); imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); *************** *** 140,145 **** --- 142,160 ---- out[x] = in[x] * scale + offset; } break; + case IMAGING_TYPE_SPECIAL: + if (strcmp(imIn->mode,"I;16") == 0) + { + for (y = 0; y < imIn->ysize; y++) { + UINT16* in = (UINT16 *)imIn->image[y]; + UINT16* out = (UINT16 *)imOut->image[y]; + /* FIXME: add clipping? */ + for (x = 0; x < imIn->xsize; x++) + out[x] = in[x] * scale + offset; + } + break; + } + /* FALL THROUGH */ default: ImagingDelete(imOut); return (Imaging) ImagingError_ValueError("internal error"); --------------76AC3200840C968C229A5F70 Content-Type: application/x-zip-compressed; name="changes.zip" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="changes.zip" UEsDBBQAAAAIAD2xFS2No3ba5h8AAG1xAAAMABUAUElML0ltYWdlLnB5VVQJAAOV82M9LfZj PVV4BAD0AfQB1Dxrc+M2kt/1KxB6c0smMkeSM5OM57xVtkee+OLX2p5scj6XiiIhiSu+lg/b ytb+9+tuACRAUrY3O1W3p3LJJAE0+o3uBqidwQ67XXF2tSlXacJOY28ZJkt2Fs5zL9+40PqH 02CfnnM32wwf2NidsMloNHkz+uHNZAyX+6P3++P3bB15Mc/Z9CljfxjswMASwNI45kdeUbDH 3MsynlPbKizKNN/sw+X4/fu3u6P38McWEWPsOOdeyQPR8m53tLc7HouWq9MzlvOIewVnI3fE 7CxP0wWDPz9NfJ6VTj3ou929Ud+g8Xxc93m7O/m+v89E9RmPAVRfn0kDZzzZHf3Q32ei9Rm/ 6++zJ/p8vzsa7463zPWd6PPD7gi6Tfr67Cl8qM+4l649hc97nGvUw9SxO1JwoE8/XdingfP9 7qS/D1uEiRfV/X7YHb/t7eeOmR0mJc+hN4s9vEw8EKbqgyIFbRvtjkBiPWSN3bHqMR7tTnqE Dj1UnzEKfQsUdyL6TLYJYoxCB2Tj2zSN1mHp1P33thA3dvdI2Y/TbJOHy1XJbN8RwsaBbL5h N9zPecnOvHnBDo9cxg6jiFHfAgAVPH/ggdsH4m0N4iTnQR6u2VmVBCuXJrzhnKzvenr48XwK oog4W6Q5CxP4jr0yBEuHv6pA4/SSAKYKwCDzcF5hGwIZ/Dy9vjm9vGAHzCJKrMFAmPEsFD5i lqTlLEyK0osiHuwPgHy2w+I0qGC2LPJ8vkqjAOwdGwK+YLPZkpdeWeazmV3waDFkYeCIcfjJ vbBAh5GleTnN8zQfMgs9k5qPHSvgYcFgblbPDaiV6EsEBsvwgbPbNfOYvyJNKlNWAI+rjHjC k4cwT5OYJyUgkDAfZfXI/5hzOb4qcDIvaSaW00ZhsuYB85Yezgy389KP3uC/NQ0NCXV2Ej7d rgf8CR2STo7ALwMWGuieLgitrVRmqAaI6yatANmEFWUIOlIVCl8cbaUZTyy2qBKfhAskhwGM Chcbkn4xZCBaBQLBRqkXNABi0LyLtESt8UqWwpNcolGwYpVWUUC45HwBDQBcYSshBGHO/TLa fFA8EG4fNQvwbBYC109zzh68PPTmSCGwkXug3xr3DMjU/cB8FvCoebCNy62BpqrazmCg43nl RbwsuXqWArPQFpIl/N+AsIBDm4zDs2qxGCzyNKb7oqY1KW/hfshuaJC4vq2yiOOlJuvPSein AW+6AYYIya5Eg21ZjlNbS1g0He1StxNeVnkC7UQQKLhd6nM7DA3daOxM7CjGXcCSrbHtX5p3 MBDDa9Lr0b0j6271QBJG38CVV6DbwFFWGFv1gI+kdhBG2Iv2TBoNC4cUMS3czCtXbliAtsLD gRAlGE7ulcgyIc2wuKjiOc+FGAEQ/1vFAWUhS3SuH/m8WrKIP/BoMPg4Pfr8CeQ4GkhPTxSC 87a9qEiRoWECPiNsvIkwK9f/CjC4uLyYysGszL2kyFIw65Oz06vZ2fTkdnZ9+unHW+pAz24v r2ZHl7e3l+fwbDy4vrw9vJ3O3o/gbqLuxj/g7Z66nXyPt9/VE6D/LwaHJyencubpL7fTi1uC dwUe/2p6fHv6MzZNwK7BJbANuE7gTcTRY0JY9ufPhx9phvPpzY8KNvgoD/qg/wJ3A6t50dB2 MT28nt4IMg4vbk8Pz04Pb3BCmGBvN0rnwJ8ItOK3tBicnWJvaDw6rS8ng+PPR6fH9FBd7eGk QYh+astMl9cfp9fTj3KePkKuD29up9en//0csSdnl79+hG6nF0fTa5TzHno7vvCqqEQUMuE6 ijd/q0Dq4W+Izl+mR4LWj4dXkpdj7OtDVLtM85Ajxtfnh2fU62b658/Ti2PR6/jy4vYQ6BZk w5jdL/ABMNd8Scs7TD04RZ7c3Q8ur6a4uP/9H4Pz0/OpuLo5/FlekVrI9R9uvxwq5+CIYE2p MrQ2kDwEMCUkA+wBWAcr12AwO7/8CPw+ucSZB3KBSReL0A8xQsTh9NAaW/vMts4scAr4ZcOD oeMMReNZu/FMazz9MH5nsboD3WIfcdF0a2Ccinat8aRpPKHGE63xihqvPx01819pzdjQ6XCN l5/w68jSe/7yfFf4+sXof/hi/8Om//H5rz91+x/j5Tl+/YpfPzX9fz2eH+fdAdTteE7fOfWW coNkkOchGpOSHbhCP6oCCAiA2UP6PhoygOYN2dGn6w/jt0M5Fp02Ppl8B8HJZxFGwLeAkibR hoULimjWSfrI+JOHEYgc+4hhDLRBVMeCFNyS67qDAegxKhc6n1rL3DXfFBARUINbgFLacn2B YBXnmkN8aOOFoyI2CC7A32VpEqC/s7CDRWgxe5l7m8IHp4CLsJ9GaZU7+sJUT3uH/e/vRvfG XBQNGHNhloyhFEUgNjCTzYEvz8Ic37fwT4KiBbSa+yksdwnIpdBBRTyx2+Am984XNP8feZSh kxxAOBaWYNHgMwOxBCLOEOzic1uiap1BlMpwRQ28PKjzGMhgGKQ86DJcS6jaEtYRDwPDBqqI KhfGM/YncLPtkEZAwPwoxoXato7ijCwmXOC//8r4Ev9fZTH9S+juNlwsLC06qqM89ZnNREQB yY71tYhtrqIKIgCLfc3iocQYVG8Isbgvr+7unRrItthWfTCTAGGGywSD3TgsKG8RfCFqwCwE aS1ej2X81GE0RMdfiMeTfh4/QAhYEg64plDEKUM4WJrgKYTbFKSJNoOlZkf97lt2p2I7eJxA RGvPZkjGbObcDzROtoJdxcN6jUGX4q+4vzbA28JhIW/9Cgyf0saFSstQYTC9wemdWo/U+A02 i4DI1sLVoT6BpkOLKooQEBCoKPLmBf63a4iNfgASkp8uBMgz8GO2AuCYmuKnEJskFW8mAhxJ 0IAezBRBcIBBcTOJOR5mwt53u+Pv9u/ZwQGsh406u9nGMrvTDEPGNTIKiA1L/lTaCMfp9O4Y j/oohXAhc+DgmkcN6zZdMM+Cwo9mk4tXWKBBEJazomdgY16q0EW/3m5/yZzVB5hNScX2mTJI bUopg3228IClAWX8BNoavjAQKLf2LcptXUBq9uBFmmpIlbpTqgTyhsg44QNl6hQ3gv5grNjg 2HIxELx+uTXjGNYhH+isLbIqZOCYijz9DWZy4pKiBuLMCbDFxSqHXM6x+ARwAFZOqyFokrib ocsYMi9fQuIPOpp7B7YDFqCqI4/cW2NrFdfLJbABu2OJBnnTsIGeHjBb6BCPoCNVqrSkGLs4 3RE0vdPj+HZwIVe4Nu5Q3MNIWVOzseRh0gSe0ZrJB5ajARR6IFsgfiN2ONCdkPlWMKGd93tZ Fm3sFwY5ur89LEVFse10ZaHvkh7bliLla1Hv8h5AobE8hOukTo4mR0jINTnKu/8XcpS4Not8 0i9HnSaSo3zQI0fZ8s/J8YVBv0eOipQ+OerkOF/SN9xQtg6Y4nqMCSQ4AC/aQCJel6unTW1r Rm6qLj8HXuk5+wxvXLzGwAL+ad39lOc+rwdQYRRGSFaKh7OpLZ5r47wg2DYIutv1jOCKZWdL dqTHjg4rrqLXw6LObVi13VBqArl0wUsbWSb1tyirORYFLLywxNIl+YG9bJgGWxzHrdljqLYN c8+HzHckAzHFQLmEixAcdbGB7O9JD1tsDy2OZkV3PaeQQuFOj/QqnO07rXhEUu8PcRfwFYAF g18PeOxCnOHrJoDdhfaLkLHLgpoHoFZgvhorcCX9EkzAZwa2wQvk8e184y8RJ2z7ZwwNpHmH UcSXEP43pmZ9UUs+VWU3sT2lNoulFYtgp87UMDuRcUnzBNa6ws/DjMbrUUvH9DW+kPmEsQ6t fkw5PbDYMh8XEOSgqwclGTlmk6wH9kLDzTeR+RiPZVlwg2OoLGg259wLKDOhHLmmJuGPag8t 1qiBx9CRmGU7+lNBYhgbzyR9YUxXRpOkEZrwymhqaNRJ3p4I0+yC9poPrp9mG7uT625bafAD hgQB+NyD9MwGDdwdu2/dibNtJo3LUkHYesgeMOGpkehG2ArA3RrD3of20gnNMqGOvTVHOFhJ Qp5jUSiGcDmch5DobDRBEaF9Ooehqe306KG8arPoOW0IqjiT6oAJ1gEq31BaBd1ok8t9jpLH GfbVXRIu2/jMZAwligf1ADde42UbsxY5Cpow1TSvjRbM6erqvJUxKpIL74HPsixupYk8Kvpx on8QHbkWfIsZunARKAFUHHHaciU+1NxUWYVkqB66HFi59wir6zet4M+6lvtOYtuzYB6bQ74I Ri1AyQIKfnZY7G1E7abEWFJtguIpFhWcMkzIdVZiXY6mRP6Npac3Q1FIOVveXkaksnGgwzOi SxQJkkVgxSCMfHuB1W5x0Ct9jcoqydBU64CB5IjmooXvNbS+GF4TvwvxCrHWloqizSTjlLsm 4X5coVaMTfwjyHeHuGICNDGX/e7t2713pgNBYC6uO0lgB2YTcK3oOow5GORa52zB/pONWqsu LaXXVQI08FaszPGWfU0bhErvMF4uNApVsEmN7l/TMLFluGc5utbOwzL2lBsQ2kpMs55V1IT9 cnTOxFirX6o6efWy+NUB7cD0UKoHDZQIKOhOW2gErTY362keWx3b1Mm+s3bEhirkGLPHMChX wLr/oYKqLRSnXp/RHLqFEH38itNxGgLQM37cO77A6MTHgyWY58yAsOIOl4q/CywEECmdf3yw 7ltCauoUWgZiJu1bXQxVaIlxVOpB+dEG9r+vo6l3StuuGSYy6hT/ogfqdzaBdDaq5qM5m27h R1PNHmej2qjy7IrRZIOO4VWReix+99p/2yp4klbLlRQkwrJMQwMFRBt7EZY8ziOQMsHVakd2 3IpBlDFDyIFcN6LX9gMXhIOc61+0s6qU/ey+QUMTlGBbB45qViE3bi9u7yVBt8Nsgy6MMlVd 3BKHK7wc/O7Gcrp+vEuLF2Urz65B3Zkg7o3Q/yVKDqVZ7shSVH1MSyY5RSMqP00esNAt3APC kMEc8k1d0rkHcdPBQU5/8Jfp0ZB2IPPiYPL2ne5JjsUc6EfESa8sfOKRNFLLUGlUra7k0bBL nsfoSZWJGxmELgjBhwPaFO/nWGuZaQOQFPXXwyWXO5zvdO7GkC0QXZXrH6LVflSI/nwshN4O hNdmIfA6D5+kwOnoQ4t4wkucc1QnDRDFHu3dnqw30K1WOGNmGqQQM4GSqo53DFWnnBJQIxBT GAtRkw+pM8UDpg7D7G/HQh2hsYXW/jNz78i9drBPn/exFGVAVtMt9eJHth0w87xPM0Enqe3j n2Jc2FQD8SNz20Y8JqTeDasdEDxYI26nsAII85VrR7bCCHEItWsyfVjp5xhqi3R67E1UCF6g RqPoJ77Zso/1SoXsxHpd6aJPrBVDOMXGqYGD5OUqDQ5GQ7aOOfhnvFIeUOa9ekBEvbUwfge/ 8IBczIMQQmG/Ks22MbZ5T2FcxTAvYA4y0CFeXN5O98UBJuXUPSwAsEc8ozvH0yoPYnOOjh4/ QeoT8EADUJ8bY3QIfoH6C/busciDW3UqqsCg7er0zH3Z1fR6yx06hqvMkcJGOsqLBxuFYhnd lSPtcczNDE0a0OfYuxowh9CThmAtRqEiE5TtC8dX0jE3MUn9+Ow10/Z6fItKKAAWCxNnAivC pKAD1iA2JRYSnafQtXqhvexY6fQXG9eqaQSVhLau/6q21HKvz7hKZQfKCrpJVL9h9dWmLHzT APhYoPpRIPlCUvhMyeqF2fNUZavz9KldprKOoRkgLDFOIo0VuvJiigqw+p38cwv3Dtjbbxt5 GFhfONRGC5VUjw2MNVKC3FvoMRvEvCCdVsy1CJdVXofoclu2QaE5ikKZojg0IkCueZ7wSAd3 iJt4+qsMckCdG5ph3POB2NakQsI0jLWwXij8Yd4lEHbDoIMEKAkdSKP8crt86vo2DlAHaAJt 0YIgGoInoHYF0CC5jSEGDeeUrwpDLkL0bfVbFUHKi+SPWgoaF2bVCL2Sj64Xwvwm9xPIto/D xIUqEnWRhdUWx9i+o+PdsYmY50uu56QAVFMoCaXoWOcnXtIJQCo1FFZnCW1O79Ww8QifCRmU tx9wWokzjWhDWCbwywrWbCo62Ema7MI6lYpsoXCQV68xSV2skj84v0ksTqEsC6kTiV0bvya7 xdJVIU/ms3T+V+6X7itcg6hnUFD9vH/QBNmct+x2osATX46BJcOb47EUgyrcSuex18trSJ7e QGTB6PTNKwtvtfH8qW07ciZTpZVah69Taw2Ood4aL0LH1chyehcxKjbZss9zalCDMXhG2iVV 4WnT5prIVF/Ds+58AjLANOfLU9Qe8Pm9Ymqa0dk8URgC0feTYXt98z8N2UZbGc2Zuu7Ay+w0 hwX8yRk2Nzqq9MLsMvditcx4xVrWAyQjOyvoLQQSzTg06FcuoQjb1A180hcOtrjcICk2RwWa RrhjrEaU2Z6KM/TdM4dKqXtXc/w0Wk8gDZ16FZYvaWnTU5OEPD8hVVTc4dt5dNERgh3wLOe4 yRs47JL6SD8GxK/SPPwtpcPxoFhvUgr4y9BHp0vHHDFP0tas5p2141WaFW20mxb3WSQ1YjIM 9Oqd5CYS0xRMp+YKu8uqkaIC7EKEaWbMsTUO2xGZFJ02ToU2GO04UO2us2+bkrwBHQvVGINh HDFpw4/SR4Af8UWJZ/UTuMZ3QpMPdAKLdrabgBJTACS1rXz662jGFruJJn5/yxCVu9H9t3K7 HC6Jk3fj5tG4da60v7jUB5RMqA22eYiAdc48izhg05/UGamVPBDQRa8/NaOX51yzXEVVT1Gx 8vpKVkJQ8tVSTE4h7/ICLyvl2XVMqb/qHdUuUzQljW4eBt3C+OWc2dha7ylyz9rpwj/lI+va MpmaNLIez9jViN6RuvGmYH3SeKOq1OrFus2ee5lU9XKV06ZDlKZrfBuaTudtSRQa1yxfj+q6 aIjBgdwSA0bC5AMiAZF4UVI8hMs0ZAPNeSGTNjyKNpTOVG7V6MfTAFQPG/uUV09ACY9Z/aaj bczifHiG1ztUgFkqv/aBlBLpwRW/U1Heiow6J6q/Nkq09NX40FqxMyQmWPGBxWaID6RVEA9V VakzGlE7oFCBJC/COyz0O+wbM1p8gVt2rTmvLshlVdlsj7ROIFk3IE5qhZR6Y2S4fd7jsN99 jMW7Ze3za1vLikK/EYZl1Ex6T9n0eACFwEHPrnbb4SBeLZ8ido5EiIwuZ8j2THZp+Y3Y8iXF PKCDhjJwGLkjY6UF+VKmQ0uV1852xLrryRRsS+4DKraKY3z1rQdbQklDprYSA3F9Z0/hLnff DtrbEYSzKhYQ7luRNFTB3OO4+p1S10BLE2xeARcHfQ2o6giCdrwAjclf5XLrQ2zdG4xTO0VX rQOBzYk4/fcEcJfSrjdBze2U7XueBvONXGgo8p62rf3ulKieoAHdzA4uu6m44+VQveMNC4x4 zdo8VkJhVU/pSY2qpSxHD+tXvIfqve4hq18Pf1EFqgTf+ky6L553bHPbet+scuN+tVOIHzCJ cj9duLml0G4vKTkYLcTxeMwXmO+v1HvP2q/IsP+gH42hn1gx15LejSHDf0uotimf3r2a505W buNw85J2H5frCTpLqYGjUqQWiq9cafK09GrvA0tc9JIeUn/pbxg7xBEi+MeKUcCXOccif1rh ZsuuH6X++hEId3+3zv6bK+rWmqpkbIuljsZ6OjYpGL/IjMOkQ/bNN5kHWbFxPukG+qs4MxUn M2FlRxX1YquVoei/zpF1UhTxOzCzeQV8CpPZzCxoAWBxaAjQMlsyDCObYS7+Jo6NuFuP89Ye E0i+4PQq7HY11mayrN7Ro5YE5ak+eQRZsKi3h0+7AeIFo+eVoH4hunnEn8pm4aJU1+59zZLe tTHTQ3IpfQGrkG7Pa5zqqH39exB3AP7ehIFvAt5JfCo8z2LLc7b3uv4ojHRCjG1kWITayLUo /79GGOYm0bf0JHPpqV4jKjhfK1g5AjEWbb5GExFuiZrFsXQZ4OHExjk+rJbkYRBA77n4OSe5 65EXOmoC0rYzY9PLE+KyhuMqVe8QlGFZnxr30zgG6J008mMI2uVtpInb9Joz/RJOVuX4szXi Nxkc63/bu7rftm0g/t6/gnbRQW4SJ3KzYnPmDi3WAgHW7iEDNiA1AjdRF2GObUhObf33432R R1JynS3Yw7CHIPogj+SJPB7v4+dotgXfThmwfg0tLvxseBX3Kly3EBexLsbmGoCcKjprAlJL hdBx9ly76kXTK+wBkt9+0Q24EevPB+sosQdfwFNt9sLjlZZtsVOpTQt7gEV+L0dT2eJdIht8 6FJaF/N5MiQOB+bEdp5CC0whSn1LKuNgfWvLLGblfG8NkVAdfUVbmFPoKd8Hwk0gX6z21lHE kBsES+Hd+e/vMeDCB54lG6uLvQD4tz+CaAv7zTwCEaTm36/BJStRFrqlFaPvWb1hBect9Au7 99q6HyTI2HW4Na8Mm+vGWKqBEzk9MMdme2bAxscPdMVGKua2IpTZSsUcKjZn1CY98HOMMnWg R6HugM9VH9u8XdHuQ35skgPowf7K7rQjLKpD75OCXwmK0kpYr1PBxnGAdNunDzInVSJRcop3 JsPgeUealGMsf5SIWnuqjjJNqYUj4Rt8vo6WEe5F80ke+HaETnrmglE4QeGjEQ7JpaqnCDUL kwSwvBIremmF6xLDryIjEogwtGHCK1hHaXwj9WR45W1xdpfFOjRuQBGj+n68NM7dJ4uIInkJ Dmh87Bhr5aXQjmWamIcpRVCTdnEeh8TiiHIyWiH7oG8Hu4gI3/hDKmlX1sooCP1GSDkMTQrj Vkz2oxrjhnwJl6PpEfkS3JtbfvOC3uRhepCfFwQUl/hvULD6LIJldUOhJ1aHur71AGqzxHLJ Vhc0yNhuES/Rr4EX+bSdr/jyWyn1Qi5ONVrOPOg4wdqljieKfMZAPAyABrfDZ0wJcd8+qLO1 E6yxf9vc/s91grgrAXs+GsKzbW6ObI2BFdaboEzjyzRQpsEyt0EZ6TvzvJVt2xNzYBs8HtkO 1XbmQ9/skwafwF3dyRBYcDE7YPlVJUYazuZmM6tWQ24L9jzajWGr/by8r9iTVkck3Nn6w2+H 5gL+3h6iyfzD22FQdLFh5l2ejEfTM1O7+9H4FO4LuT8dv7T3C3f/cvzdtOWbgJTbnJnXwFrA G7Y8t3drd3fbwcFDky1g5z2yH+r5a8vFrN6423X7/LPCAIpQQax9QLU7azTcTj49alQ7cruj nRzbybGdfHrQSDu75GK32cHNahIPNB/64ZnmXzd3kHkmVia6bfNQ+p9YQURldswYZV6uo7l+ j03D7d5w2Mn0XpPIdijhzknzcgWGkIotUwvz/QkbouwZvljVg4cEWPoOcNPdlh5nR5Osk3VR r49R8iFOxu1y+WdtJfESvE/g7AKNu1re3FO0C9gpemroV87YuJ/C/9TUcJaY1WxK/u8bhTtt bR1m2seE1fs50AJqh33iw1bxSsLhW7BQxLusTDAE2RwCJ0R83EM1DhSQwy6tg7h2BTHBVKdb N3cj0Gltat6hRlSAQwOZ0Us+MjXT6mrXscwS7MvlW7zRrr8eaoK6wIpbdLwUHW65Wpd3wByo fYzOfb1s2A5U9x5xfrwT8CwFYYwA2gQNsyluADCCWCJHdSuiGMsSXyuTD0bUamuPjj/KBjT7 AcdoSITBYzpggGSkfQymWY7UHVIfoIo+rGBk++Qk6tMMES60pgw2OSiaxho9NSTbPDJZvFTT /oa9EHN4Z3HYHtJeQ7UnUbqvLrRf0i8l/KpE3yDD92HZvX8ns7ctq/fBibtMxOfrutOp4jK/ GCp2pSzSebrq7IYBeWLnJ690JUK7/wvMMnE/G4KA2JR237wn/HuYxqDfptkOkswGUQqVigfo TmuRLWanf2OHb6Pdr7HDp1GJTyNUB0OvBT5eVQUEywNhtEpk+cuBe6Nt7M40ea6OComNh4D4 GvtBrtGGM0FIwMsyVNLZTs9lLGG6yqgzLeEwtnNoNW/JqxWYjhmDvQfWeSnEFqXsApGW2KNw vrgp5NrBHEWN+8SL/3nheRGBu3FGiPtRCb+k+izZ6ScfrAZ5XSASLcv1T/MCo2JyUDHsKRVD g2SBnoPpfrWEE6j5VKw3hd8V/EKkYKIfJgD2pVaiyICcF4Er+QpPgC0lRyxocq1i28f61pNV Yt6NAc8KUAP+00gYXQ3xlAE5M8P+53y4GFGcX7SLucLMxk8NsQnkEaev8I+QGJ11jqSEL1hx wq3oxCs61EjIIPXFR/RGo8R0Rug/6EsZ27mCXegtKVLSVYX+9SQhxQFlspcQZcp0IXGvnRz9 9/ACI5vQzAgDtvuYzuFhExds+VF+j5oeKcw1SG2MD8bWYL31n/dhKYdBraks31RLy3Ryf0CX yL/jYX1LxIfGp5f5eKrkuo8g6026wLy728WKd2WN5rMwlInDh4EstXsybTPmJySxUkQS995I zQmIDkLJRw6qlL9qPFS9nKaHVhcQ54rg2gnmn2vcH1gfTeMlcGKMTLc6RUNzke6sRoHbaGkP /JEA115PzGQLvMQln7fPfxK3nDwhqX8DUDARxajhu/KuwIbhAmYINwa/wXAZNwbkpFxEB6Mz gA5hdDOV1LHNVKhURMPZApCQu2Na3oEehBr4YtM29jw+tOcN+505GolPLKkft919LVJiWQ+d xrpYK43OBQz037xXcX28ZTO1cLXxQ6hTr2fVut+mhiUYhQ+guv0SxpvYajjEVFHwleTqwPTN EQ71Y/9Z/bEPsERYmVgBKABmYtoxAYRZWKinsHZasq91lCyjsWEBiZIFGvaohMh0HDuk0ddS pVUItFb56me0L+rGzuo7ANs3z2rEhGKekIYUJI9qz8q8sGupRny7JfzmIf1glj1uQDakBM+G /VWtZdjcmanuzNFnezX4Jm3adeAvUEsDBBQAAAAIAJOxFS0ID+4g5BgAAItSAAAWABUAUElM L1RpZmZJbWFnZVBsdWdpbi5weVVUCQADNfRjPS32Yz1VeAQA9AH0AcQ8f3faSJL/8yn65J0N xDIDAtvEE+eWODhhx455huwkz8PjCWiMxkLiJGGbubff/aqqu6VuSdhObu4dsxtQq7q6urp+ dXW19yp7bLTkbLBNlmHA+iv31gtu2YU3jdxoW4e3f+vPT9jIWyzwHR/4GwCor7f2PWvWm8xp NJyfG52fHfx50myeNJrszndXPGK9xzX7W2UPB+ifn7OF53O2dIO5DwNkzV7MXLbw+aM39bnN vAWLwxV/WLoJg+Hm0ILDit6LMFpBexh5QIPr+1tAMucLL+BzNt2yrj/fxHUG3zCXze1SDBBv 1uswSnCYB2/O2b0beTzZsnDB1t4j9wGH727DDUIEczYLV+uIx7EH3FhxQDSPbZYAhwKYFJuH PA5eJSziODyLE+wCZAESCweN4TlG1F6AiNwEZ6UTH9sW8xL2xyZO2IJzPwbcMKUHF3mNPAkR 91yQPncT4E0UroD2OIH2lSBF/GYrRDKFR87vXBgHpn5OpKyj8JbmcA8U81k4B47bbOXeAewm 4iwJ2Sbm2bLE7GHJsR1wJ+4tctWL+CwJoy2uz9p3Z8DhhRfBeF5AYNhNUPzJixHwBH4237w5 PGi8OQAZWPiMsTMgM+Fz8ebooAEv2+LNJ5QDzv456H0cdd9f9IZyXAXX7Ai4c1ihOTu7uri6 vuwO1FoKwGMYB2B1wMF170P/bHR1XYDsHDjHArI7nwOkfI+rwiJYphDkCWmIWZUYPuARTH6Y hL5fE0g6OFyzoQ+HjP854b4vO/3TDdh7P1xlPY4PmpLAL8DwdeTdA0NIlGIa2gsSHuHQKJW4 hrHoCjw8Omi2RNdr/hB5ScID6jLoX4DmNVgV/sGBQAMbQNdBs5nOz5PzWQCVYhyp3o7o15T9 gH3tg+axPqWIP3hBxp4qThHlZRGh+Ddq2N3JusNKOTpbkVBuMHcVRlxn7MeI37KzcDNbEq5W iqvppKsucYXRnRuFG6FhbBqFd8CCSzeJwkfmCwMlOju0NLLzhxAVFBgcs80a7cl6GSZgUpLI myEhKNErD5QDzFz1Qx2sBazaMOEPbpTUSKLPwvUWTMwSpj+rCfnBQdDEDPks4gm7cKcx674v gwWOQAeEPY/4PPLu2AXMYEmIh1zo2HWv++Gyl5oFkAJhHNDmwP/AioDFQ8sCGEC7Im+6wXeo b5XJ5J5HaJ0mE3bKLOBg3bEqFW9FHCcbbYuvc0BvtA9cn4MYpcCIGUwxkXbwF3wAzXVqu8iu VCpgnpnnN4+qMzs8bdROKrBCMK1kE8FUo3l1dhOOa2yfVeXDfnNce/u2U5MdW873dtSbHGxq HhltLWxz2mKAECnzTOSzZVT1/u4cHmI3enj3rkPPsgvQ9OIu2XPzKNfgtAVSMdPpkyzCyWmT 0Fk0fZJFON0CRzpFvplMUiyCBQX/wx9Ibcho2cJzgUEgb4LCDO6FgxfywwcAnoJvI41HJ4b2 rNK/7H7s/db/MPoE4uocHomGi97nj7LluPK+PxoOetfD7uXgokdtncrZ1SUY8+Gwf/WZWt5U Bp+uRleXvdF1/2zS/zzqXcP7UXckAY4cgfhDb3h23R+o5uNGZQg9Blfn58PeaEhNrYoYCccc 9L/2Lqj1uHJ99RuRgfDU1BF9338b9c6uvnyW3d9Uvk6AsquLL2qQjlP5lm9qVQYX3c/d68nZ 1efz/scv1ymlnXYlg518+dwfYeubo8rw6nz0W/caOdBqHFY+dEe9yah/KZ6PKt3rUX+IsK3m YSVzdPh8XEk9JDw6jUrv6+i6K2eJTa2OnPM5QhGS1puK5n2hoY1YBt+u+x8/CYB2C3g6GJ1N Pne7k7NPXz7/Ss3HTovtsYA/xGRYMdhY8yjxQNtpiYafrgYZeLt1fAzgBBovw7UOri8yLOn5 FXT4bxJitKtZGHb6DiI134jMUBgJsnnCrMh9sGx6cuApgVB1MpuBw5SNLWi8BT+ybsmGtmpo y4ZD1c3/U2E6Uk1/rPmtZQNF4TQOwX6KYY/htXgjhgD5aaoeQM6keUR9mkcHqBFrd44hWAqK FK3d2R28i63KvyuVq0GvwIGB5rb6GCbA5BPyETYbuqu1z8/JadjsPaCBeEU02hB3J5ErHmLg nUS3AjW1IdR5wB/UVm3YrGmDE7Zr8G+tdsKqVhPItpq/9K2abcB0NJgLhLnQYJq78OQhilgK OI40kP4vxEbxrQE6ZYBDBTnMg7YcHVSAtRwDrJUHO0ewcwA7T8EcNQf4LwO8/vgeQfGrDFCA NuwU+KuE/voEuJOBdyV4NwVvFZk9QKDBL808jFOEcfIw7SJMOw/TKcCkEIcF4gXY2eW3XxGS vhXwUSkHv51NzyKEFT8UcKcU+KJL7MYvAATNAftxDjYcLdiNdXn5OwTDvzcOHVrlPv7CFmss vOzEnc34OqmCJkFobDpM0XZz0h7jFkehrVQqM9+FUDKNqD6ondFJRWpWxNEs8YC2mBT7oLtM d1CwKwMrGa85hLTJEswAxqW27PuAW0qMV2mbJgPlTeBj9ArOdfsKXKkb33EKgetiRJrJxAu8 ZDKB+Nxf2JL4U5iyJWeFH6AbLK18ibOqAocEZ6xaCoUY6hLmVAKnLzF8lq8g2ITeGfa0rwe6 KH+1HECBsYxNgYkBu8eAo5e9Exa799lGegvRtNouTL3bAx7MPYjH0UjV6/UUAWyU+UuG9mlo Pzc0QYQpbEiwIcGGOiy9xbVMqrWM16IB32m8JVBaLbDY/y400869+Cbgjwk0fw4DrqRn7s1o twa7ze6gDxsu5ES4qOlr7fNALrVGgZTblftYhfdVfWTQF70prhnYbnkCm7RVKjwAoaFNULJ1 5slxUmQ38M84W5hH1Cj2K9/2oiiMzK7Jdg0+R/JCJ5BwwOQ3AbpB3PNQTsHfmsvm/QndKWXE I4XBD935BHZFazeZLW9whHFxrVM6oZccXqKRcyYuGf3m3C+SWMYIfJmx81aKBrHRxiZ34yen uMIvZOp38FNRIAYxiIhnru9GP0LKvetvuORucdJgAFCUCKjG/uMUAi7jvYRBiwcWQg8yi3D4 2aNtPZP7ermnr/5nDeTY2NeX9xUphBGYw99o022ze89l78Mp+9X3VvyuVtovcr2YpyxFsYt5 ysRy4H/hfAkczGUQJpiAIw5bZQtC3LlpvHAVgV1ycExF4PIUWUVUvGjtl248uePbUl3Oq25d ASMYbBENgTde6vYiLtoLW0xZGwplAHRRCQpMDLlGTei6SyVOANs5V6TrLgEoS4majym0lZd4 97h9wGbDHAiLm5JO76bbhOtKn5HiY8yQrRklYtBLRm5wy8mmUocc8X7dXa/BS9FemQyFN67V 8ixPNhB9V/1akcabJk4Mg86UvFqOZJGXKScahQcHPWiejFHjXv3eeGUSKO0dQZ0cNMd50sh+ FclyDLIECQXCluCcfoSZDeGQpG9ydrFU+XQCBD/+XXxt0QQcWyM1T78f7mLr95Dffpr8lvND 5LeJ/LadUZqnXqWp//cz6OyaQXEKWXilmvbbte+a2CFNrGObk8hPDryBOMgpn90e+xKgMZln 4vu8SB8bIp2OkBtaDrhYG8ORsRFxvIrPKk/EifgBwVVBCvzMminaVFys7FohFPvFuo55s6pT Q6uTcxpzwKIAmk7NfE02GRiEMTCmNBdzWDn5CxUuj0zsZ+ofeu+/fCxx6CI/jId+I7DGhfcw Gp2GnaYg9VH347COwRBRYm2CuyB8CKyiQwYiC32/DXqy83b9ZGew/kHCLBjjhP0Us+pP85rF fmJVSZDwf/aubgfkj3I9BTnEPOhpMjUfKuFH8zXl8agZPz0ZCbxkLQz6N4HcK+FeEuZiEd2F PrMwSLwAfOwe824DTMfmO5oTzQfaajpFKJw1fr1GsRbC1c4J1x77CHs6PL3gj2v8Qi0Sjjw3 b8L0jrWLk6bTSBJ3PF2rFgUB3uDJVDWlolMrAklPqJQGh9uNCYc03xb3nBpSGPSmc9LZR6Tj gnalthYjZgTZEeGx/pUeZPKAjq2xp5XjfWHzdMpIWbLdiDb808otonVMB6issc3MPK/Ncpnc 2jNySct7wt4mmPIHBcPj+ITH71DFcPqF3uW8LcFp2drGpHQzjSKglritdrp7IsuQjxbR5uML 3eanSMPMfoea/Q4z+x0a9ntdp9POKgBXc9ttTSX2mOs/uNtYHo0C2914hlmO4JbWAcJIHmW7 M5FRyCJ2jLxjTQGoEXMEuufJTuuNGEA4ddJnlYsSTdqcFwvwYrqqsf1c7gB0velAa1tjP0SH a9E1NtIZYsJrTJg1T9AM3WMCiiaVhGzqUZpDnHUafjDbUlB9AcAX3N//n8eSEoly82NeJ5Vk bTujTSzbN8EWkrZO1GJZJVq3Jw9tzTAonSUFAM4um5Xu9AlF/Y/Qkxt7mP7vDQuXHr9NAss1 dY8qF27BW5QSomUEtNO3coXPCROZTiWv5ft5Mc02EAFC5d6H3pzN0F0dOMWpc1+zd/rBnc30 M7sdBg6mOefgSxfbrEhEFOV43J8XxSyj7rD0nXLM32EPBbpW6TtUnXucmZCwUhj8AAvu2btT dnR42DraDZYN1y5dUXwFpJQjUFk+TbZW7rpKWVeRFAApK9Gu3TPfhbHlmBhz0cfCu8Uap3CT qM0yNIFogcCGlGZMpWu314ZplkQlapOkgm1bS40JT0wE5aMIA/PbH0OMh/Ptgywn8RoVtXS0 Mm7Owk2QSN0SWJ9Y38Py1VA4xPfPzMk47s5FOZteSpVpyQtmSzht9LRVYQjkrEtiutRhyR/7 GW/L5iSh/l6WtixH1xQpynl6aKs5ts16juVbZLFUD5ooHoOHaO2nfBuCy3U3j57vobMzzCPG vLq1k1myYgqwwBppplVuR0nwjY7O3HjIwx/ELyVztfETT9CuTlzwLZ7AeHhYvAJLx+dmglO5 DFyaNBEgc3z7kgW5PHo5bRivPjGpQvjgnMiAKYttsAoNS5oUZBo47GIUGMZ5dlqXkwwtnIA9 SIl4CPddGABP+1LVpIei8BmhIeVa9xn9hD0m/sSSHcSGDzl9TLuCgov/wC/vMYzjwoVmuvL8 ail+maL3VzItJa04YcPElSqbPi/dZqtyJRITddiaVhvjgWs1/VVPf6mwXRYEnzILz10trW0y 5/EM5I9q6uB9dx5ORcWrpeW2w7UMdTX/b11Bo6xxpYJXqj/GuD0rbLN0/n+CnYcWwnuLNDeg tiUdPUu0QAg6Z0bt086ac2c9tD8cboPEfTQPIsqp0MqkM5WpmhmsYqY9zUxReql4yF0lWp2x saGBldqsZUUomT0exSbmyUTw7lQ9yr2aGqsu9u1Lyh7ke0YiUD9oFt6sM8YaGyxQDpGvSxeN kOT60za/oWX/qEHuBBFeF4Ih94EDwO1b2D0GcrJuzGabKAI7KdhtGcsqYN6yRk5t5HwaZeSI cTOSaA+WF8hrmWPFYjs5vEAabFZTHlkFbRIDyNRJJu0l8zVpyhiMzC6bm75G5jT3VOmwYW6e XlftrS4gUnpSsIclSrWB5i0rIQHoRA3RMO5Ku/SuzjOdEgWLtKAYJer6VSBUZYu0MWpFKFCs eppahj4lIOaMsQM+P8U34xHilII4gVIay63LUrmECGRaF1GFoo6RZbGYjfcjeGRqB1oACU27 GiA+1gTRjW7TzIC2PBIjFZNgyRSprqBl7btgoiaAiwJ4UQwNcE7eLEoM6tcNETfWRxEI9XJB HA+rBE1ckshqOk8sdqs9jQnk4yar3bP1ukFZETguHUQvvHuWVMKT8QalQx3OZjWbpdmBT1hO AT5f5HKZO51G/N7DSxh014ItyVcVN65iHJD5SVoJpIa+yYbMpbb9nRNImVI+iVbzuJT6ISdP xZrtE/YBUHCwdTPMdgywEB4dUjnhUhCF7OCKprSndbLjm8bYLsYduDqGhUQlyttfIe3JEsJ1 4WXD6R/oHKZuDHwFepVVxsSV4ZQ5lmLO8LqQz+9dCZFTXIN3LF8Se5MyLyvyMJigdbCZaVpr 49xQ5TrGnhuirJK5MJYRkWqlq3S/K+L/tYGQYi5Cz+lG7Dz4PY9gu8QRBuMkVSIrkNBFpzWf eQtvRpSm70TdcSndu4vEQbvNKGxnPlHm7V6/fs2Gm9UKQ2n4bZXBHOhFySpXbSxpeS+NQRPP qO1FJPR2R8eSFczGLXtrBG56Kv5RnecUuZjV7GfWcPsMuKjoz0Vzss+jOGAiFN+1Bgfi8ERN 0OyfBv8lJOmFSGTUNS6gHT5hsyUHU2lIqrEQZLnQyLM1uDhxU1DhABuGVsakGDHZkigzGazT VzUuO4hC3toT4HolP1XB5rTuO5gp+QXEI0PhKwUqHHQSCUbFOMw3LVK/gb4vr3V6Mm9ferIp CM1VWpVsh2TKXiwOLav1ndIFkxPiYNmlHjrTO89PAVPm5KJnvMV1Y2m6b43TsE23CJooTjee D0aRNm1yvxpq3hndMEqaX9w+UB/jtEc5Y93R6tn3Wj5ep/wMsJt8mvFuWa5U+gUZqc2mOD6o fvhKr4fDj5uPB/GD6YgQg6rUY+skj4sCI2N8tzydl9aZppFsFsMW84MpI1X5SynOamEFi0c9 BAfR48oLqlvFGps9yJb9pWorOSbCDxiOsmTnltZ/ny3L2LDFjH7G7WYJs/CjZKhR+tYn6drP OXP1KSxZFvIZ4ZyTL4naI5kuE62HctFqOU7tJSLYclq1H5EqIPH/WJjS8naKE1V5OxW7Ym59 KXeY5cfheyoV7DLK0q5BuUPRixQdO+nl8OrzF0vwI4ipzR73QW5BZr9PVlHOHkGSHsq4/GjK amOXrNpCVO0dUi+xvVDyFVW7pR8/T2sAfkq0IH/I8kNujtKtYXTrBt6fFHK83OOVdNW8Cuzf YL+yFrd9NcdScBXpXnyQ2xmrvqcMT9x8dzWdu6AmdHXVxcOfwyNVGYjapepIxiWJjgyVfge5 DqpEF5x+wXtg+hGfhJdnW3/l3eTfKD+uX07eY76XJKBf8tYJKq6qrx52/9XLX8kT/HqXJUa0 8DGGadCdOxkBUuwIoWMsb+XRVpDwWE1LXZHTb85Rnb5QOevCUlfk9JtzOsTAUrexWjsg+pa4 GodX3QgkuwtngOHlOu22nXERLw84tPTrdsZVPB30nMDE9TkCa5UOjRmg7A5d7n5dDvCrpV2g K1yZa2iQXUu7O1eAdBQk3UzTrqoVbrLpBIirafpttaPd1OLltOyuWqcU8N/yQtrsPpmATa7q 5fR7aeGMOH2DvS4JbXq2KtK+oBasCj85tKNxmPMghGgDH4Qa5kvyA6p25NWbcc1OK/ML18Wq 2nWPn5iD5qFRKPfNyvlyg5yeisdm8RaCKjWRGTZ1srjwQzfRT6UVOFhM0cxei8IFoFp8S95R IZe3wjIumzQ60HLaxpbG1Nd0k0YqKjWT4eUVqfE33opMo4hfd+5v8hV8MzdAFy6O4chU/BTj kQEdOgEvJdaK5NuOA5e0gA1zaDJfx6oCKV526Z9/QImAkEjkT+hKIaPbMIJ/6UkbnrPIbN4+ jodVbdW2U1NPLafaUZVqWM6Y7fpx3wLU6lF8CiD2+TpEc6xIduWfHhHFbvgHS6Zb7Q9+2OwW fs/+Mbv165tZvKjz+Ub29IJ4TQki6EBx0kHs3bJ1GCc4O7r18yu/BxE+c/90p3gF+m4mfv1j CQa4DrGNEkeISt0kiUgyXoF3emXUddNVzehe3rQkxOrPCcm/R5Seo+mJBtryowblru7b7MU1 RXjwt6JwNn/hBv5fkg5FjuNGW3Ba74d5AexTydDygCJU3IKmaC3tCFSvJUuXUvtbCXIUDc2N 0X383FjA1tDflA2lM2gsK2e/GW2/7wy91Oc0s5R5KrWBx89y5JG9nM6dIxpInh9z+8SY3146 5vb7xsyAIeL0En1YfC5Z7HwPI68g+kCc6AWzpZUX6/lNTinGRhEi7RlTDLOVhRfPsmcsr4MI ikcvw9vS8Baj8NIuzee4FYeL5MGNeH511B/kKFOOtM+zmkElQzjHPPr0D3yUKl/a69kB3AjL evLYxZ8LKUMt4Z/FO1N/2iiP+n9auYIdhEEY+iu609iIetP4GV4NNxezgx522Pfb1xYKjN1M TMxmWwbIeG0fTWVCWtZNK8StRcKoRz6LU5kqoqEwB9H8rwc0gnuts6c8R2Upl6AsN1aJzcsG 3yRbwUQeYoW+IXUkviVoWjZuDUuEGVrKak6b5X4mAtIS4s9moOmK0YKUEaYPvfTVNcqLTpD7 5Kq5UVcMhCs+lJV5cOud6wKt4HSTC+fRgDHm1amcaUVavgWuGUd/bSKGQ98bOhhwk77Hqzvf XOp+HiuswEIawbK4TlCu54tPl+yIx8AgXHrOEc3MohMGosAHACQGQIt0LFH8AHoYMyIhzz8Z s6gEk880pL0Ul0Fw7+JGfSqvNn2WOpYnB7q1+Qj/9V8f05vWLbolsYZFr4XFJAwoX3KnfCx5 4Wod7m/U4Su3sUsLYfoiXJQEuxOh0m5jbEcQkrXoh15pJsVg66yiP1BLAwQUAAAACACosRUt YyyvCyYxAABO/QAACgAVAF9pbWFnaW5nLmNVVAkAA1z0Yz0t9mM9VXgEAPQB9AHsPWtX20iy n/Gv6Hh2GRkMsU0gPIbkADHEe3h4gezMvVyOj2y1bV1kSatHsGfDf79V/ZC6ZUnYDJnd2b0+ M0aWqrrrXdWt7s7btQpZI7djSrqzaOy5pDMxR7Y7Iud2PzCD2SY+/lPH2ic9mz/ZHNS/kuZm k7Qajdbbxu7bFl7uN7f2Gw3y4JgTGpD21Cd/AkxEjqBtgUoc3ijp264Fv0MBMrbDyAtm+3jd 3Nvb3mjsbbTekaFDCDkJqBlRSzza2WhsJY+uqWnNyNALyNAOwoj4cd+xBySgDjVDSgx50dhs 1DT8bY5/ZFnUIsPAm4RRgOQZ2NZfzMHDjyGp2pNRVRKso++q6IOx6brUIZ5PAzOyPTdUYbea Kqzv2W6UQqaA7zYaWqMufXwL//f6jjd4YFdmEJjAqzkAQdk0VFGbWyqqRQeeRQMFAsT5TqPC dGgUUTIGRlWoZktI3Jv4tkPJAKTnOjNihuRkfV2D3FPbm5ggvSkZeO5X6BclUCejwLRsCswO bcfRaGm916i1Q98xZ70J0JxCvd9otVSoEY36fW9aJ95wGNJIA9SYD+nfY+oOKFxMTDeyB0rX uxlBOd7IHphScV4AVHP96LQA2g5Hu/Ase2gzAYYgPgClAShEgd3baOxoko4jy4xMMqHgWhZ0 EIM1mn2wNtBjTgPN5kZDM5hpf0KAH1SoBqTpk06BA3sC0gZufDMakzCKh8M6sQLzsefYLoWe aTRIW2htNBtqC7/avrSbOhkEg61WHnGApfULcoodj5iBHY2BQ1XYANvay/agM/IeWAUP0TzR sYnpQsOhnzVjDl3Mdhi7vQBsFtGjkcmuc5vQXH9kDyVVdTSyHM8ArFbGyFi0AgOfgOWHClzq QRe2C4EkeqTmQ0giDz1kMGaBsHP65fJkb3tOvAy9pene9WywlhF1uXnWSehDKAS+h0M6iFK8 nQxTYPgWdfqBF6XIKfQu8JM15zhhHGgdeDQY8IhNmSsQEJJLBzQMIRCKhnZRlk2N3M7lLZhN GPu+F0QqmHTlU3uKDo82yfyMSQZ/MsE4JgZw5n+R56X4O5lwi1qChhymL9t9EFYOVynO+0QR CQ6dRgGEBA3m/XxoTmMYEmcGfTti+QryAugwTNH3MsoSfLNkFNDQnPgOJhSIflFqgRyvVYT3 9xi0C/25IXaX4Mz5kopjBgNw7sHYCzC8oPX7kB0gCyYpYo+pSnP30JtQ3X0gu3iPGLT9Mbgx jx8pfisT1pjEQTQT068DFSA3czCAXMuzWooNBUKTJaj3qgXw3kfQzYAnmoC4NpctR9jLqCYc BJS6SF2f+ECyHdlfaUiMR9vdatUEXguzbUOXE6gc/S7BUUGlREQFcuL5s8AejSNiDGrcVRCS 9GfkhkL/ETmHuE2Ojkku9HYCfRpQK7AfyHnsWmPR+A2lzMav20efLtpoFJQpz3a5XaHQ4L84 RJdDHUIbNpYk/RifYQn2tlKp/GC7AycGh6zyUm1zXFVvisKN3a28RSLdoT2KVaVsklMKpcow oMzVgUQ6BMqwEiMzLyaW5/4YgbNTaxO7/AEeQ/YgP3duP/c6F0dn7ZPPV90bAo1jZ/Rk7Plh Yo4pwkqK8On66OcE/hM6exH4xVG327k8Q2DMkhM6gYoQgpnvoyMBtSz4MeORAkSXzO+2e3T7 Oem2m6TEOeCj6+srRl+eAxBD9ZHaHHL79LR9csvEEfp0YIMf8dg8T9Rfvxxd3nb+u42w4OZQ mfwq1JJKQ8f41D7+woSBkcuEXNaPR6yEThip/MD0t/K39vXx1U07wScn552uMa0RA79+OiQN 8hH+3yfsJ2lt78BvvN6H6+1ainfc3DHAoW3ENAwIhzX/zrBr94D1E9mtkXXCfq8372sJznk+ DsLoWArODeB8RYSvSM9W6/3OLlL0FSliNzfIzvb21k6txux44xU+KC9o6ur4L6AxAl7Yuezc 3F4f3XauLlfYhwO8Vl+VaOZTdC7w4hhKvX9UINTACOuq/79gH73PEAjYHTnYYtn2oPIkb3C4 g0oljMBOBmDrj2ZgQQO30C5/KEF7eOsAA8EQO9RdL0tIhRMCnIJDPULhBvEGRzBYj7LaL4bh CfwfTmdsXERGzswfEyxioTp2WL3CPyYkyzgIsMT3vdBmxuw7cUis6YwnItP6amIpDkHRsKB2 t2bMhRAZUy2/daD8buAN/Jo28aqZPgvxWYjPQnwW4rMncoa0HSwra357DcLJ8EDTAU9oaaez 0P6Vpj/7MJLEWprfYX1z6YR34FL3ivJOISMuoUAET5RIYVw8rFQk9WsELgXcJX00Unu5iqOa 0GaGMWZLwAenHKLYGwG9AmksDlxy+eX8XD5msOQwFddl+2dDa7BOVlVLqx0k7UrkQ9ZiDQS/ IiA/QTEQUYP3e5DpGNGfEnuV0QvvQqJ2o6FRlbMFf/aJ6cAIGMf//+NW64JcaFHKKeVh4wOv WA+5bAR/omMjkWctEc+T1A356tlWpWdR1peRK00U9YIUW4z3EnqzMlKoF8Ltzi7oBDLAuZE0 8JSG6cQgeidjOngwPB9jKXxvfPD6PXQGVImutEpFWk6KfRSKq0Q6ZM3zpVExw8npiqm5O2sH Qe/YtDo4jHFN5wRkZxRpWlWELl6yVmN0y/BXee2A3/7lpN3FIA+11/XVl1soMFa+S7zHRA0l RAB1S4hlHCsBhH3BoALGNhhl18gkDqNen/aSiYpDUjWDUYw1BntI+hiS5ePqQV4jj4EHKmFj M0CP3QAGuiMXopWlDNvKULF+z0XHAq0YGTJDaFu0Jz2tyi9sKEOmLG14Q2jBHT2DLgeb0IC8 XLQJ11OxefdjM4T7clYL8Cro0FB5C1Nro156nSv218Bn0sa5Gd/Q6IZN/4EftKcDCVknVa7R xzEMPnCAE4ZiSEerwlE1a3/K7/iCFbLznQtcTsOlx8GMWnE7dsimERbg4G+mE1PJBBMSpGUP hBTxmYilyAdrWFRy8/0y5TCb42a1RMdpY0ZqAWRN+FcRIbI8IXMUJU8M2QQWncysatJroQDV /SFxza/YUDVpo4CPV45en9vn3fb1zcr3CVnCvSCBVXB+FUq20NBCFSgsU2JAeFELIsAQeRbo Ou38ctHeh6rPSgfcWGU6dl9i45QKUzUf04jcjpWjrAsn4NZKuYMk1AmUfQ2l7IByppYoQmhg oykIYUSxImDjg0pgNunW9AJBgCpZ9va/uu3el87l7S4xGtNmo/ENy0FvaLB7tZoOyCe/ALCV ArJ7WcDT86sjAbqVgoq7WeBPV1+Oz9sI+y6Ftby471AcGynlyxqq0LHDKK100HbrqKg14lB3 FI3rOYlAPmHTbqxQ+EeiX7tOXC511gPB5tWqsju7EVlKVAfQoVoeZKMDFiIiOGSzYFnl4KrV 6Tmjl/WUGgRngqyuakzhb5e8OSRr/HcJZWrcUpsoIwulAZRNeNEIFkwMVnqtksZ0OKyp9oqg NTEsSWOWGvILewkfbZzBYk3LJgb4Sis1z/2kXeysOzuH3jIKIcoH550MGyhvHBAbht8u/Flf z0JxMtOqkOmAtXzWvu11btsXBjcvwaf6YbZEJxwHCkQoNM9Bplg8zgMb3J/WakxId/Y9YLH5 C2whA/+U/Hoi1AEhvBpniSGf0agDPb8Sc91Z75dP7ZPr9umrMp9c9QNqPhxkjIKFnT+6UTAm NLkg8r+9OSzJdrkhiKTyL2cKPIGlYjt1PBMF94ndLxKN4OYPYBMv4e9501ia/3Lj4KXFv4lt cKz/WNNYlv08y3hKCztR+yRQon6CVl1R/vEC5sShZmBkCmleJKZza0k5WpEvbpU5TF53Tvmf maw9edG9ps5gTkEhDfLtG5mSD7y2n2I1jHdm8tFMPmLztiXVXgfnGkS1p81olBVi+I4HmnDw RfWMBsmAhU2DigmsXaw25VSolB4qWqZ5sprC3s3u76b3qY5kpYcQarWHH+a2OKffuTzr5VV+ igLAXI5j27FYTWtU7Wqd+HeNe8Vw5lu76bZPOkfnenvKkC6gpLmz0bcjIiYTQnvkwugYXCZ2 +fXHjx+lTBbifF3lXUoyjILBxGci4CO/aueguVOt4XxmozZn+cUci7dSjVrGX5jfF/d0/IKu jnO6espYziR2IrvYbmA4uLjhbLWWtpzGnGKl1tgylFFKlqqMZASNItlaWCS2tDj8brLv1n1G DYWoebj4vTVnv805nso5Klbgmqy6iJ/tpDXXyRADNgYvvlxkoU4s1kmSv7VupKXI39JiYvfB 9R5dNiaXvUCznUuWB+Dq0nPl24K0V7ypBl820q/wdTLKxMDAczD2qXGYzwkAmDoBgGui6qRf JybvSGSvYTrng4v7EIv04+EQhG4MvTgg/VlEwxoBsxyz9/VsgQGJxvjK0HQlr32KQsbVPoQC JGDzwA9Bhc+m4ByVaow8eqjWnWPJ9dwwzcSUrdGZGBRdYD8BGvtGE+cOePK4GrC3nJZRq+Wp Os0TXGgPYLxyEKe0jQ+a+AAvWvJi656VG5VMm/BIpJ5snVLm6YnRZry9QE5Z08WPqZOjyuVN d3YUjHpdMwjpbexDrSKMCL32G7rRKvxYBXNZBXtZNedKR/nJlA55IM8qKkvcwkrTeslTYEZo uD4JHKlvO3Y02ydHx2fXeXKTshNTg0jQhw+k9a6A5P4caHOnAHQ0B7pbIjQJGcyDPM1rtchW NYhmAjEqgGglEP0CiK0EwsyByBq9/ORFefw8G+mlNBYyoReZT6nppOkE4+JhnjJKWW7lslye d/AzzBtQlLE95GxvNl6N8TTFcdaHi7GuVUuLTtCylxP5L2Fe9x3M6dHJ7dV1p/2d38IoCz56 mFWVdB1SZ1gn2rx+KNN0+qYmfS/DhkZ1dflKJvUfJKgib9+9E+Vk9jUP++JDrUPeIPxtbe+I FrAxcqitJ8nNFUgxpIrwm2HbtStMFrzoXhWkrs7EX26vBStV8l4Nqbw+84ooQyXvSslSDE/U SiK5YWXEJTSXz3LeJz3rKU9KVk/H4FwDLBSL66Zy3VKuZb2gquoUbUWhUx+Na2uHGJE5I3Ow OBcev5bBLWAHaAZFVpCv/Tx+yo2hjFe+meaPzPERY2BZttluoj8y28eMgWXYxhV7ZtCT25Fe wPwCbEoWl2YJvfecUXgmCeTtFLGDUKbzr8zONaNwQXY8n7o9358sxQcuwHHNyeK8SISl+bkC 8rrdCyNtoIgRKLZcK7t0sIyV3FWGzYPiZy1tDG46/thUcjT7jdlhc/vgealcvbl6882q1itQ zhB9pWAdp5oYLaVPW/Ip63hpwR4zcYmOxMherpZsyd/YwwrLkQYrf2tEdPYdqryL9u3nq0+/ Y43HNxpFy5hMXkS2+MxJMm7PrK4Ua+Lker3FCzVbrdJ4J3ChNjenc9mq1ufcvGbuslK9XT5z LxZ8dHGBraGsUK2pwHUSRhYNAr5AaIHVHcmCw7k1l5xeNmfFVkb+2P2xmvtCIB1MZ7kVhrvx IVmiqKyMXoA2N3acZBljad9Pz3rYibAvNKjEwbg+NQV9JKUc7LPO68LOiuOfMOfW7xECnw1t vymwFYw+sE9dtK1n4letbASy/FxujrR7fOP1b4khLLCSyV2zdb+AcENjCB+lopusN/CriV8t /NpSF4Als3wrC7QqP2nrFRn+c7rRHr7DW9v4tYNf77WHu3hrj6HzRpqo4TmtLOVVF1zuOb41 KXMRf7aMqkplVl065eKWRZXickL/QxwZGf3neXHg+UsZBI7AwIZxGxTugko2SJWJ0cC3asyn EHUVcVcReXXWXN6EkGDN6HVyik2Kb4N+gU2xmaiEe9tagGP2MsK28rlLX2oHlG1n4xk/Dmmw wVfeWmLPNnmggUudUM61Ju9erLSYke9bVtTJqVOGfuzEgeZuEAWV5Rbp/HYOLkSZyFsEvZWL /olGpu08j72Vi922RrTtjnHn3vNNvHuuiQsvWKCZ7fxmJn0vDJ/H3snFPrVdCwlZoIH3uQ3c TDwvGj+PvVuCvRj7e/ktQKqG8WcpOpisGTvR/kLl5aVHwhhMuB9D+7YrDDy/0CxJhSXTiOkJ Gsu4enpXIKfDG3EjO/HMdh/YUailmJtxPBziYQK+OXgQ7p6WO7hd6PrsuHqg3A/Mx/lHpbHl Wxgq4yKBX5JoFN0lNfWCo4F0p1OZgpBX1XBcqwt3INRyEgWF+FYWxKVOkCPiUivi5Zaxcmrk 1qzujDfXOw28Cb88cq0b0KPBBxSqZteYMsnb5OWmoJBznydcpD5ZPJ12dhQKJiQuVAgkTwfJ hUZIZvI8scZiY1fXsy2cwiFVLpa4edrGXF2aqhNC9NQM3eQ7aqWXHGDzgoz8OTn8Zpx9ucTX /iXJml/GLu7vSV+e8EUe8V1LWcHE13vY2j25UWaY3H0i4hAX/pNvSqHKhm0bKhG7qa9VgVvD ZlKuSUpFQ34yJ6IwKGHwbB8doDw0XGG9SlZl0/W5upQ1WBwsJKL6poltzV7V2MaPrEU0015k 6Vc+BynJVZtXT1gl2s2ct8CFb4DTwmrg2H72BbXoYTPm77nszCqT9DFfJNPUH2spL39lwPdj TNJml5NuL056a0nSLYtNYiPpwxeRPuSkDwtIH3LSh+WkJ6WG1oTuIAWoue89FVR2b5ymsTMa JVFGD2oG9yHykXun3PMvZ6nYTvnUVcdFQwC2Oo+YbrKEhG3mGkDZbdouX6tGlVO+hDGLHV9i LTuWQmO5QnINaxORvLILyXWgZFX5ShqN7IhOcJIE/iTrVjBvspUrgJ5Qcmffy9kUDqzML2LX MOAUK8XZUvADflfQzUWwouhn5QmpYNzciJXrCFvHnX/Yfk1L7tn4L159jxddAI6ve9jpfUsn TI4G+YxfLDIGZN6eIK4KzOVfAHGC9cSaIad41MuOCVyWW2wnDpUlGriECtdnZFJYCCPEgfpu Nmdm4LdltCs+d/BNmYfhncpfczMKBRMyzyS+7NsA3okS6LhI0vjQZXLVIo6mobwjLkSjdQ2r PJxooLp4tUfSATKLNdX1JEJuOpm42naBRaVZ7vEla6uEezwT7/twiX+UfSKCsJ/U9fKvOkdW 4ecELuNBhSdeuPGkz16UVflpBOK3NyROHBHqRnioalWZa3LrsoJV9rrjz7mZqbwCeO5dXamj /YrRiofekhfv2AYbr66uErF/QexdOJX7FhTzk4vx2NlNogX84HYEKHwjr2RNoasOtvHDDjE9 JHKPuSDVrWvCrWvbDjMLq99gE4ssoVbmQbpM+zmz7KytFAePszPEPaXUUITBl2QKUcibfCQC 6r9rNlpJhFUlnV30JQ8XSI5LUFYhqrgc7qeSjSSZhWF6aaR2pZX46oEGui5lIcMUNa9JHGKn FrysRvlBBsvpc06W81bbyd1t8xIDSLb1yI649D6Q5nM7GNWKLKsqtAx77V2yehk75RVYAeR6 MwO7jgeDlcC3svDbzbm9MlKGLrDzfmc3f2GubHAr2yBgZBt8Wl7cDjvFK2kgb/ukMEU81vur bcWmI3SQGQgW7LLMl9Azkn8J6bkxgz8prAWLJjxFeuolJ7Yuk6jE/EQ4MB2cL2tuNrR5C15a sgU9jUUmH/gYkbUGf19Y7TIh3ibcaNIUTZeWvCAQft71y170sCPAGKsi/dbFXFkmy6ZR/HWF eCWkyA87XEiY+eegMLN6/YNQeNmmpQT9kL90AcfuYr1rS+mXOoBF8RwZnNjhn+JQQLk/V7zw lXtyF6OqGnl4YrY740lK1malomHDCDELnFVCsvWJF2U+tMP2Vur31Wnkm97N7XXn8sxIGk1O DxSMszG4sDtmeJh1pL0d8n9wYEXExa5j2nj+LvsXBmSCXtGi4UyPiGT9kKhyBC8QkwYrU9yG TTawNl1Z4VujpehVDOid9YDg6n3EmtDJwJ8Zmr3czXCf5Tq6nJw2eKqssDif8HGD7FrsaE+c 4/P5CcvFTE3nGctPtFlK7qZJ5BdG5WMyWBOOvq5EIS6D9XW2L7xcDA0mxYQ59i0z2QLqlHMs eLCy4D5bbKWWqJyjkNhhluvl5aSGwYKDFXjsyjt64BlBZ08vKdluVyLtPJSs/LPP9Hokt7h4 RXHNndXwvSX23PENrJfvIVXpxLkSXdxM8x0/z/Tx869l1IWSE2El7wCO3DCT2+//u8LvIud/ mgPl/3rKrm5EDzlipxo+UjvAsw0H1Gf/DpB0kKelZ8LUs7zl0fHqUf9/xSPk8aD/nFlncbz8 0hPPuOctDsL/a+9Zm9u4kfzs/IqxUucSZdoR5azPieNUyRJla6NXJHmd21SKNSSH1KxJzmSG PIvZ5L8fGt3A4DkPauTEteeq3VADdANoNBoNoB+mnQWmrikszOHbh3nEDgnKt9KzCYZ1eET4 4YqLo2Q/EE/jc8qPYoTaCUXiF+gFdqCoiL/suqVfbWK0YhqdrBZodiJIhOYpyl0gmWJgDbRc KLV3qUHZPP9yqzBDKezzi19+PyslCIp2xUR3MydbHbDd31VubVzVLrbKdHqv165Xj0cq6gYt 7/i3KNvmRjplNi0I3bpVi3x14CSlZy+nZQ/RFgimG9uqBBOVHAjUJw7+AZieD1tA4RCdrds2 LaaVzYvgq4Bo1lQgla4b7pbTVNzwiM8F50sHpjqvexhwgmPolrogfRojLP4eywNYUygq/ON7 LklrtmTExi5rzsVekgeIzxjP7Itgy6XM8jPvq7g6FBEkyL2sJS5paiWlvrAIAao/g+p2VE73 9krjqnNpXVXD8Vy7c4Gvso0/PzSZx3Fdf150rw0lrA6YoFraHQYJwdb4E8UDKw4Vq7Wzrca8 aEe6ZFxobcY1xwvzpa5ICOEOkBBjosIlfyGUodEu98+ujs4vTwdn/f3L/tV1TcZC6WSGNkD0 PhY7Xrgv9qDnetwDqCuWuSf6AaX7EFNPwJdIUV7Y5U12acwdhaXdF+CYxsMzUwn7tuFM8Xlx T556kbu8icSVb2szNcZp4qg3nR4ODKZTbDq2CdOz53BbVHQA63xHV4L41+NXUE1ZhzQipmzh 9PKwXw9fOaP0GQGwLjn50Y3BSjynHtEreAl/E0fhHypfqYyEE64xEg1e46c/inc5ItSr4BtG BpCI8sPef9PlmjKkdwxqAqHBRCq+pqNYq6O4NUZRrBDHnYjWUfvgqFHgm12VBsbJ1HrQtcDZ yD3wxuVkexNYb+jOkbNpOUsCvtbZjHwb5DFjtHUAvmKY4HfBdnp6onDcC1GfhcdVGdX0zvRe +LpTxiVOgjNUTSeMmkmycbyANJB1m3Iujl17isseHctkLmU2bGt7vJbRYj//LRNSm31MnqRh ngeoRHwbzONFPAeljGtmyQSzr86jcQyiU2NaXCJyJbFTE4Y9+i4oXrSKpaWszWuM6VtncarL Ep9Y6qLxrm56AQToMp2Ph2zkmbKBPMqQhUvkFTEWojLUBFVqUH0Z/+haj1jvf8PcRKF5aAmt DZuH4HHRKFmMaxCAFjDSoQYFzjVLgw07WAK2oaiQ1gmNXHo3sKOjLOCGKV2lVi5kyUJ7ut8J dXjdf7iAcvrDyltL83hYWA40kl6UxRwsDOrJMzhdPozPf4eLT2ujKP7VNqDFUZeikneq/BK/ rCYOG8XrzC1chX8JItXyjti02j86Oj5TIsmDWFZMB83o8zaCH9/tH+rgL5zglgcCVH3S4xfw jMFHEWVg02/dVSs3suxwW7lhRHxV6oSlx2eSZNbNAO1MOGfW3kROMvMEkiOJpRmM4zyFxFwR 3HPoOZNEFNw7zYkhdqWNz/4EXJ719xtNddHXVzeQOn43cJoHbzLjvs79uArH99c1i5uoeSv5 2NZQzcpNkkXcrRGTcWsyaX6q5tz0M9Dd7kd4h9Ikv6crkiStIem40pb4LPsdChp815g50bzd yGMN453GaTCLJssA02wrCje5f8layyQNhslymcytWs94LbyggJOEZaxx5xOVwVSy5T215W92 rZ59rZazk+BGPSs95jp65nThauA4LnmOsQflet8yWiy9ItdXhJsHFD7wHbGO2KyfMNa4BM4o OdE5KCCxOwILK9ivk/Q156gNsTti+Na/OShD/KwCcfkRtwzz1xWY/bcVHsz1zrb3HGUtzjHk ZQMZ6Y7hP2OibnvGdIaOYZEP6MviIQyHSaMATfztmMHIkLzq4eRNtHz9OjECD0Ft8Qpr7ygP zO3ENTeuNAy8E5CJgf/oiR974gdPyQApL93jJufSJkPf1FMc6vWeB3HveTMHctPbTh58VG8r RvI+DUWjunDKVvTFev5QRU1bFDb25/bNIJs/1eW6q3lYd4y9qtcYZ6zhjB049+rg5ObWqpNy V/NJBu6VgWoK0nmNEbRcMQ8e1BkHYxltJOxvbSzNLXc8gSKyBP5i/N1sQWiGy7cMC0Qifekq XGuFBb4sytmWT7wnMAQyb6VGR1WFWJdXFXqQZOkCNfqX8mdP4xsXUlxVFrVhivmHtfKhQXrM YpFeFBTWPcY1OgU7HdG0o0jpBE0v0I7bymk8lH/JDW8KTDYVRQi6tbuORj6TIvKb3R9OBTGl 9799kp9b4/2LwdQJM8rPD1C5sQUYbITQMX0j5JhKDBGajqXi7gmHWTnK84dxeRw7UeinhKoD XKwcQ9cuGwQlXJgaSLI2eUu1Z4TrgP7B2/OLK3dUvJskHcSNg+OWxg2fhpCMumb0Q2h/BkeL jQLWmcxShz+27FgxCN48Qh/r/An13c8gFYMfh9mHz3Tsh9j1zYceQxIFMIr+PIdfdH9jEvBc demsUajSvwwBTkXnNx5+PmI7byMt7S8z+Cvs+sZDD8dt7Y4YVZib9xfbpQjegscs02Wz8NWs R7rfJ7GXejJayd3cYYGm++PSnbYIUR/U8pCVXLYaLrNw1GiH+4+g95UgTBXRHzQleTu636df 1fulul7FoJPPcxs/v8MWfvuZjvmn5A6DZqIb3BhWs+SzHDuTsqfY+833bRIcnzMZhPCrSwvh 1HS/R7XDy/33rlgPk2SxdCQOG1SQ+YiBCUdEqF9sWDG+5wozDq8JikxHvjWOmLoWp8skC5Yh mI3chDlW4pZehg2Ka+c0btGms3V6o1uJyE/Ubq0TP9wP1TnyS+Rd5Tc1VGm8bwKAwTDG+tnb beQERe2VuZywiVKjQJz1329b81msBfjGB6zejnMUdBHoicvIRwQuShBKRsRd56uAvrnNKta7 4AfbU5QZiYv/vzT0qhP9B9tDuJ/jX56OwUn0qvd8GxJ9K/OlJfy2gNZuoL1SoNtdN9TX5U15 oJ6Xt9VzQ70ob8sD1SulRu4bWK+UHrlvZL1SguS+ofVKKZJ7x6aRRLCyOQXfMS7UzZR57x1V q3D1gu8hl4KOq+fEpURslR0G54K9XWv1QvAw9t94AaeAJ6IXWCISe7JWngRrZQ19iKI0CJn4 oVsFiDQGxt60GhMS42Z6ctoC1SYYCrl49c2w2D7waVXd5cGrmjaacYSvEJbUwV2niCUvncVl wx3xJnIazQeH/RNeomkT8YIThon7L+Dh8mM8Xt74WurSjmTsHACnBS1VciRysSOyqDLRswOV X3IQNfYV1nhsTDSvDAtWJxvhd0Zh4gSbRksI9+gfRj3fO/E3TrlieNkNhu5n1DfQb5K/0mvV olWNbZSH2ud0LbfD081k1P1CPA0Wk4pD50i7KvfrxsZl7Q0DM9maTMH6aNhRKumr7qXCCS4u UHYg3LlesfO0zQeKKZvYEYUCCclZNKGhUkK3COUon3yfgwmd+L1WfoNJnfzuNabjxEL0urSa JhBdMoxn0ViRt9VBXHkaW+yuIzYpdYjtko9vZfeYPH08LP667WllvcdDX+epF2RoTaMwRLPj Pd87vFsejuNx0RNlpljRUClau40wFB7mEedYKTbyrcpsZsJhjUFLpYHqT1lXGtznwi15n6+1 XovB5stsxfYhEPBgm3nI9hocNdpq5j+DkyoO6N9bJBfBnudifXC0WvBH444mNNmm/0e3qM/P Er76aIMn62Mgcvj/P9DbYLFkq38Gm+QfLx3H16CYoHC5zEp2HT4DPAupZakEYRJw7NvawLvW 7tpFDL6j9BjiIYAfcZPjM5rk8Izvu6b5ATlk1zgziRAhWeW5x/B11p/7KZbboyrvZw/3wTRj AJmF36yLUynMRk2oVOaswNrSttKMHaWiWm/L6GsQb+BnUFKbevCIdaErCOl5lBZCiRFkPxvp NxamfXYxMMJ6j5GjxSShXN9snrQ9XlQ11aBi6irDDTysOUnuewPXNm4gqDtTr5EozskSehN9 /lTzNLpJssZmJiXLibsCzO66qO53VZV64BhTdsDpU7a8/E2b6w5p8ylmNZrN4rSZh0KTea0z h23OYMM569PoS4Xip50QOIi0v2lVST74X+zMQNlgezmBrleSkoh4N8MnpmxGGc8Nwz5fhMub wdGM6WbRQrnpxqsh4ay4cwuptkrJnm8QHJqh1W7HF0Yo5GBHv6quNyXnsRLk2Et+DPqrjZ5A +FhFKwsvwa1I3+CpJ3LfiAHy9Fa365/jx/EvFFS3dM5RN0u50a743ftF5vsVn/aU4me/qKwh oriizSWMxE4F/EBzzi9qtrUKGye1MLLGNVp8sRrlqO5ic0RTh/ZbXGOltPn/tdJ0pTgmzLNU /qS1gK+KD/ir4v7l5fl7/mg5yZI5xLkCAfl0BGdkkr1i/rEIJhF/DfZz+qXIYkJQJoGpyiav wtQFwmAFo6fvA89pjvzGa4Wfp7B2AmMNLZGq4sucRSGBSL3bFLRSrhur47FHtykbazSW7eHF v+r7V+b3p/Cp6JrGqYTVoQzdTcaUxPxEWRNH+SxuZur5H3buuBAk2uzoEfyZp480ma2nzRxu XHvJTqz+hVmhDBng21k2W//FblM6U3fedCCQPURv4ukBkwnENmJ0jHJ45AuzLFzL8Ci38JoN e8hORzgDLcDKAEI4x79FyYTvL53qzSymDSwQYZqVDQ1/YgodtZB90SSKsQdZGyFOusavMGm3 a5v/pDtSjLufT4gpddpizoz9ES6ms0bCB808a90iNuC77Qn71yHm8xzRmsiMSzm0ZiffdoR9 i6ZQDFX/6Kh/cH0FyXnTKIvn0WIZsv7SP26HihXbalMzv6LWnVwUTSZgiDMPF+NoNsyS5gcK eo/+W2+vYJu1+ZEkIqhli2Xhk8yq/roKZ/ESJENvV5gMUDWebfbJs5fib76mn+w9/dtLtRZP frX3Uv7NA9DyStU8+zu/Vxizfx1H5LCy7VB2sSt/95Tfe8pvdnIsw0QEaGzp1+czd1pMnBr0 qkvU6AYSvU+OEAcskniDKzYrnBuZkMfTOQTM6e29qHm+/H3iitzG8WxImTM+IJ0ohK+CFHma RWHja+QxT9pYPVrcnCGv7mbjusLeaUIR0d2jAHt3fXxyfH3cv3pA/1oWVy5z3Gz0bM8wCq35 vjxcgf9SIWOG62WUF3/esHP9LMG/3+GzI2uM6H8DKscsqevRkH/JZQj3QOWtwg9ojv0X2nk0 S9zzzFoEDWUbO9AJtlnDj4Ld2yP2j+1k34GZWfAYgkUUnzVQYa9xecDIxD45HJFFj3iHOiaD 2e/lgCb4/nvetGi0y5tTuuB1Th8l42iExg41p82Vp3gnmOfT2uuIIiCURh+jOq5IVwfnh/2D wfk/+peX786+/eIBaxrsgZFuQcJU2Wy1eLr10huLChG8vjz/oa/CZ8mHaIHJbSDEZjivxvHu 7Iez8/cKktWCKXfJdMEE11hFxfOLM9GeV+M8OD87On5ToOQzBPCTeLrCwDsY66wa1Wn/9Pzy fwpU7LDNg/Vx33oDXMYHaimSCNiBsGZbj/TCUB32X797A8MM3vZPLvqXV/cj3jR1jLfpDsca /m80SNNGCSBxzYB7P1hk1BJZW6iGc4BqR/Er1qmLi1N9w1HAhSLzV1O7ARfZr6hbjMPIRzfv EYfaixXkspnPk8VsHaxytggFNgx9SqdabtnDUxNYpj2iQDUDEnkMrMqiACt73Ceoa2+yML2J RzmelyI4LXWK/si3IqsNWaL2qHha8tfPEUDtFN6+Kijo+s2NRN7NcTQ42Qos3bG4YanQ6rM8 +7rBZLEFyB8HfG3FoDS7ADzkwTILJMxG7voh7NRGZbSWcNcXhowGCLd0cEPwIguAHtHdIFRo D5zu7TxDp1ILjB3J3RD8rK6wgGDoKzZT4zAbB2mWjKI8B0thsdqQxxX+ZvsX3DFZLdB3tTf0 ac9Xd89ReYABaH0gVKwDpmtH9XRtVnL1g321F9fB5f7BD7DxCuAsHH2A3dtGIEocS2uUJTZT wUe1Xxjr0jZLFCEwZcUbdsZIplk4t+rKErU6OtNadfGzJhHBgNcWh/BVq+ZctNZ6NVIpuwGK ckM0g5rlkszkwWHMksyohvAiYZqFQBQ4pggji1sQ+FntHIZ4tCvyz2pFCulu1aTvalUZh9Gq LEus6jwCtLs+L6LtCyEobJ5Vnb5rdSnGnWsThe+GKS1F2nLVpiIDoIic5dymZanVJyaYnH0K F2ODeZxV6buJlrImOfsikm7pSoMHoChyA/AMTCVQvNync2B0HZLRBzfhAiyQZcxOIZrB5TRX 5XMReceWPkWZJhyVYDluGCq0gDDIjBsGy2wQGd3EAybLLVAR1MQNKEotMAwG4gbCMgskHNu8 JAps/OTw62mBSl1tkJuztykq97ZYCm9Ustt3rBdRYFVOPJOc2BN866t7KyoL9cN1Sy5UkjQa xeEswDvBvGBv7ZLQakcrdeo6p3E+elqgW0SgE2ahzVOyRB0gfHQLVVmi7QZ0orS3AypQBVOF zwEcqMC3IB6ullHuvrbDmyDVA6HK+0ALMVgEzMNoeYpDQrUrAkDCwZVBF4faTFz86clWZWWK Awko2NEY3LyK0I/+2wgrbKQXI9/eKzDyuzdH7D93rD93O7DJ5JUNme1wKC/OeFyF0B3OtqNS 3DQI2RccJFIjFpNn+iABww3DHA7tlGKY/ZiDLjXS2A/8LXnD5IGusx6GB7D9Ep1ZX6gLRfq9 nSLfnuvqM9ihlmNIfOxot4tvqm4TvIrOgC9YHPxX0RuEWvPPX6mf1b6LWwfuSghtGXe2Il3z KZ2vsP9hPpBEFk5O2/Hi11WcrTsqcbtMNOS/0h8kxbaHPK3RhEmXzi5VYMelUbgUFdi4w2yq VciiNHJWKAhKNeGnUs+Bix9DlSrJ8F+sChwmZZUwzx2IPBUFPiH2eB41ESWCEjcRRW+YqsCo CnZONO+qx4WkpQx58La/fzg4Pju+3sYIBlC424U7x692kuEA5pO6uCVu+JOMaSpQvkwHsFxE RAO0mdCYrtPFagoagZx9hfErJfoFGacKGyO/H0uyjnCVJoz0l400zcCig+BJ+PPJETsBIaC/ bAS5r2CUzNMwc4yDsU5RPfD+43UZY1NuGYJ4ZDF814KQS6FBK/MwTWNMtMFB/BAIchPmN8Ri pbFSvAwmo2O0wWSArJrJCnfCNhlNdczfnNtU90eL5TiV7+eOmTKxLG9iJkvzIE9gqMAIySQI 2bjz/GkQXN0kq9mYieh0FkL8A6gMqRZhHOlsNZ3ysDP4gtYN2PYYLJJlMIzYmZpN/vFJ0Hva Ew0eRlAvy0GGMaEEfzwddRSr10Klkq/Ig9fxkuDOrFA71tPCyzJMR7O4JUxv4klLmN5Gty1h +nsaTVtCdc3OkSe/fWwJ22metoTpIhx9gPTdbaEbjVvD1NYsXoZtkf1qtbicRW1xxDRsD9lP w3lLmP4ZN2ItbtC2UGRQtKgng/ppTnAtSI6WMMF6bwkVY9+WMDH2bQkTY5KWMDEmaYKJb1Rx zra7dZCv0jTJlrhf4bdqZiHg9/Gi2gqotOOE6JR1/e7I3mThEOPj1sTFF4ti9Bmk4fImyJer yYTTA/70E4ObZR9kUd3E2I72hK9F0aR0lPG1KlxAmjVctncx1TjKahBLHlKLx/kJXVmZz/Ok C09C0CHjSLmgY5qU42KRfzUevuxXePhoXLe5LtqUWzPQAEUXa79RGu+OnufDPb2ZA64dKuOM QWvmS9IE9+h9aqtRmg9QcJdAaxJbI94srm5b0xS195h4Ug2taYcmdGXPtR1Ce8aMbqvb1vRJ E3oDqsH09S+uXr3t//QQJpAOfG/3/9EfnBy//vtF/w018C+2H1X3T9dS1Q5y+Moe6rue411y yXTXwey3j9VdsbRctTfzPK3GoGm2+sswKqrVKGyVVsMzGtdAoaqxOnQNhtFUVxO6cjo0zUF7 9Q1rzICm7JrQlW1ruob2dLBaDLJZVN2+qSJrb8bTsB4SUzVWkdwO59UINHXYhK6kgqYnaS/9 Yo3+k9D9FtdgaU2jVjsD0JWd0VQt9xsSN7sMlCsn9QrpdP/i4vjsTfHt7NmeWJC2mZG5TWsN Gu2aGp3acNEI6Xj+hlTdTjMewu+DucPSxa/QaXsD08/cr61eHc5J4HfLeBYvNbWC26M7zGlG Rg80Q2jXA79SrG/wh9FwNeUPAqisyaaTNFo4X/FEgY7HfLo0vI4MblHfPeXrZuEP5HvhLGpo WoXiTOKD5IUqECibYTZgczeOI4eRj1Gui7gxG6kf1ChXQT9G46ndR1dbqHzNmaoeD2PurAQk NFYGE7Z85mhlyBn0G3IyLSpxdFnEw3bype8o4WroYv/6rdxJl5ZFkHa6sFQAZ4NhliUfg6mw PnU2rdqFekxCzROGPdKqp+jDk0H/p4vzy+ttCO3a+SJeMF04xvVNn/4tRnABCbFFjFn+kEPr Sn2neZoMB0u8Sn+Ed+3888uS6TNv4f0olIGBSTTrK4/MHm1viT4zCslzDn+u+z9QSwMEFAAA AAgAxbEVLYvG0aHNEAAA41cAABQAFQBsaWJJbWFnaW5nL0NvbnZlcnQuY1VUCQADkvRjPS32 Yz1VeAQA9AH0Ae0c/W/btvLn+K9gvb09ybETS/mumw5p2gzBc7eiXYcMecYg2bQtRJYESc7i DXl/+7sjKYmSKFnOR7v3MAN1LPLueHe8Ox6PVHc7pEU65Oc5JR9W8dz3yOXCmjnejAwdO7TC FfZ+ezl5Sc5975aG8c64e0uMHYOY/b652z/eNfHnS2Pv5d4JuXGtBQ3Ju7uAfIuI+G/M8YgD dGkELdg4d6LYD1cv8ffJQa9/2DMOyNTdGofUiulENBtGzzzGZmsyoRMS+QtK2h9/eHPWJpY3 Ie3z97/+qy0GiBzfixjeYa+/3zPNDK9t5ICIFgGXxIpIe9jWExRg4iBDCSyXxjHNo82t8U0K f9Qz9xB+6twphoh98gcN/V3P93r4g3d6MXQKAiBb35AIfGgjEnDERQMpeYOhEtAwe+YJIkc0 JpYbzC1ir4BdxyOAmKgccBj8EUpnSAoRUyxm1MyA9voZ0NT1rRgNIfAdLybRMgj8ME5gj3vm kaThDymzjHvxeFHm/RikBtkzVKBNZ2AzMv1jVG9fAmr/em6fh20FkDzNIPpVcaYBmvhTXcLY z4m4mvSimDqeTcMZmTjxnIYgcwbO1TaeW96M8xGe21w4wZL2IiGeTgonbluRMybty4FxKLSC P9+UVXICUvT6e3lBrHaXI7354WNBJnoXAJMLsCbL1YU/nfvBKnRm85hoY518ouBHMRladkTO 3hDjBGbs5GSnDHgR0kno3JDh0pvMEe6gd3K0I2h+opSAPsjHd2dv378jU8elZOqHZEJjy3Ej ArFiGYFPMz6BELh06NhLtHEksdtqtb5xvLG7nIDXCpPbmbehdUKnjkfJ+fDyg3arEw2/Xp2S Pvke/r0k+Pj6lJgHB9CA36xJz+EZhzJmb888OjwGaPEjpYGPR9DO/wo6rd0OcZ0bSjQLxLTJ NjHMI53s4lh6l4AIZLEcz8nUAtMIUc6FH8UkcK0Y5F9EKJvgZev95+Hby18AUbMAs0viRaD/ u0Xws6XBAzmFUXQYRrN1NtBxF7jWsAsYfE2OsZU9iUfO3uXPn3sfyUc69hcw0RMLlUoOwXVM IBdFywU6JgQXF3iwQnR6XeKKDLVwZgs+NO3yx5/3TFAWtl33Rx3z5AQHzTUbo87B8VGp2Rx1 DGOf89Qrf3BM6DFAOifWc2bKeypwWlEMIo3Jre9MWoBqutpnGPe4Q/xl3EU6oG/R4nhdDBLk LnL+oHrrTyYUaxiwn2iS2h3ouT8gd+QVh4Of29t6a6sD9La3cRI6jgc/XgCYnlpVf9C6L/MC gj8LN4QD44cRI7c1fGWc3zZ7AEzOwb1KpvFidfNcQmU85PiufijIjC5fz/1qbI/D52e/ai6S WUsBwYsbt+YlU7mEcBXw4d1hExcqOZBrgpK+kAO9ZnLWuZD7ZR2IsfWk/gLsP5dCEY9snxKI qFsPj/LSpAw1x9PFpPT7taENxXqWMPvUQnGZdokBAimlcCQpfttQDLa6MUxUH3/SGaFNxGzO 6/QRvF4MfzqTuU2en4jfnf6FkmV7FhoHj2AbwYzDlGvx+HCmU6fn2YwmKOqOB8mM/urVsf5d /+5ojNa/XQNrIKyJsP09ugbWHOmvX+8x2L4x1SvVdPi/pqbpcSM1cdGPnkhN5v7zhp3cIs7Y GuQbjGJDf1S/JmdL8lmDFbm0IKPc8M967lUwFUksgo9ux0WRZH2qpdH6Esv7VxPsEVO29CJn 5vGKBq/JsN3gJmLzSg6z0L2RQopss8nk7ErD6F8cvFNQZ7UbYZnuIW7kPuu2pSSQKtNv2vYf rjO9JqV81i0YqPNHP6YvIbECQ5zQcOy7/jIkIV34t5aLql3D8xN09WtdDOV/rtiRWwtKfLE6 E6bFPaKx4E+2uYvpurwuFMCMZmBmBVj9vk+4wOU6t1AWS75O/vuAaor7V2BV1LNEuCpw6NRv iX5rxCHYnsQgYDUxV/xmPMom60yZalkxVM8lXh2uBin2UDeiKQIvlypRUkNMkFRAXAlMSxXu 66zZyjxKVY/b6eSmW6DKE17hfBcPcr6vt6Grd8AdLKPBnk7hhH8RlhUzI/M5fZQrpnxyC8vY fCp33HmIQ1YgPZFLTteE10er7LkicE0VlJ2qNa6C7vJTKnGQyXB3xowtrKZyWrFluzRSJJdf qKpcKlCyOnHlY3VdkvH7/CW84j65Yr6KmczAOCSacdhrfhBUEWQd08nVVZqbdRcrvOsXm3WB QI4AtyLhA45gHnMJXuKft4pMOOnTbvmhXsWMuutELUnaeDYVVlg4j6lY5YGj2hT9q2q/gaIr J6gsq3H4lUvJZsnd8AAWdhWxzstW5NUrJpSC82eNA2aybOFyxjlhqYYqTokVTBU3Cjx/7cp9 Tt2ZmvtCzXwfZ3DWE96jOFyOY2GTnN/x3Ao7ZBr6i0GpNfYFs/y6w6f5cjp1abKgxUBaupxz PQI+/mwxhD/x8kwX7/90CTsQJ/fdXMel6HCKHReiY1rswCtEvAt23YrOs9req+pedu2K9+Km vtjNL8bwfrZmIUACgfIxMHZoKaEOEyHdnIjDREQ3J+AwE9AtsDiUxKvqu6rqE6K5RcGGsmBu WSxkHD4MDs02N39J50XSOZVRL/Ko0xxq0nmZdDoyKlcAU6c4tJRQRedQdLrlrkvR5ZS7LkTX tNz15oePA+MgGRLPiipgDiWYQzWMuZ/BmPtlGDGNST1dCXBVCyAmNCnAlQGSSc3fiYNOk6eP eXWf1er7rEbhZzUaP6tR+Vlm6UmRWg1gSRCWGqRaVWdrdXW2ubKuapV19QzKulqnrKu1cl5t KKcgJkYlSZVTIipBIO/1EFcFiAQk4YhpTOwEJAppN2cjzzfrNPFiaCFi8cuJsDxi1icHLN7M YFiWVAhm4iajQLQLmG8kVDsfsIbSoG7FoEMxqCsh/vh5OMQEbsD2IheXV+/fvSRxaHmRa7Fr rxOKl2jl67fs1iqsvGmbTV3/dxLPnYjg1YNk/1i9pfmguAPc/FZbsMEdkkKfuHysyIEy4YOQ ji13vGTyz0K6iuCRJqjfJwX/hjv0ofadwLyGFOhu1Nkf8Vsla+6UBI3T0K8tolLCinsbQfM8 tbFYT1NK2UyKxnW/xlI8XTWwRhLVvZRgg5OjxtKsqeDkqGA4PiUpz7z82iH7uZsFAMS2PvkW o9SSv6BQXfEJNjmSfi6xrUZyW2XBrbLkVkF01rQ3qhR/gzPTevG5/TASiCUwEiA+fnpIy8DY F9+LKqxxk9rh4zmrSENqGRU4LdynCmpa8mqPs/gJkbLHS68rbWNJZ+FPcpaz4nyg8ETriB2s LuTPy8cEzzcBX0lof28F6bs17IUgXKqHXSzXsq8zkCfkFwZwQWXjT4n2AlnsvU5VtxXSeBl6 JJFIT2R5F4Z++Nsvlruk7KfW9vxkwHbCB1KEff14EWgoKEtSdXLKCxzJ60qnhK3gXPC0tJ9H G6rR3FqkSzWSU4t0oUaa1iJhLqhEA4tbh3hWiWmtQ716ICrLgpWo6JW1qDz9VeIyT82QNzGd LPEjnp++AUUnmSGhH8EogsKP9HdTcCQ8DM1W+LAwY2jOjoQEK5jdCoosNq94bF5BbOZ2v+IR esWWUMn/hAPqfLjea+ZR16tRl0g9SCDtaG1tMb6xUYSanGtlPiYYEiyyAVThJfYbBRfxlKTU jieweJjk710VqsmrXOxLMJPgcZrRGOTDy5CI4x80xV12hS/2C0FHpI6SIXEtSH6N9U7y3XdY APRKAHyXtacnVdGntCngKRXylNlGVhLPkuOFdUPJMuKlxakzW4Z4zJXd82GFW8aybXmTCEkZ wGimvrxewXQ1Hi8GOMil58SO5ToRbKpAeZh8k9BaBBl97ks15N6E/u/AnsYJfoqBCyucEHEv aby0U2bvpTj/VBFe4ZjtD+01fpmqWZ6DF5KlAVt5Od9S+EO1/Gpd8GtZRO6mVVp7uwxcZ2zl CLYqJ1Nc+8o2Rqlps/Yfihuml6D7YEUmVmzhu68O28xuNQg4yMGCLsbBSivFmUJ4Ec+4vxYJ CRefx23OsLCAPLfn7L1fsOogwKAxtsZz1rmFoue1dI59H0IaWGGmKOC8zzQihQwxOXxuB7yr Zmb51K2Z363S9G6JuU2oi1gmnWIJx1W/bJqmOSkNL+4QipYdDXIdvA1mCibV9ceaFMTxxcIu wV/+lB9rdCA45dGZnXMaReaqdVYBxX3wPV344Yo7oQK25ATJ575VVA2GbQrTSgLnjroYcfC9 U3w9hOJ7l2K+qBeHK/kmI37W2q9CVlxgwi4J+/AP9BaaZeYRZNYlMwCZAcisAsTuEhtAbACx FSDpboCkx5GlJbkSi2+xZY87VoJzgwHQxGjKM4E7rT5+GfkbK8lnBs0zBJhVAODe10YAWwCU IIqbSsk6q29oFtU5UegQP+JNCRYVFGMnMrKbmekxaghf9Hpvuz/Sd41DhYEmkido7MKnNhNo Rh2aLaGxC6CaLdDMBE2Jh/GawibL9SO0bBEKCyadfHgQhM23Iv5paf4EhgyGalcwil7P6KBS MDu+M/qFO0nyRzHS52AirUjrxgOjvb4bsSDFB62crt4p4aGqmHleJ6idfYW142fWCHnbqEC3 m6GbVbzDJAYhpL0zXLFEVNYmvvfPGNbVGzLo6RUTGprogwMwc/wLBgO/Q3QKsHvCZ4g3KzyQ K03AcmdGSGPAnTo0M1JqneGYMzE22jj8nmVjG6OkuWLsFJbHCYSEsVm8mJkZKbXCcUxbjI2O Ar/tbGxzlDRXjJ3C8hCEkDA2C0W2mZFSzxbF3j1F5325ScyBig+hIhhY0cUlKHJwn1+oQko1 sf5KgGlqVFwT62PEI5Y99N4vtFQ9/SrRcCXgV1BYdOdXOljEFq+G/R2ZqyLzfYX93vM8PM2W MXWWE2cFc8qdkbTTU9NSyVqi1LAuYTsuvaVufV1iXfUhl42rqgyYrHICsFU2HlReUFYXnqW0 oNoVG+t2xTXVqk22JDLh8jakfvvRZNtRueeu2DuniDChi9L+w3at8Q1O8e9zB31rGaHNML5h uqfTJVOzFB42DchoZm6XuLB7cA08DO+Wls/NQ/Im4dgFEBfXU1eV0q8L1HpxxRKaDBxQ2/og 6kr58x3Ln13Mn5lZXN9V595pEAP416X/iELJUDFTU3KTJoR8gPLALqYurkhhkFf47aYpjOB7 lPQp8ocUmOscoSCHYbp3zYxW3UY5N4ws7n2hyvK3aT/GtHM5yFPYOPs/F3bxZPtvQ88M/YGW LkErMupSVlBMC8TRyWYnod3iQlQ4jKhKI/InGOW7wPJKCyvvurX+PbCSLnsZLjurFbVV5fHq dOm6ZEKDeJ5WVEvnqZLymoy+hYMyR8ydHWHrQIpFjKdP+J8tYs/32fCKrIeJkeckPfYOVqaW z1HSXCxGJ0SXjgI6diy3eFurNhH7kB0ZiiHl03JpRMFe5flxmVB2LpYjk1qMsBaJoqgHZzlh +Ww6pZ3ktjnaGclEOVF26pKmhgtYDByP8koqA8xOSysOIqUb66vRDrv4Lo4GqiazjKGDYHxy X+TEy0PGvp5W8TO28jCp+zAoO6TWTVaFZwwl56Otb5zphE4xG4Y/T5VKf5O+sJcseyLGsIBh L6fX5sFhGlmjIIRQMNWgHeZSootKIf9gVxXhOz9Kco4ieUbhaGm9DDBguuv6hnqwsv/fnFlX Rvskyufvy2hNo/vGQV4wkCwqqBM5XqjcvZJLs25Nqhgw5/5Cn3xgzkqfDfhfUEsDBBQAAAAI AOCxFS29J6cEywQAACERAAAUABUAbGliSW1hZ2luZy9HZXRCQm94LmNVVAkAA8P0Yz0t9mM9 VXgEAPQB9AHdV39P20gQ/Tv+FAOtqjgkIXYqGpJSKXCB5hQKAirdiUZoE6+JL7GNbIfapfnu N7O7ju0kFCruTqdaSNjjt29+vJldZ7cCGlTgasLhPIkmvgd9l9063i0MnFHAgoTevu5bbTjh 0eGhH9fH1Xsw6gaYjYa522jtmnTbNt62zX2YzpjLA+jFd/AaF9LaWx7ByJ97FnGO/BhsPwAH fXAFmDhh5AdJG+9L+3u1xruaaYI9a5eOAs4ibim7YdaaDWHvWha34C7w/+LjyMGIw2hu2wLW ouWGmYPxOAq4y5YY8njk3yWBczuJoDzW4ZKPA4xxwEYhdA/B2N9/V9tv1deBxwG3AmcKA0xm Qri9uiK85BwirOBFr/vbaQ9sZ8ZFmhaPmDMLAWOch5gxMM8CZMGMA2c0p+CJYlfTtFeON57N LQ7bqv71yTaaHS/SlEHVv5zq47hVwNcwwqJevx3q2oMGeO1WSCkRzlrZmZeA53u1bzzwwWIR QwKBFHrUKRCiINa4Ckln+TRh4Q3hO1rqo+85kcNmzrcVN5EPLovhns3mPKTUCC9CbAzhAB3V PsQhrupkLwx6UTNyFpMs4q5Jdw10+8rituPx0knv6vDw7I+yiLiKvsKp/kWspATLiYBDAu+F q0S4gmRnR4eHL1opzUOg8FmsieWaWK2R4UGMaxAhKmBDmd4In9fJ8DoewhvpWrDmaQ2iLdEK 4lOJE1GpWIg4h/twkKZdBIoyxDuCkowL/E8rUnfSexphWsv30BA0WW2TlCAraSJZF7J0C6V7 Ps8WsmvFcreq0IhtW5dKLYDPQk6g/qerpinqQZVEhLw6MlpiHGHjh3BwAE1dRlIuf8ZVrYoO b0Qdl0IXPTZNJXEnHye239GEj6fYuiyCrxxu/QiYaD/VcKv10Eo44vPAI51xtae6P2149dIQ L/0p2Rdrw3e+3HAKIyjzgJj2o+VTQk8rE5nbsFgQsCQUHfvPj+O6H1UUl7shj8oq0kY163ZV XgVICoBEAfITeH5x9vv/fAJFlgRTho3zo+wiYWRV2CcnIkv/v5qIzOPmiXikgVc6uCfPwkL7 3vuOBRV1SqYdW+w4mYzjOh51BIul9Xhw1iW7Ley2sBdqJjPcwppS3UBdyncvCPzg5tS3uLgr q3RyudRkMq4TuiwaT9ImzgmztewV+P4dtrJmXaWSQy+mTKDTwQq/OsQsoo2SO57GOWaoYv+0 e9L/dHJz9ed570ZI017yUi3EYcZidabJbsCtHf+yVJ4ciCWSLrV3KOolZ5IjXJI+PjErpJki yPsByXEm9DVEPilCdNYQorMlERNef0Qky7JOtNDW77K+T5tQHpDSrIuwOj9CG0V02p90jfAL ctp5RFPR1k9q2jRfJqrwsioqkv7yqsrEV1VdVXMNZQyVCM9UUW1DmY62TNiW4ZbLClDRi5Lq L9A0pZSqZh7+BYHtJwW2nyew/aTA9k8KnKVdlNhekXgDzhgqhZ4p8uV576jfHaQiUz74C2rs 3omt28VTpLrd7xh72zqdqPS59/DIXMv9w9jLtUPrhd2gCFUzyCfI8f/6o56WdNMObuxt3sKL eGMFT51RWjZFKXWGp/hxdzCAq48XZ59PPqbfBPhhyuazKNsDfuYjQ8uy2fgV9TdQSwMEFAAA AAgA+rEVLWSG8mmRBAAAsxEAABIAFQBsaWJJbWFnaW5nL1BvaW50LmNVVAkAA/f0Yz0t9mM9 VXgEAPQB9AHtWG1v2kgQ/ox/xZSrKhtCwKYkBC5X0ZSkSORFTXK6UxRFxl7CKsa21nYLTfPf O7veBZu3JG2u/XIICe/uM+Nnnpnd2aRa0qAEFyMCZ9N4FPjQG9u31L+FPh0wm0356uue24Kz gPrxtrP1GcxtE6xazarWmlWLP7bMRsuy4M6zx4RBdxLCazTjliE3Aj2kE+IZEDPbjzw7poEv 10c0igM2beFzYa9RMc2KtQtDr1U4YMSOiSvmdyq1eqVuivlD9OSCE3hBwiBKwjBgsQI1K2Zd gM7TeWhWBjSGOICiWYR4xEg0CjwXgxMWu5VaQ7ntuC66HXoBksPYU9qC7jBgYwFvVmpoYWXg iCG3GPBatLm7mo7to9T8PV4Q3CWh1OIgCKeM3o5QL8eAc+IwEkPfHkTQeQ/mHvLda24vAw8Z cRm9g37iuyOOa1T2drelz3NCMHACn7qdD8ddGFKPAHJE6pypyATgN4nsW4K0XEBnmBJGBwlf 426qmqb9QX3HS1wCRVkd26MiTsuB+hUVoqv6oeOev4WZ8qMYnJHNSjAOXKJmPgfULUFsDzxy Y2j3GuCnWpKCpPNzRQUJjpj7Pk3itpji0k+2YNpOEXQI+iv+akMroH4J80ExMpR5l7GA3Rwj G/GkGxlbzhHevAHho/IXRQvSfNwXjVBMZzR3xQnCvkKdkC+6cG3AOyEDtCB9QapJ+jyJ6NfZ YMoHRjsbFLqcMzm57PfbOVV4WfQwr7pApn6yoeUigvt0Yb6INitXZWbS4o1w2znIMR25JMLt klYRpihrcdk7uWjKBKMOejo2ZMbbOSwvSH2KqFobpvBnVgCcKJc5HVj4SP/UR7NsYFfT6/Y6 cCBSkot0JVzwmaR8JjM+k5TPBPksWcxSLv2i26vJNXoQ4V4tEMSlhbc+zOV+AOJF5NEE1K3H MoAx161MBtLxb8qAJLOcgbr1gilA9znZ/c1Kp4/LgqPY/iQvtxqv0fup1R59oXhKqK04wAM3 ykrr2Eik3nrR1My4ZHL0+CbJWOWq+gcytYKfylUtl6vaYq6yUDMHNa/LVmNnA9zKwa3rcsO0 1sBRpfI+vG2LyMXTEuxBWz8a4EXlrp1P4dv/U7gC+t+lkMPrOXj9ury70/wlGU8X5WEim7O8 nzysuSNdqIvNwmXJDRJ+gESO7ZHZKBgOIxJn7khiuZpO/9wdCb59Ax1ve8441LPXkWKvaMAr rAeDX4W0wmpM29x5AuxQYX7kQrZ8i/qlt6b8cR1PQ6K2gtjmvePOUe/k6Obi37Pujehw833/ 3D0vGySWZr6druiPz+mlWC6HvX+Ouy2wXfyzyaNhiDG/W7wrPL/dzlqtaLIgqxLKslwXt8fC vlmW77B/2vkpAaUDJaGuxsYjas7s5KmZtdso7e/X7Pyse9Dr9JVmvN6Xd6Dap/t8D2qFe63w fG15JzF3ZtKmQygZm/qRssk0I2mzoRu9WLkWnqh4gYtdmOlcUMpzIp1+Hy4+fjq9PPqoCLhk aCdePK9SeYh8IB6JSXqEGPOQNp93f9teIg+8Iv9XAvNtDwgfF6WPNU3lO1BLAQIXAxQAAAAI AD2xFS2No3ba5h8AAG1xAAAMAA0AAAAAAAEAAQAkgQAAAABQSUwvSW1hZ2UucHlVVAUAA5Xz Yz1VeAAAUEsBAhcDFAAAAAgAk7EVLQgP7iDkGAAAi1IAABYADQAAAAAAAQABACSBJSAAAFBJ TC9UaWZmSW1hZ2VQbHVnaW4ucHlVVAUAAzX0Yz1VeAAAUEsBAhcDFAAAAAgAqLEVLWMsrwsm MQAATv0AAAoADQAAAAAAAQABACSBUjkAAF9pbWFnaW5nLmNVVAUAA1z0Yz1VeAAAUEsBAhcD FAAAAAgAxbEVLYvG0aHNEAAA41cAABQADQAAAAAAAQABACSBtWoAAGxpYkltYWdpbmcvQ29u dmVydC5jVVQFAAOS9GM9VXgAAFBLAQIXAxQAAAAIAOCxFS29J6cEywQAACERAAAUAA0AAAAA AAEAAQAkgcl7AABsaWJJbWFnaW5nL0dldEJCb3guY1VUBQADw/RjPVV4AABQSwECFwMUAAAA CAD6sRUtZIbyaZEEAACzEQAAEgANAAAAAAABAAEAJIHbgAAAbGliSW1hZ2luZy9Qb2ludC5j VVQFAAP39GM9VXgAAFBLBQYAAAAABgAGAMgBAACxhQAAAAA= --------------76AC3200840C968C229A5F70-- From sjr@debian.org Thu Aug 22 12:30:11 2002 From: sjr@debian.org (Simon Richter) Date: Thu, 22 Aug 2002 13:30:11 +0200 Subject: [Image-SIG] Debian Bug#156158: cannot set color mode with scanner_instance.mode= Message-ID: <20020822113011.GA19320@hogyros.de> Hi, I received the bug report below. Since I have exams coming up I don't have the necessary time to investigate this further, so I'm just forwarding it. Does anyone have an idea what may be wrong here? Please CC me on replies. Simon ----- Forwarded message from Thomas Renard ----- Subject: Bug#156158: cannot set color mode with scanner_instance.mode= Resent-From: Thomas Renard Resent-To: debian-bugs-dist@lists.debian.org Resent-Date: Sat, 10 Aug 2002 12:48:04 GMT Date: Sat, 10 Aug 2002 14:39:38 +0200 From: Thomas Renard To: submit@bugs.debian.org Package: python-imaging-sane Version: 1.1.3-1 It is not possible to set a scanner's color mode with this version. The following example worked with former versions of python-imaging-sane (here: python2.1-imaging-sane, Scanner Epson Perfection1240 USB, debian sarge): Python 2.1.3 (#1, Apr 20 2002, 10:14:34) [GCC 2.95.4 20011002 (Debian prerelease)] on linux2 Type "copyright", "credits" or "license" for more information. >>> import sane >>> sane.init() (16777223, 1, 0, 7) >>> sane.get_devices() [('epson:/dev/usb/scanner0', 'Epson', 'Perfection1240', 'flatbed scanner')] >>> scanner=sane.open('epson:/dev/usb/scanner0') >>> scanner.mode 'Binary' >>> scanner.mode="Color" Traceback (most recent call last): File "", line 1, in ? File "/usr/lib/python2.1/site-packages/sane.py", line 46, in __setattr__ self.last_opt = dev.set_option(opt.index, value) _sane.error: Invalid argument The expected behavior would be: no error, the scanner scans in color mode with a following scan instruction (scanner.start()) The error occurs with python2.2-imaging-sane version 1.1.3-1 and woody too. Because I cannot find any changes for the api for 1.1.3-1 in the net I guess there is some incompatibility with the binding to the used libsane version 1.0.7-3.2 This info may be usefull: >>> scanner.dev.get_options() [(1, None, 'Scan Mode', '', 5, 0, 4, 0, None), (2, 'mode', 'Scan mode', 'Selects the scan mode (e.g., lineart,monochrome, or color).', 3, 0, 7, 5, ['Binary', 'Gray', 'Color']), (3, 'depth', 'Bit depth', 'Number of bits per sample, typical values are 1 for "line-art" and 8 for multibit scans.', 1, 0, 4, 37, [8, 14]), (4, 'halftoning', 'Halftoning', 'Selects the halftone.', 3, 0, 26, 5, ['None', 'Halftone A (Hard Tone)', 'Halftone B (Soft Tone)', 'Halftone C (Net Screen)', 'Dit... Tested versions: woody, python2.1, python2.2 sarge, python2.1, python2.2 both kernel 2.4.18, libc6 2.2.5-6 ----- End forwarded message ----- From klimek@grc.nasa.gov Thu Aug 22 15:23:42 2002 From: klimek@grc.nasa.gov (Robert Klimek) Date: Thu, 22 Aug 2002 10:23:42 -0400 Subject: [Image-SIG] Reading 16bit image In-Reply-To: <3D640101.D4CA72B0@fel.tno.nl> References: <200208051650.33685.mauricio.inforcati@cenpra.gov.br> <3D5E1601.94ECE332@fel.tno.nl> <3D640101.D4CA72B0@fel.tno.nl> Message-ID: <200208221419.KAA21592@behemoth.lerc.nasa.gov> Wow, looks like you've done a lot of good work here. The ability for this= =20 library to read 16-bit images will be important in the future because so = many=20 digital cameras are going to formats higher than 8 bits. Thanks for your efforts! Bob On Wednesday 21 August 2002 05:07 pm, you wrote: > With regard to 16 bit TIFF support: > > Please find attached > - diffs for Imaging-1.1.3 > - changes sources of Imaging-1.1.3 > > The changes sources are for when you don't have/know patch; in that > caes just replace the source files. Otherwise use patch; recompile > and re-install Imaging-1.1.3. > > What is changed in the sources: > - ability to read 16 bit unsigned TIFF files using Image.open > - ability to use Image.show (by adding convert to 'L' mode (uint8)) > - ability to use Image.getextrema and Image.point > > Image.show, Image.getextrema and Image.point all work similar to > the 32 int cases; so something like: > > import Image > im16 =3D Image.open('img.tif') > min,max =3D im16.getextrema() > scale =3D 255.0 / (max - min) > offset =3D - min * scale > im16c =3D im16.point(lambda i: i * scale + offset) > im16c.show() > > will show a strechted image (sorry, typed from memory). > > Other PIL functions are not (yet ?) converted for 16 int use. > Note that im16.convert('I') will give a 32 bit int image, which is > better supported in PIL; or use im16c.convert('L') and have an 8 bit > image. > > Feedback is appreciated! > > Klamer Schutte > Schutte@fel.tno.nl > > Klamer Schutte wrote: > > Aureli Soria Frisch wrote: > > > I submitted a while ago a question related to the possibility of > > > opening TIF files with 16 bit depth that remained with no answer... > > > > > > It would be interesting to know how to work with 16 bit files in PI= L > > > in general (it does not seem to be possible with the open source > > > version of PIL)... From kevin@cazabon.com Fri Aug 23 05:05:07 2002 From: kevin@cazabon.com (Kevin@Cazabon.com) Date: Thu, 22 Aug 2002 22:05:07 -0600 Subject: [Image-SIG] Tkinter, ImageTk and threading... Message-ID: <000901c24a5a$446866c0$320aa8c0@duallie> Has anyone else had problems using Tkinter to display images in multi-threaded applications? I keep getting "Access Violation"s in TCL80.dll, and can't seem to nail down exactly what's happening. I've put locks on everything that can be accessed by more than one thread, and made sure that I'm not changing things underneath of Tcl on the fly, but to no avail. I believe the issue is related to images that are being shown on-screen in a Label widget. I don't have specifics yet, just wondering if anyone knows of any threading-specific shortfalls of Tkinter/Tcl that I should be wary of. Thanks! Kevin Cazabon. From Schutte@fel.tno.nl Fri Aug 23 16:29:27 2002 From: Schutte@fel.tno.nl (Klamer Schutte) Date: Fri, 23 Aug 2002 17:29:27 +0200 Subject: [Image-SIG] Tkinter, ImageTk and threading... References: <000901c24a5a$446866c0$320aa8c0@duallie> Message-ID: <3D6654D6.57B62640@fel.tno.nl> It is my understanding that Tkinter allows only one thread to access the Tk things. This seems to be Tk/Tcl related. A solution in multi-threaded applications is to make one thread which is only responsible for accessing tkinter. Communicate to that thread using a Queue, and regular call Tk.update(), as calling Tk.mainloop() will not read the Queue. Klamer "Kevin@Cazabon.com" wrote: > > Has anyone else had problems using Tkinter to display images in > multi-threaded applications? > > I keep getting "Access Violation"s in TCL80.dll, and can't seem to nail down > exactly what's happening. I've put locks on everything that can be accessed > by more than one thread, and made sure that I'm not changing things > underneath of Tcl on the fly, but to no avail. > > I believe the issue is related to images that are being shown on-screen in a > Label widget. > > I don't have specifics yet, just wondering if anyone knows of any > threading-specific shortfalls of Tkinter/Tcl that I should be wary of. > > Thanks! > > Kevin Cazabon. > > _______________________________________________ > Image-SIG maillist - Image-SIG@python.org > http://mail.python.org/mailman/listinfo/image-sig