From c90db01dc8d5462a3da22771ffa7c96f5ea31217 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Mon, 14 Sep 2009 14:26:20 +0200 Subject: [PATCH] source tree reorganization prior to flightgear 0.7 SimGear and TerraGear appear to have been split off at this time. --- Docs/Autopilot/AltitudeHold.tex | 206 - Docs/Autopilot/HeadingHold.fig | 26 - Docs/Autopilot/HeadingHold.tex | 103 - Docs/FDM/LaRCsim/LaRCsim-notes.tex | 99 - Docs/FDM/LaRCsim/LaRCsim-vars.tex | 375 - Docs/FDM/LaRCsim/LaRCsim_generics_v_1.4.xls | Bin 43008 -> 0 bytes Docs/FDM/LaRCsim/manual.ps.gz | Bin 73588 -> 0 bytes Docs/FDM/LaRCsim/manual.tex.gz | Bin 27738 -> 0 bytes Docs/FDM/airspeed.txt | 69 - Docs/InstallGuide/HTML/arizona.gif | Bin 150434 -> 0 bytes Docs/InstallGuide/HTML/getstart.html | 3445 ---- Docs/InstallGuide/HTML/hud.gif | Bin 126751 -> 0 bytes Docs/InstallGuide/HTML/navion.gif | Bin 68306 -> 0 bytes Docs/InstallGuide/HTML/panel.gif | Bin 158709 -> 0 bytes Docs/InstallGuide/HTML/start.gif | Bin 100094 -> 0 bytes Docs/InstallGuide/PDF/getstart.pdf | Bin 1388370 -> 0 bytes Docs/InstallGuide/SOURCE/arizona.eps | 2121 --- Docs/InstallGuide/SOURCE/building.tex | 404 - Docs/InstallGuide/SOURCE/flight.tex | 332 - Docs/InstallGuide/SOURCE/free.tex | 456 - Docs/InstallGuide/SOURCE/getstart.tex | 83 - Docs/InstallGuide/SOURCE/hud.eps | 1908 --- Docs/InstallGuide/SOURCE/index.tex | 37 - Docs/InstallGuide/SOURCE/landing.tex | 390 - Docs/InstallGuide/SOURCE/missed.tex | 234 - Docs/InstallGuide/SOURCE/navion.eps | 924 -- Docs/InstallGuide/SOURCE/opengl.tex | 250 - Docs/InstallGuide/SOURCE/panel.eps | 2855 ---- Docs/InstallGuide/SOURCE/prefligh.tex | 126 - Docs/InstallGuide/SOURCE/start.eps | 1377 -- Docs/InstallGuide/SOURCE/takeoff.tex | 267 - Docs/InstallGuide/SOURCE/title.tex | 53 - Docs/Misc/Features | 14 - Docs/Portability/fgfs-portability-guide.lyx | 308 - Docs/Portability/fgfs-portability-guide.tex | 142 - Docs/Scenery/Astro/Stars.info | 140 - Docs/Scenery/Astro/Stars.tex | 203 - .../CoordinateSystem/CoordinateSystem.tex | 173 - Docs/Scenery/CoordinateSystem/coord.fig | 25 - Docs/Scenery/CoordinateSystem/geodesy.fig | 43 - Docs/Scenery/DEM.info | 3 - Docs/Scenery/DLG/dlg3sdts.wp.gz | Bin 30962 -> 0 bytes Docs/Scenery/DLG/dug-2.wp6.gz | Bin 61975 -> 0 bytes Docs/Scenery/OBJ.format.txt | 3013 ---- .../SceneGeneration/SceneryGeneration.tex | 550 - Docs/Scenery/SceneGeneration/ref.fig | 47 - Docs/Scenery/SceneGeneration/terrain.outline | 50 - Docs/Scenery/SceneGeneration/trap.fig | 16 - Docs/Scenery/Sky/Sky.tex | 224 - Docs/Scenery/Sky/dome.fig | 47 - Docs/Scenery/Sky/earth.fig | 44 - Docs/Scenery/Sky/local.fig | 45 - Docs/Serial/nmeafaq.txt | 635 - Docs/Time/Events/Events.tex | 148 - Hints/aaa | 306 - Hints/endian-ness | 71 - Hints/gamma | 186 - Hints/joystick | 73 - Hints/lights.c | 288 - Hints/mip-mapping | 118 - Hints/nmea | 101 - Hints/opengl-optimization | 60 - Hints/polygon-offset | 358 - Hints/portable-sound | 331 - Hints/scene-graph | 85 - Hints/screen-dump | 66 - Hints/shadows-lights | 178 - Hints/ssg | 244 - Hints/stl-gcc-redhat | 153 - Hints/strips-vs-fans | 251 - Hints/textures-free | 8 - Hints/texturing | 1073 -- Hints/tile-gaps | 72 - Hints/timezone | 67 - Hints/view-frustum-culling | 986 -- Hints/view-projection | 86 - Hints/win32-time-funcs | 112 - Lib/Bucket/Makefile.am | 13 - Lib/Bucket/newbucket.cxx | 155 - Lib/Bucket/newbucket.hxx | 351 - Lib/Bucket/testbucket.cxx | 32 - Lib/Debug/Makefile.am | 11 - Lib/Debug/debug_types.h | 37 - Lib/Debug/fg_debug.c | 282 - Lib/Debug/fg_debug.h | 155 - Lib/Debug/logstream.cxx | 63 - Lib/Debug/logstream.hxx | 220 - Lib/Debug/logtest.cxx | 34 - Lib/Makefile.am | 14 - Lib/Math/MAT3geom.c | 168 - Lib/Math/MAT3inv.c | 311 - Lib/Math/MAT3mat.c | 120 - Lib/Math/MAT3vec.c | 154 - Lib/Math/Makefile.am | 17 - Lib/Math/fg_geodesy.cxx | 211 - Lib/Math/fg_geodesy.hxx | 162 - Lib/Math/fg_random.c | 71 - Lib/Math/fg_random.h | 48 - Lib/Math/geotest.c | 30 - Lib/Math/interpolater.cxx | 107 - Lib/Math/interpolater.hxx | 62 - Lib/Math/inttest.cxx | 23 - Lib/Math/leastsqs.cxx | 135 - Lib/Math/leastsqs.hxx | 73 - Lib/Math/mat3.h | 233 - Lib/Math/mat3defs.h | 56 - Lib/Math/mat3err.h | 41 - Lib/Math/point3d.hxx | 341 - Lib/Math/polar3d.cxx | 61 - Lib/Math/polar3d.hxx | 67 - Lib/Math/vector.cxx | 129 - Lib/Math/vector.hxx | 63 - Lib/Misc/CREDITS | 16 - Lib/Misc/Makefile.am | 12 - Lib/Misc/fgpath.cxx | 101 - Lib/Misc/fgpath.hxx | 85 - Lib/Misc/fgstream.cxx | 157 - Lib/Misc/fgstream.hxx | 102 - Lib/Misc/stopwatch.hxx | 121 - Lib/Misc/strutils.cxx | 71 - Lib/Misc/strutils.hxx | 64 - Lib/Misc/zfstream.cxx | 309 - Lib/Misc/zfstream.hxx | 154 - Lib/Serial/Makefile.am | 13 - Lib/Serial/serial.cxx | 336 - Lib/Serial/serial.hxx | 80 - Lib/Serial/testserial.cxx | 30 - Lib/XGL/Makefile.am | 5 - Lib/XGL/xgl.c | 3034 ---- Lib/XGL/xgl.h | 837 - Lib/XGL/xglUtils.c | 682 - Lib/zlib/ChangeLog | 471 - Lib/zlib/FAQ | 72 - Lib/zlib/INDEX | 86 - Lib/zlib/Make_vms.com | 115 - Lib/zlib/Makefile.am | 31 - Lib/zlib/Makefile.riscos | 151 - Lib/zlib/README | 148 - Lib/zlib/adler32.c | 48 - Lib/zlib/algorithm.txt | 213 - Lib/zlib/amiga/Makefile.pup | 66 - Lib/zlib/amiga/Makefile.sas | 64 - Lib/zlib/compress.c | 68 - Lib/zlib/configure | 214 - Lib/zlib/contrib/README.contrib | 34 - Lib/zlib/contrib/asm386/gvmat32.asm | 559 - Lib/zlib/contrib/asm386/gvmat32c.c | 200 - Lib/zlib/contrib/asm386/mkgvmt32.bat | 1 - Lib/zlib/contrib/asm386/zlibvc.def | 74 - Lib/zlib/contrib/asm386/zlibvc.dsp | 651 - Lib/zlib/contrib/asm386/zlibvc.dsw | 41 - Lib/zlib/contrib/asm586/README.586 | 43 - Lib/zlib/contrib/asm586/match.S | 354 - Lib/zlib/contrib/asm686/README.686 | 34 - Lib/zlib/contrib/asm686/match.S | 327 - Lib/zlib/contrib/delphi/zlib.mak | 36 - Lib/zlib/contrib/delphi/zlibdef.pas | 169 - Lib/zlib/contrib/delphi2/d_zlib.bpr | 224 - Lib/zlib/contrib/delphi2/d_zlib.cpp | 17 - Lib/zlib/contrib/delphi2/readme.txt | 17 - Lib/zlib/contrib/delphi2/zlib.bpg | 26 - Lib/zlib/contrib/delphi2/zlib.bpr | 225 - Lib/zlib/contrib/delphi2/zlib.cpp | 22 - Lib/zlib/contrib/delphi2/zlib.pas | 534 - Lib/zlib/contrib/delphi2/zlib32.bpr | 174 - Lib/zlib/contrib/delphi2/zlib32.cpp | 42 - Lib/zlib/contrib/iostream/test.cpp | 24 - Lib/zlib/contrib/iostream/zfstream.cpp | 329 - Lib/zlib/contrib/iostream/zfstream.h | 142 - Lib/zlib/contrib/iostream2/zstream.h | 307 - Lib/zlib/contrib/iostream2/zstream_test.cpp | 25 - Lib/zlib/contrib/minizip/ChangeLogUnzip | 38 - Lib/zlib/contrib/minizip/Makefile | 25 - Lib/zlib/contrib/minizip/miniunz.c | 508 - Lib/zlib/contrib/minizip/minizip.c | 302 - Lib/zlib/contrib/minizip/readme.txt | 37 - Lib/zlib/contrib/minizip/unzip.c | 1294 -- Lib/zlib/contrib/minizip/unzip.def | 15 - Lib/zlib/contrib/minizip/unzip.h | 275 - Lib/zlib/contrib/minizip/zip.c | 718 - Lib/zlib/contrib/minizip/zip.def | 5 - Lib/zlib/contrib/minizip/zip.h | 150 - Lib/zlib/contrib/minizip/zlibvc.def | 74 - Lib/zlib/contrib/minizip/zlibvc.dsp | 651 - Lib/zlib/contrib/minizip/zlibvc.dsw | 41 - Lib/zlib/contrib/untgz/Makefile | 14 - Lib/zlib/contrib/untgz/makefile.w32 | 63 - Lib/zlib/contrib/untgz/untgz.c | 522 - Lib/zlib/contrib/visual-basic.txt | 69 - Lib/zlib/crc32.c | 162 - Lib/zlib/deflate.c | 1350 -- Lib/zlib/deflate.h | 318 - Lib/zlib/descrip.mms | 48 - Lib/zlib/example.c | 556 - Lib/zlib/gzio.c | 875 - Lib/zlib/infblock.c | 398 - Lib/zlib/infblock.h | 39 - Lib/zlib/infcodes.c | 257 - Lib/zlib/infcodes.h | 27 - Lib/zlib/inffast.c | 170 - Lib/zlib/inffast.h | 17 - Lib/zlib/inffixed.h | 151 - Lib/zlib/inflate.c | 366 - Lib/zlib/inftrees.c | 455 - Lib/zlib/inftrees.h | 58 - Lib/zlib/infutil.c | 87 - Lib/zlib/infutil.h | 98 - Lib/zlib/maketree.c | 85 - Lib/zlib/minigzip.c | 320 - Lib/zlib/msdos/Makefile.b32 | 104 - Lib/zlib/msdos/Makefile.bor | 125 - Lib/zlib/msdos/Makefile.dj2 | 100 - Lib/zlib/msdos/Makefile.emx | 69 - Lib/zlib/msdos/Makefile.msc | 121 - Lib/zlib/msdos/Makefile.tc | 108 - Lib/zlib/msdos/Makefile.w32 | 97 - Lib/zlib/msdos/Makefile.wat | 103 - Lib/zlib/msdos/zlib.def | 60 - Lib/zlib/msdos/zlib.rc | 32 - Lib/zlib/nt/Makefile.emx | 138 - Lib/zlib/nt/Makefile.gcc | 87 - Lib/zlib/nt/Makefile.nt | 88 - Lib/zlib/nt/zlib.dnt | 47 - Lib/zlib/os2/Makefile.os2 | 136 - Lib/zlib/os2/zlib.def | 51 - Lib/zlib/trees.c | 1214 -- Lib/zlib/trees.h | 128 - Lib/zlib/uncompr.c | 58 - Lib/zlib/zconf.h | 279 - Lib/zlib/zlib.3 | 107 - Lib/zlib/zlib.h | 893 -- Lib/zlib/zutil.c | 225 - Lib/zlib/zutil.h | 220 - Tools/Areas/Makefile.am | 37 - Tools/Areas/area.cxx | 155 - Tools/Areas/area.hxx | 51 - Tools/Areas/main.cxx | 127 - Tools/Construct/Array/Makefile.am | 19 - Tools/Construct/Array/array.cxx | 577 - Tools/Construct/Array/array.hxx | 123 - Tools/Construct/Array/testarray.cxx | 33 - Tools/Construct/Clipper/Makefile.am | 21 - Tools/Construct/Clipper/clipper.cxx | 439 - Tools/Construct/Clipper/clipper.hxx | 117 - Tools/Construct/Clipper/testclipper.cxx | 110 - Tools/Construct/Combine/Makefile.am | 9 - Tools/Construct/Combine/genfans.cxx | 244 - Tools/Construct/Combine/genfans.hxx | 80 - Tools/Construct/GenOutput/Makefile.am | 9 - Tools/Construct/GenOutput/genobj.cxx | 398 - Tools/Construct/GenOutput/genobj.hxx | 111 - Tools/Construct/Main/Makefile.am | 34 - Tools/Construct/Main/construct.cxx | 33 - Tools/Construct/Main/construct.hxx | 170 - Tools/Construct/Main/construct_types.hxx | 59 - Tools/Construct/Main/main.cxx | 612 - Tools/Construct/Main/master.cxx | 153 - Tools/Construct/Makefile.am | 10 - Tools/Construct/Match/Makefile.am | 9 - Tools/Construct/Match/match.cxx | 607 - Tools/Construct/Match/match.hxx | 110 - Tools/Construct/Parallel/Makefile.am | 19 - Tools/Construct/Parallel/client.cxx | 281 - Tools/Construct/Parallel/fgfs-launch-clients | 130 - Tools/Construct/Parallel/fgfs-launch-server | 86 - Tools/Construct/Parallel/fgfs-shutdown | 45 - Tools/Construct/Parallel/server.cxx | 338 - Tools/Construct/Triangulate/Makefile.am | 14 - Tools/Construct/Triangulate/polygon.cxx | 469 - Tools/Construct/Triangulate/polygon.hxx | 168 - Tools/Construct/Triangulate/triangle.cxx | 503 - Tools/Construct/Triangulate/triangle.hxx | 105 - Tools/Construct/Triangulate/trieles.cxx | 26 - Tools/Construct/Triangulate/trieles.hxx | 75 - Tools/Construct/Triangulate/trinodes.cxx | 123 - Tools/Construct/Triangulate/trinodes.hxx | 124 - Tools/Construct/Triangulate/trisegs.cxx | 207 - Tools/Construct/Triangulate/trisegs.hxx | 118 - Tools/Lib/DEM/Makefile.am | 11 - Tools/Lib/DEM/dem.cxx | 874 - Tools/Lib/DEM/dem.hxx | 154 - Tools/Lib/Makefile.am | 4 - Tools/Lib/Polygon/Makefile.am | 7 - Tools/Lib/Polygon/index.cxx | 71 - Tools/Lib/Polygon/index.hxx | 43 - Tools/Lib/Polygon/names.cxx | 122 - Tools/Lib/Polygon/names.hxx | 69 - Tools/Lib/Triangle/A.poly | 62 - Tools/Lib/Triangle/Makefile.am | 24 - Tools/Lib/Triangle/README | 181 - Tools/Lib/Triangle/showme.c | 3384 ---- Tools/Lib/Triangle/triangle.c | 13241 ---------------- Tools/Lib/Triangle/triangle.doc | 817 - Tools/Lib/Triangle/triangle.h | 289 - Tools/Lib/Triangle/tricall.c | 279 - Tools/Makefile.am | 9 - Tools/Prep/DemChop/Makefile.am | 47 - Tools/Prep/DemChop/demchop.cxx | 102 - Tools/Prep/DemChop/point2d.cxx | 39 - Tools/Prep/DemChop/point2d.hxx | 53 - Tools/Prep/DemInfo/Makefile.am | 46 - Tools/Prep/DemInfo/deminfo.cxx | 67 - Tools/Prep/DemInfo/gather-dem-info.pl | 56 - Tools/Prep/DemRaw2ascii/Makefile.am | 35 - Tools/Prep/DemRaw2ascii/main.c | 78 - Tools/Prep/DemRaw2ascii/rawdem.c | 462 - Tools/Prep/DemRaw2ascii/rawdem.h | 76 - Tools/Prep/GenAirports/Makefile.am | 45 - Tools/Prep/GenAirports/area.cxx | 218 - Tools/Prep/GenAirports/area.hxx | 42 - Tools/Prep/GenAirports/convex_hull.cxx | 256 - Tools/Prep/GenAirports/convex_hull.hxx | 51 - Tools/Prep/GenAirports/main.cxx | 352 - Tools/Prep/GenAirports/point2d.cxx | 39 - Tools/Prep/GenAirports/point2d.hxx | 53 - Tools/Prep/Makefile.am | 6 - Tools/Prep/ShapeFile/Makefile.am | 14 - Tools/Prep/ShapeFile/main.cxx | 330 - Tools/Prep/ShapeFile/shape.cxx | 322 - Tools/Prep/ShapeFile/shape.hxx | 56 - Tools/README | 75 - Tools/Todo | 37 - Tools/Utils/Makedir/Makefile.am | 9 - Tools/Utils/Makedir/makedir.cxx | 119 - Tools/Utils/Makefile.am | 3 - Tools/Utils/convert.pl | 20 - Tools/Utils/mirror-dem | 29 - Tools/process-dem.pl | 544 - Tools/scenery_version.hxx | 26 - {Simulator => src}/Aircraft/Makefile.am | 0 {Simulator => src}/Aircraft/aircraft.cxx | 0 {Simulator => src}/Aircraft/aircraft.hxx | 0 {Simulator => src}/Airports/Makefile.am | 0 {Simulator => src}/Airports/genapt.cxx | 0 {Simulator => src}/Airports/genapt.hxx | 0 .../Airports/old_draw_runways.c | 0 {Simulator => src}/Airports/simple.cxx | 0 {Simulator => src}/Airports/simple.hxx | 0 {Simulator => src}/Airports/testair.cxx | 0 {Simulator => src}/Astro/Makefile.am | 0 {Simulator => src}/Astro/celestialBody.cxx | 0 {Simulator => src}/Astro/celestialBody.hxx | 0 {Simulator => src}/Astro/jupiter.cxx | 0 {Simulator => src}/Astro/jupiter.hxx | 0 {Simulator => src}/Astro/mars.cxx | 0 {Simulator => src}/Astro/mars.hxx | 0 {Simulator => src}/Astro/mercury.cxx | 0 {Simulator => src}/Astro/mercury.hxx | 0 {Simulator => src}/Astro/moon.cxx | 0 {Simulator => src}/Astro/moon.hxx | 0 {Simulator => src}/Astro/neptune.cxx | 0 {Simulator => src}/Astro/neptune.hxx | 0 {Simulator => src}/Astro/pluto.hxx | 0 {Simulator => src}/Astro/saturn.cxx | 0 {Simulator => src}/Astro/saturn.hxx | 0 {Simulator => src}/Astro/sky.cxx | 0 {Simulator => src}/Astro/sky.hxx | 0 {Simulator => src}/Astro/solarsystem.cxx | 0 {Simulator => src}/Astro/solarsystem.hxx | 0 {Simulator => src}/Astro/star.cxx | 0 {Simulator => src}/Astro/star.hxx | 0 {Simulator => src}/Astro/stars.cxx | 0 {Simulator => src}/Astro/stars.hxx | 0 {Simulator => src}/Astro/uranus.cxx | 0 {Simulator => src}/Astro/uranus.hxx | 0 {Simulator => src}/Astro/venus.cxx | 0 {Simulator => src}/Astro/venus.hxx | 0 {Simulator => src}/Autopilot/Makefile.am | 0 {Simulator => src}/Autopilot/autopilot.cxx | 0 {Simulator => src}/Autopilot/autopilot.hxx | 0 {Simulator => src}/Cockpit/Makefile.am | 0 {Simulator => src}/Cockpit/cockpit.cxx | 0 {Simulator => src}/Cockpit/cockpit.hxx | 0 {Simulator => src}/Cockpit/hud.cxx | 0 {Simulator => src}/Cockpit/hud.hxx | 0 {Simulator => src}/Cockpit/hud_card.cxx | 0 {Simulator => src}/Cockpit/hud_dnst.cxx | 0 {Simulator => src}/Cockpit/hud_guag.cxx | 0 {Simulator => src}/Cockpit/hud_inst.cxx | 0 {Simulator => src}/Cockpit/hud_labl.cxx | 0 {Simulator => src}/Cockpit/hud_ladr.cxx | 0 {Simulator => src}/Cockpit/hud_lat.cxx | 0 {Simulator => src}/Cockpit/hud_lon.cxx | 0 {Simulator => src}/Cockpit/hud_scal.cxx | 0 {Simulator => src}/Cockpit/hud_tbi.cxx | 0 {Simulator => src}/Cockpit/panel.cxx | 0 {Simulator => src}/Cockpit/panel.hxx | 0 .../Cockpit/proposed-navaids.hpp | 0 {Simulator => src}/Controls/Makefile.am | 0 {Simulator => src}/Controls/controls.cxx | 0 {Simulator => src}/Controls/controls.hxx | 0 {Simulator => src}/Done | 0 {Simulator => src}/FDM/External/Makefile.am | 0 {Simulator => src}/FDM/External/external.cxx | 0 {Simulator => src}/FDM/External/external.hxx | 0 {Simulator => src}/FDM/JSBsim.cxx | 0 {Simulator => src}/FDM/JSBsim.hxx | 0 {Simulator => src}/FDM/JSBsim/FGAircraft.cpp | 0 {Simulator => src}/FDM/JSBsim/FGAircraft.h | 0 .../FDM/JSBsim/FGAtmosphere.cpp | 0 {Simulator => src}/FDM/JSBsim/FGAtmosphere.h | 0 {Simulator => src}/FDM/JSBsim/FGAuxiliary.cpp | 0 {Simulator => src}/FDM/JSBsim/FGAuxiliary.h | 0 .../FDM/JSBsim/FGCoefficient.cpp | 0 {Simulator => src}/FDM/JSBsim/FGCoefficient.h | 0 {Simulator => src}/FDM/JSBsim/FGControls.cpp | 0 {Simulator => src}/FDM/JSBsim/FGControls.h | 0 {Simulator => src}/FDM/JSBsim/FGDefs.h | 0 {Simulator => src}/FDM/JSBsim/FGEngine.cpp | 0 {Simulator => src}/FDM/JSBsim/FGEngine.h | 0 {Simulator => src}/FDM/JSBsim/FGFCS.cpp | 0 {Simulator => src}/FDM/JSBsim/FGFCS.h | 0 {Simulator => src}/FDM/JSBsim/FGFDMExec.cpp | 0 {Simulator => src}/FDM/JSBsim/FGFDMExec.h | 0 {Simulator => src}/FDM/JSBsim/FGMain.cpp | 0 {Simulator => src}/FDM/JSBsim/FGMatrix.cpp | 0 {Simulator => src}/FDM/JSBsim/FGMatrix.h | 0 {Simulator => src}/FDM/JSBsim/FGModel.cpp | 0 {Simulator => src}/FDM/JSBsim/FGModel.h | 0 {Simulator => src}/FDM/JSBsim/FGOutput.cpp | 0 {Simulator => src}/FDM/JSBsim/FGOutput.h | 0 {Simulator => src}/FDM/JSBsim/FGPosition.cpp | 0 {Simulator => src}/FDM/JSBsim/FGPosition.h | 0 {Simulator => src}/FDM/JSBsim/FGRotation.cpp | 0 {Simulator => src}/FDM/JSBsim/FGRotation.h | 0 {Simulator => src}/FDM/JSBsim/FGState.cpp | 0 {Simulator => src}/FDM/JSBsim/FGState.h | 0 {Simulator => src}/FDM/JSBsim/FGTank.cpp | 0 {Simulator => src}/FDM/JSBsim/FGTank.h | 0 .../FDM/JSBsim/FGTranslation.cpp | 0 {Simulator => src}/FDM/JSBsim/FGTranslation.h | 0 {Simulator => src}/FDM/JSBsim/FGUtility.cpp | 0 {Simulator => src}/FDM/JSBsim/FGUtility.h | 0 {Simulator => src}/FDM/JSBsim/Makefile.am | 0 {Simulator => src}/FDM/LaRCsim.cxx | 0 {Simulator => src}/FDM/LaRCsim.hxx | 0 {Simulator => src}/FDM/LaRCsim/Cherokee.txt | 0 {Simulator => src}/FDM/LaRCsim/Makefile.am | 0 {Simulator => src}/FDM/LaRCsim/atmos_62.c | 0 {Simulator => src}/FDM/LaRCsim/atmos_62.h | 0 {Simulator => src}/FDM/LaRCsim/c172_aero.c | 0 {Simulator => src}/FDM/LaRCsim/c172_engine.c | 0 {Simulator => src}/FDM/LaRCsim/c172_gear.c | 0 {Simulator => src}/FDM/LaRCsim/c172_init.c | 0 {Simulator => src}/FDM/LaRCsim/c172_main.c | 0 .../FDM/LaRCsim/cherokee_aero.c | 0 .../FDM/LaRCsim/cherokee_engine.c | 0 .../FDM/LaRCsim/cherokee_gear.c | 0 .../FDM/LaRCsim/cherokee_init.c | 0 .../FDM/LaRCsim/default_model_routines.c | 0 .../FDM/LaRCsim/default_model_routines.h | 0 {Simulator => src}/FDM/LaRCsim/ls_accel.c | 0 {Simulator => src}/FDM/LaRCsim/ls_accel.h | 0 {Simulator => src}/FDM/LaRCsim/ls_aux.c | 0 {Simulator => src}/FDM/LaRCsim/ls_aux.h | 0 {Simulator => src}/FDM/LaRCsim/ls_cockpit.h | 0 {Simulator => src}/FDM/LaRCsim/ls_constants.h | 0 {Simulator => src}/FDM/LaRCsim/ls_generic.h | 0 {Simulator => src}/FDM/LaRCsim/ls_geodesy.c | 0 {Simulator => src}/FDM/LaRCsim/ls_geodesy.h | 0 {Simulator => src}/FDM/LaRCsim/ls_gravity.c | 0 {Simulator => src}/FDM/LaRCsim/ls_gravity.h | 0 {Simulator => src}/FDM/LaRCsim/ls_init.c | 0 {Simulator => src}/FDM/LaRCsim/ls_init.h | 0 {Simulator => src}/FDM/LaRCsim/ls_interface.c | 0 {Simulator => src}/FDM/LaRCsim/ls_interface.h | 0 {Simulator => src}/FDM/LaRCsim/ls_matrix.c | 0 {Simulator => src}/FDM/LaRCsim/ls_matrix.h | 0 {Simulator => src}/FDM/LaRCsim/ls_model.c | 0 {Simulator => src}/FDM/LaRCsim/ls_model.h | 0 .../FDM/LaRCsim/ls_sim_control.h | 0 {Simulator => src}/FDM/LaRCsim/ls_step.c | 0 {Simulator => src}/FDM/LaRCsim/ls_step.h | 0 {Simulator => src}/FDM/LaRCsim/ls_sym.h | 0 {Simulator => src}/FDM/LaRCsim/ls_trim.c | 0 {Simulator => src}/FDM/LaRCsim/ls_types.h | 0 {Simulator => src}/FDM/LaRCsim/mymain.c | 0 {Simulator => src}/FDM/LaRCsim/navion_aero.c | 0 .../FDM/LaRCsim/navion_engine.c | 0 {Simulator => src}/FDM/LaRCsim/navion_gear.c | 0 {Simulator => src}/FDM/LaRCsim/navion_init.c | 0 {Simulator => src}/FDM/LaRCsim/navion_init.h | 0 {Simulator => src}/FDM/LaRCsim/on_ground.ic | 0 {Simulator => src}/FDM/Makefile.am | 0 {Simulator => src}/FDM/Slew/Makefile.am | 0 {Simulator => src}/FDM/Slew/slew.cxx | 0 {Simulator => src}/FDM/Slew/slew.hxx | 0 {Simulator => src}/FDM/flight.cxx | 0 {Simulator => src}/FDM/flight.hxx | 0 {Simulator => src}/GUI/Makefile.am | 0 {Simulator => src}/GUI/gui.cxx | 0 {Simulator => src}/GUI/gui.h | 0 {Include => src/Include}/Makefile.am | 0 {Include => src/Include}/auto_ptr.hxx | 0 {Include => src/Include}/cmdargs.h | 0 {Include => src/Include}/compiler.h | 0 {Include => src/Include}/config.h.in | 0 {Include => src/Include}/fg_callback.hxx | 0 {Include => src/Include}/fg_constants.h | 0 {Include => src/Include}/fg_memory.h | 0 {Include => src/Include}/fg_stl_config.h | 0 {Include => src/Include}/fg_traits.hxx | 0 {Include => src/Include}/fg_typedefs.h | 0 {Include => src/Include}/fg_zlib.h | 0 {Include => src/Include}/general.hxx | 0 {Simulator => src}/Joystick/Makefile.am | 0 {Simulator => src}/Joystick/joystick.cxx | 0 {Simulator => src}/Joystick/joystick.hxx | 0 {Simulator => src}/Main/3dfx.sh | 0 {Simulator => src}/Main/GLUTkey.cxx | 0 {Simulator => src}/Main/GLUTkey.hxx | 0 {Simulator => src}/Main/GLUTmain.cxx | 0 {Simulator => src}/Main/Makefile.am | 0 {Simulator => src}/Main/fg_init.cxx | 0 {Simulator => src}/Main/fg_init.hxx | 0 {Simulator => src}/Main/fg_serial.cxx | 0 {Simulator => src}/Main/fg_serial.hxx | 0 {Simulator => src}/Main/mtest.c | 0 {Simulator => src}/Main/options.cxx | 0 {Simulator => src}/Main/options.hxx | 0 {Simulator => src}/Main/runfgfs.bat.in | 0 {Simulator => src}/Main/runfgfs.in | 0 {Simulator => src}/Main/splash.cxx | 0 {Simulator => src}/Main/splash.hxx | 0 {Simulator => src}/Main/ttest.cxx | 0 {Simulator => src}/Main/views.cxx | 0 {Simulator => src}/Main/views.hxx | 0 {Simulator => src}/Makefile.am | 0 {Simulator => src}/Objects/Makefile.am | 0 {Simulator => src}/Objects/colours.h | 0 {Simulator => src}/Objects/fragment.cxx | 0 {Simulator => src}/Objects/fragment.hxx | 0 {Simulator => src}/Objects/material.cxx | 0 {Simulator => src}/Objects/material.hxx | 0 {Simulator => src}/Objects/materialmgr.cxx | 0 {Simulator => src}/Objects/materialmgr.hxx | 0 {Simulator => src}/Objects/obj.cxx | 0 {Simulator => src}/Objects/obj.hxx | 0 {Simulator => src}/Objects/texload.c | 0 {Simulator => src}/Objects/texload.h | 0 {Simulator => src}/Scenery/Makefile.am | 0 {Simulator => src}/Scenery/design | 0 {Simulator => src}/Scenery/maptest.cxx | 0 {Simulator => src}/Scenery/scenery.cxx | 0 {Simulator => src}/Scenery/scenery.hxx | 0 {Simulator => src}/Scenery/test.cxx | 0 {Simulator => src}/Scenery/tilecache.cxx | 0 {Simulator => src}/Scenery/tilecache.hxx | 0 {Simulator => src}/Scenery/tileentry.cxx | 0 {Simulator => src}/Scenery/tileentry.hxx | 0 {Simulator => src}/Scenery/tilemgr.cxx | 0 {Simulator => src}/Scenery/tilemgr.hxx | 0 {Simulator => src}/Time/Makefile.am | 0 {Simulator => src}/Time/event.cxx | 0 {Simulator => src}/Time/event.hxx | 0 {Simulator => src}/Time/fg_time.cxx | 0 {Simulator => src}/Time/fg_time.hxx | 0 {Simulator => src}/Time/fg_timer.cxx | 0 {Simulator => src}/Time/fg_timer.hxx | 0 {Simulator => src}/Time/light.cxx | 0 {Simulator => src}/Time/light.hxx | 0 {Simulator => src}/Time/moonpos.cxx | 0 {Simulator => src}/Time/moonpos.hxx | 0 {Simulator => src}/Time/sunpos.cxx | 0 {Simulator => src}/Time/sunpos.hxx | 0 {Simulator => src}/Time/test_event.c | 0 {Simulator => src}/Time/timestamp.hxx | 0 {Simulator => src}/Time/ttest.c | 0 {Simulator => src}/Time/win32test.c | 0 {Simulator => src}/Todo | 0 {Simulator => src}/Weather/Makefile.am | 0 {Simulator => src}/Weather/weather.cxx | 0 {Simulator => src}/Weather/weather.hxx | 0 {Tests => tests}/Makefile.am | 0 {Tests => tests}/est-epsilon.c | 0 {Tests => tests}/gl-info.c | 0 {Tests => tests}/test-mktime.cxx | 0 577 files changed, 89784 deletions(-) delete mode 100644 Docs/Autopilot/AltitudeHold.tex delete mode 100644 Docs/Autopilot/HeadingHold.fig delete mode 100644 Docs/Autopilot/HeadingHold.tex delete mode 100644 Docs/FDM/LaRCsim/LaRCsim-notes.tex delete mode 100644 Docs/FDM/LaRCsim/LaRCsim-vars.tex delete mode 100755 Docs/FDM/LaRCsim/LaRCsim_generics_v_1.4.xls delete mode 100644 Docs/FDM/LaRCsim/manual.ps.gz delete mode 100644 Docs/FDM/LaRCsim/manual.tex.gz delete mode 100644 Docs/FDM/airspeed.txt delete mode 100644 Docs/InstallGuide/HTML/arizona.gif delete mode 100644 Docs/InstallGuide/HTML/getstart.html delete mode 100644 Docs/InstallGuide/HTML/hud.gif delete mode 100644 Docs/InstallGuide/HTML/navion.gif delete mode 100644 Docs/InstallGuide/HTML/panel.gif delete mode 100644 Docs/InstallGuide/HTML/start.gif delete mode 100644 Docs/InstallGuide/PDF/getstart.pdf delete mode 100644 Docs/InstallGuide/SOURCE/arizona.eps delete mode 100644 Docs/InstallGuide/SOURCE/building.tex delete mode 100644 Docs/InstallGuide/SOURCE/flight.tex delete mode 100644 Docs/InstallGuide/SOURCE/free.tex delete mode 100644 Docs/InstallGuide/SOURCE/getstart.tex delete mode 100644 Docs/InstallGuide/SOURCE/hud.eps delete mode 100644 Docs/InstallGuide/SOURCE/index.tex delete mode 100644 Docs/InstallGuide/SOURCE/landing.tex delete mode 100644 Docs/InstallGuide/SOURCE/missed.tex delete mode 100644 Docs/InstallGuide/SOURCE/navion.eps delete mode 100644 Docs/InstallGuide/SOURCE/opengl.tex delete mode 100644 Docs/InstallGuide/SOURCE/panel.eps delete mode 100644 Docs/InstallGuide/SOURCE/prefligh.tex delete mode 100644 Docs/InstallGuide/SOURCE/start.eps delete mode 100644 Docs/InstallGuide/SOURCE/takeoff.tex delete mode 100644 Docs/InstallGuide/SOURCE/title.tex delete mode 100644 Docs/Misc/Features delete mode 100644 Docs/Portability/fgfs-portability-guide.lyx delete mode 100644 Docs/Portability/fgfs-portability-guide.tex delete mode 100644 Docs/Scenery/Astro/Stars.info delete mode 100644 Docs/Scenery/Astro/Stars.tex delete mode 100644 Docs/Scenery/CoordinateSystem/CoordinateSystem.tex delete mode 100644 Docs/Scenery/CoordinateSystem/coord.fig delete mode 100644 Docs/Scenery/CoordinateSystem/geodesy.fig delete mode 100644 Docs/Scenery/DEM.info delete mode 100644 Docs/Scenery/DLG/dlg3sdts.wp.gz delete mode 100755 Docs/Scenery/DLG/dug-2.wp6.gz delete mode 100644 Docs/Scenery/OBJ.format.txt delete mode 100644 Docs/Scenery/SceneGeneration/SceneryGeneration.tex delete mode 100644 Docs/Scenery/SceneGeneration/ref.fig delete mode 100644 Docs/Scenery/SceneGeneration/terrain.outline delete mode 100644 Docs/Scenery/SceneGeneration/trap.fig delete mode 100644 Docs/Scenery/Sky/Sky.tex delete mode 100644 Docs/Scenery/Sky/dome.fig delete mode 100644 Docs/Scenery/Sky/earth.fig delete mode 100644 Docs/Scenery/Sky/local.fig delete mode 100644 Docs/Serial/nmeafaq.txt delete mode 100644 Docs/Time/Events/Events.tex delete mode 100644 Hints/aaa delete mode 100644 Hints/endian-ness delete mode 100644 Hints/gamma delete mode 100644 Hints/joystick delete mode 100644 Hints/lights.c delete mode 100644 Hints/mip-mapping delete mode 100644 Hints/nmea delete mode 100644 Hints/opengl-optimization delete mode 100644 Hints/polygon-offset delete mode 100644 Hints/portable-sound delete mode 100644 Hints/scene-graph delete mode 100644 Hints/screen-dump delete mode 100644 Hints/shadows-lights delete mode 100644 Hints/ssg delete mode 100644 Hints/stl-gcc-redhat delete mode 100644 Hints/strips-vs-fans delete mode 100644 Hints/textures-free delete mode 100644 Hints/texturing delete mode 100644 Hints/tile-gaps delete mode 100644 Hints/timezone delete mode 100644 Hints/view-frustum-culling delete mode 100644 Hints/view-projection delete mode 100644 Hints/win32-time-funcs delete mode 100644 Lib/Bucket/Makefile.am delete mode 100644 Lib/Bucket/newbucket.cxx delete mode 100644 Lib/Bucket/newbucket.hxx delete mode 100644 Lib/Bucket/testbucket.cxx delete mode 100644 Lib/Debug/Makefile.am delete mode 100644 Lib/Debug/debug_types.h delete mode 100644 Lib/Debug/fg_debug.c delete mode 100644 Lib/Debug/fg_debug.h delete mode 100644 Lib/Debug/logstream.cxx delete mode 100644 Lib/Debug/logstream.hxx delete mode 100644 Lib/Debug/logtest.cxx delete mode 100644 Lib/Makefile.am delete mode 100644 Lib/Math/MAT3geom.c delete mode 100644 Lib/Math/MAT3inv.c delete mode 100644 Lib/Math/MAT3mat.c delete mode 100644 Lib/Math/MAT3vec.c delete mode 100644 Lib/Math/Makefile.am delete mode 100644 Lib/Math/fg_geodesy.cxx delete mode 100644 Lib/Math/fg_geodesy.hxx delete mode 100644 Lib/Math/fg_random.c delete mode 100644 Lib/Math/fg_random.h delete mode 100644 Lib/Math/geotest.c delete mode 100644 Lib/Math/interpolater.cxx delete mode 100644 Lib/Math/interpolater.hxx delete mode 100644 Lib/Math/inttest.cxx delete mode 100644 Lib/Math/leastsqs.cxx delete mode 100644 Lib/Math/leastsqs.hxx delete mode 100644 Lib/Math/mat3.h delete mode 100644 Lib/Math/mat3defs.h delete mode 100644 Lib/Math/mat3err.h delete mode 100644 Lib/Math/point3d.hxx delete mode 100644 Lib/Math/polar3d.cxx delete mode 100644 Lib/Math/polar3d.hxx delete mode 100644 Lib/Math/vector.cxx delete mode 100644 Lib/Math/vector.hxx delete mode 100644 Lib/Misc/CREDITS delete mode 100644 Lib/Misc/Makefile.am delete mode 100644 Lib/Misc/fgpath.cxx delete mode 100644 Lib/Misc/fgpath.hxx delete mode 100644 Lib/Misc/fgstream.cxx delete mode 100644 Lib/Misc/fgstream.hxx delete mode 100644 Lib/Misc/stopwatch.hxx delete mode 100644 Lib/Misc/strutils.cxx delete mode 100644 Lib/Misc/strutils.hxx delete mode 100644 Lib/Misc/zfstream.cxx delete mode 100644 Lib/Misc/zfstream.hxx delete mode 100644 Lib/Serial/Makefile.am delete mode 100644 Lib/Serial/serial.cxx delete mode 100644 Lib/Serial/serial.hxx delete mode 100644 Lib/Serial/testserial.cxx delete mode 100644 Lib/XGL/Makefile.am delete mode 100644 Lib/XGL/xgl.c delete mode 100644 Lib/XGL/xgl.h delete mode 100644 Lib/XGL/xglUtils.c delete mode 100644 Lib/zlib/ChangeLog delete mode 100644 Lib/zlib/FAQ delete mode 100644 Lib/zlib/INDEX delete mode 100644 Lib/zlib/Make_vms.com delete mode 100644 Lib/zlib/Makefile.am delete mode 100644 Lib/zlib/Makefile.riscos delete mode 100644 Lib/zlib/README delete mode 100644 Lib/zlib/adler32.c delete mode 100644 Lib/zlib/algorithm.txt delete mode 100644 Lib/zlib/amiga/Makefile.pup delete mode 100644 Lib/zlib/amiga/Makefile.sas delete mode 100644 Lib/zlib/compress.c delete mode 100755 Lib/zlib/configure delete mode 100644 Lib/zlib/contrib/README.contrib delete mode 100644 Lib/zlib/contrib/asm386/gvmat32.asm delete mode 100644 Lib/zlib/contrib/asm386/gvmat32c.c delete mode 100644 Lib/zlib/contrib/asm386/mkgvmt32.bat delete mode 100644 Lib/zlib/contrib/asm386/zlibvc.def delete mode 100644 Lib/zlib/contrib/asm386/zlibvc.dsp delete mode 100644 Lib/zlib/contrib/asm386/zlibvc.dsw delete mode 100644 Lib/zlib/contrib/asm586/README.586 delete mode 100644 Lib/zlib/contrib/asm586/match.S delete mode 100644 Lib/zlib/contrib/asm686/README.686 delete mode 100644 Lib/zlib/contrib/asm686/match.S delete mode 100644 Lib/zlib/contrib/delphi/zlib.mak delete mode 100644 Lib/zlib/contrib/delphi/zlibdef.pas delete mode 100644 Lib/zlib/contrib/delphi2/d_zlib.bpr delete mode 100644 Lib/zlib/contrib/delphi2/d_zlib.cpp delete mode 100644 Lib/zlib/contrib/delphi2/readme.txt delete mode 100644 Lib/zlib/contrib/delphi2/zlib.bpg delete mode 100644 Lib/zlib/contrib/delphi2/zlib.bpr delete mode 100644 Lib/zlib/contrib/delphi2/zlib.cpp delete mode 100644 Lib/zlib/contrib/delphi2/zlib.pas delete mode 100644 Lib/zlib/contrib/delphi2/zlib32.bpr delete mode 100644 Lib/zlib/contrib/delphi2/zlib32.cpp delete mode 100644 Lib/zlib/contrib/iostream/test.cpp delete mode 100644 Lib/zlib/contrib/iostream/zfstream.cpp delete mode 100644 Lib/zlib/contrib/iostream/zfstream.h delete mode 100644 Lib/zlib/contrib/iostream2/zstream.h delete mode 100644 Lib/zlib/contrib/iostream2/zstream_test.cpp delete mode 100644 Lib/zlib/contrib/minizip/ChangeLogUnzip delete mode 100644 Lib/zlib/contrib/minizip/Makefile delete mode 100644 Lib/zlib/contrib/minizip/miniunz.c delete mode 100644 Lib/zlib/contrib/minizip/minizip.c delete mode 100644 Lib/zlib/contrib/minizip/readme.txt delete mode 100644 Lib/zlib/contrib/minizip/unzip.c delete mode 100644 Lib/zlib/contrib/minizip/unzip.def delete mode 100644 Lib/zlib/contrib/minizip/unzip.h delete mode 100644 Lib/zlib/contrib/minizip/zip.c delete mode 100644 Lib/zlib/contrib/minizip/zip.def delete mode 100644 Lib/zlib/contrib/minizip/zip.h delete mode 100644 Lib/zlib/contrib/minizip/zlibvc.def delete mode 100644 Lib/zlib/contrib/minizip/zlibvc.dsp delete mode 100644 Lib/zlib/contrib/minizip/zlibvc.dsw delete mode 100644 Lib/zlib/contrib/untgz/Makefile delete mode 100644 Lib/zlib/contrib/untgz/makefile.w32 delete mode 100644 Lib/zlib/contrib/untgz/untgz.c delete mode 100644 Lib/zlib/contrib/visual-basic.txt delete mode 100644 Lib/zlib/crc32.c delete mode 100644 Lib/zlib/deflate.c delete mode 100644 Lib/zlib/deflate.h delete mode 100644 Lib/zlib/descrip.mms delete mode 100644 Lib/zlib/example.c delete mode 100644 Lib/zlib/gzio.c delete mode 100644 Lib/zlib/infblock.c delete mode 100644 Lib/zlib/infblock.h delete mode 100644 Lib/zlib/infcodes.c delete mode 100644 Lib/zlib/infcodes.h delete mode 100644 Lib/zlib/inffast.c delete mode 100644 Lib/zlib/inffast.h delete mode 100644 Lib/zlib/inffixed.h delete mode 100644 Lib/zlib/inflate.c delete mode 100644 Lib/zlib/inftrees.c delete mode 100644 Lib/zlib/inftrees.h delete mode 100644 Lib/zlib/infutil.c delete mode 100644 Lib/zlib/infutil.h delete mode 100644 Lib/zlib/maketree.c delete mode 100644 Lib/zlib/minigzip.c delete mode 100644 Lib/zlib/msdos/Makefile.b32 delete mode 100644 Lib/zlib/msdos/Makefile.bor delete mode 100644 Lib/zlib/msdos/Makefile.dj2 delete mode 100644 Lib/zlib/msdos/Makefile.emx delete mode 100644 Lib/zlib/msdos/Makefile.msc delete mode 100644 Lib/zlib/msdos/Makefile.tc delete mode 100644 Lib/zlib/msdos/Makefile.w32 delete mode 100644 Lib/zlib/msdos/Makefile.wat delete mode 100644 Lib/zlib/msdos/zlib.def delete mode 100644 Lib/zlib/msdos/zlib.rc delete mode 100644 Lib/zlib/nt/Makefile.emx delete mode 100644 Lib/zlib/nt/Makefile.gcc delete mode 100644 Lib/zlib/nt/Makefile.nt delete mode 100644 Lib/zlib/nt/zlib.dnt delete mode 100644 Lib/zlib/os2/Makefile.os2 delete mode 100644 Lib/zlib/os2/zlib.def delete mode 100644 Lib/zlib/trees.c delete mode 100644 Lib/zlib/trees.h delete mode 100644 Lib/zlib/uncompr.c delete mode 100644 Lib/zlib/zconf.h delete mode 100644 Lib/zlib/zlib.3 delete mode 100644 Lib/zlib/zlib.h delete mode 100644 Lib/zlib/zutil.c delete mode 100644 Lib/zlib/zutil.h delete mode 100644 Tools/Areas/Makefile.am delete mode 100644 Tools/Areas/area.cxx delete mode 100644 Tools/Areas/area.hxx delete mode 100644 Tools/Areas/main.cxx delete mode 100644 Tools/Construct/Array/Makefile.am delete mode 100644 Tools/Construct/Array/array.cxx delete mode 100644 Tools/Construct/Array/array.hxx delete mode 100644 Tools/Construct/Array/testarray.cxx delete mode 100644 Tools/Construct/Clipper/Makefile.am delete mode 100644 Tools/Construct/Clipper/clipper.cxx delete mode 100644 Tools/Construct/Clipper/clipper.hxx delete mode 100644 Tools/Construct/Clipper/testclipper.cxx delete mode 100644 Tools/Construct/Combine/Makefile.am delete mode 100644 Tools/Construct/Combine/genfans.cxx delete mode 100644 Tools/Construct/Combine/genfans.hxx delete mode 100644 Tools/Construct/GenOutput/Makefile.am delete mode 100644 Tools/Construct/GenOutput/genobj.cxx delete mode 100644 Tools/Construct/GenOutput/genobj.hxx delete mode 100644 Tools/Construct/Main/Makefile.am delete mode 100644 Tools/Construct/Main/construct.cxx delete mode 100644 Tools/Construct/Main/construct.hxx delete mode 100644 Tools/Construct/Main/construct_types.hxx delete mode 100644 Tools/Construct/Main/main.cxx delete mode 100644 Tools/Construct/Main/master.cxx delete mode 100644 Tools/Construct/Makefile.am delete mode 100644 Tools/Construct/Match/Makefile.am delete mode 100644 Tools/Construct/Match/match.cxx delete mode 100644 Tools/Construct/Match/match.hxx delete mode 100644 Tools/Construct/Parallel/Makefile.am delete mode 100644 Tools/Construct/Parallel/client.cxx delete mode 100755 Tools/Construct/Parallel/fgfs-launch-clients delete mode 100755 Tools/Construct/Parallel/fgfs-launch-server delete mode 100755 Tools/Construct/Parallel/fgfs-shutdown delete mode 100644 Tools/Construct/Parallel/server.cxx delete mode 100644 Tools/Construct/Triangulate/Makefile.am delete mode 100644 Tools/Construct/Triangulate/polygon.cxx delete mode 100644 Tools/Construct/Triangulate/polygon.hxx delete mode 100644 Tools/Construct/Triangulate/triangle.cxx delete mode 100644 Tools/Construct/Triangulate/triangle.hxx delete mode 100644 Tools/Construct/Triangulate/trieles.cxx delete mode 100644 Tools/Construct/Triangulate/trieles.hxx delete mode 100644 Tools/Construct/Triangulate/trinodes.cxx delete mode 100644 Tools/Construct/Triangulate/trinodes.hxx delete mode 100644 Tools/Construct/Triangulate/trisegs.cxx delete mode 100644 Tools/Construct/Triangulate/trisegs.hxx delete mode 100644 Tools/Lib/DEM/Makefile.am delete mode 100644 Tools/Lib/DEM/dem.cxx delete mode 100644 Tools/Lib/DEM/dem.hxx delete mode 100644 Tools/Lib/Makefile.am delete mode 100644 Tools/Lib/Polygon/Makefile.am delete mode 100644 Tools/Lib/Polygon/index.cxx delete mode 100644 Tools/Lib/Polygon/index.hxx delete mode 100644 Tools/Lib/Polygon/names.cxx delete mode 100644 Tools/Lib/Polygon/names.hxx delete mode 100644 Tools/Lib/Triangle/A.poly delete mode 100644 Tools/Lib/Triangle/Makefile.am delete mode 100644 Tools/Lib/Triangle/README delete mode 100644 Tools/Lib/Triangle/showme.c delete mode 100644 Tools/Lib/Triangle/triangle.c delete mode 100644 Tools/Lib/Triangle/triangle.doc delete mode 100644 Tools/Lib/Triangle/triangle.h delete mode 100644 Tools/Lib/Triangle/tricall.c delete mode 100644 Tools/Makefile.am delete mode 100644 Tools/Prep/DemChop/Makefile.am delete mode 100644 Tools/Prep/DemChop/demchop.cxx delete mode 100644 Tools/Prep/DemChop/point2d.cxx delete mode 100644 Tools/Prep/DemChop/point2d.hxx delete mode 100644 Tools/Prep/DemInfo/Makefile.am delete mode 100644 Tools/Prep/DemInfo/deminfo.cxx delete mode 100755 Tools/Prep/DemInfo/gather-dem-info.pl delete mode 100644 Tools/Prep/DemRaw2ascii/Makefile.am delete mode 100644 Tools/Prep/DemRaw2ascii/main.c delete mode 100644 Tools/Prep/DemRaw2ascii/rawdem.c delete mode 100644 Tools/Prep/DemRaw2ascii/rawdem.h delete mode 100644 Tools/Prep/GenAirports/Makefile.am delete mode 100644 Tools/Prep/GenAirports/area.cxx delete mode 100644 Tools/Prep/GenAirports/area.hxx delete mode 100644 Tools/Prep/GenAirports/convex_hull.cxx delete mode 100644 Tools/Prep/GenAirports/convex_hull.hxx delete mode 100644 Tools/Prep/GenAirports/main.cxx delete mode 100644 Tools/Prep/GenAirports/point2d.cxx delete mode 100644 Tools/Prep/GenAirports/point2d.hxx delete mode 100644 Tools/Prep/Makefile.am delete mode 100644 Tools/Prep/ShapeFile/Makefile.am delete mode 100644 Tools/Prep/ShapeFile/main.cxx delete mode 100644 Tools/Prep/ShapeFile/shape.cxx delete mode 100644 Tools/Prep/ShapeFile/shape.hxx delete mode 100644 Tools/README delete mode 100644 Tools/Todo delete mode 100644 Tools/Utils/Makedir/Makefile.am delete mode 100644 Tools/Utils/Makedir/makedir.cxx delete mode 100644 Tools/Utils/Makefile.am delete mode 100755 Tools/Utils/convert.pl delete mode 100644 Tools/Utils/mirror-dem delete mode 100755 Tools/process-dem.pl delete mode 100644 Tools/scenery_version.hxx rename {Simulator => src}/Aircraft/Makefile.am (100%) rename {Simulator => src}/Aircraft/aircraft.cxx (100%) rename {Simulator => src}/Aircraft/aircraft.hxx (100%) rename {Simulator => src}/Airports/Makefile.am (100%) rename {Simulator => src}/Airports/genapt.cxx (100%) rename {Simulator => src}/Airports/genapt.hxx (100%) rename {Simulator => src}/Airports/old_draw_runways.c (100%) rename {Simulator => src}/Airports/simple.cxx (100%) rename {Simulator => src}/Airports/simple.hxx (100%) rename {Simulator => src}/Airports/testair.cxx (100%) rename {Simulator => src}/Astro/Makefile.am (100%) rename {Simulator => src}/Astro/celestialBody.cxx (100%) rename {Simulator => src}/Astro/celestialBody.hxx (100%) rename {Simulator => src}/Astro/jupiter.cxx (100%) rename {Simulator => src}/Astro/jupiter.hxx (100%) rename {Simulator => src}/Astro/mars.cxx (100%) rename {Simulator => src}/Astro/mars.hxx (100%) rename {Simulator => src}/Astro/mercury.cxx (100%) rename {Simulator => src}/Astro/mercury.hxx (100%) rename {Simulator => src}/Astro/moon.cxx (100%) rename {Simulator => src}/Astro/moon.hxx (100%) rename {Simulator => src}/Astro/neptune.cxx (100%) rename {Simulator => src}/Astro/neptune.hxx (100%) rename {Simulator => src}/Astro/pluto.hxx (100%) rename {Simulator => src}/Astro/saturn.cxx (100%) rename {Simulator => src}/Astro/saturn.hxx (100%) rename {Simulator => src}/Astro/sky.cxx (100%) rename {Simulator => src}/Astro/sky.hxx (100%) rename {Simulator => src}/Astro/solarsystem.cxx (100%) rename {Simulator => src}/Astro/solarsystem.hxx (100%) rename {Simulator => src}/Astro/star.cxx (100%) rename {Simulator => src}/Astro/star.hxx (100%) rename {Simulator => src}/Astro/stars.cxx (100%) rename {Simulator => src}/Astro/stars.hxx (100%) rename {Simulator => src}/Astro/uranus.cxx (100%) rename {Simulator => src}/Astro/uranus.hxx (100%) rename {Simulator => src}/Astro/venus.cxx (100%) rename {Simulator => src}/Astro/venus.hxx (100%) rename {Simulator => src}/Autopilot/Makefile.am (100%) rename {Simulator => src}/Autopilot/autopilot.cxx (100%) rename {Simulator => src}/Autopilot/autopilot.hxx (100%) rename {Simulator => src}/Cockpit/Makefile.am (100%) rename {Simulator => src}/Cockpit/cockpit.cxx (100%) rename {Simulator => src}/Cockpit/cockpit.hxx (100%) rename {Simulator => src}/Cockpit/hud.cxx (100%) rename {Simulator => src}/Cockpit/hud.hxx (100%) rename {Simulator => src}/Cockpit/hud_card.cxx (100%) rename {Simulator => src}/Cockpit/hud_dnst.cxx (100%) rename {Simulator => src}/Cockpit/hud_guag.cxx (100%) rename {Simulator => src}/Cockpit/hud_inst.cxx (100%) rename {Simulator => src}/Cockpit/hud_labl.cxx (100%) rename {Simulator => src}/Cockpit/hud_ladr.cxx (100%) rename {Simulator => src}/Cockpit/hud_lat.cxx (100%) rename {Simulator => src}/Cockpit/hud_lon.cxx (100%) rename {Simulator => src}/Cockpit/hud_scal.cxx (100%) rename {Simulator => src}/Cockpit/hud_tbi.cxx (100%) rename {Simulator => src}/Cockpit/panel.cxx (100%) rename {Simulator => src}/Cockpit/panel.hxx (100%) rename {Simulator => src}/Cockpit/proposed-navaids.hpp (100%) rename {Simulator => src}/Controls/Makefile.am (100%) rename {Simulator => src}/Controls/controls.cxx (100%) rename {Simulator => src}/Controls/controls.hxx (100%) rename {Simulator => src}/Done (100%) rename {Simulator => src}/FDM/External/Makefile.am (100%) rename {Simulator => src}/FDM/External/external.cxx (100%) rename {Simulator => src}/FDM/External/external.hxx (100%) rename {Simulator => src}/FDM/JSBsim.cxx (100%) rename {Simulator => src}/FDM/JSBsim.hxx (100%) rename {Simulator => src}/FDM/JSBsim/FGAircraft.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGAircraft.h (100%) rename {Simulator => src}/FDM/JSBsim/FGAtmosphere.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGAtmosphere.h (100%) rename {Simulator => src}/FDM/JSBsim/FGAuxiliary.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGAuxiliary.h (100%) rename {Simulator => src}/FDM/JSBsim/FGCoefficient.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGCoefficient.h (100%) rename {Simulator => src}/FDM/JSBsim/FGControls.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGControls.h (100%) rename {Simulator => src}/FDM/JSBsim/FGDefs.h (100%) rename {Simulator => src}/FDM/JSBsim/FGEngine.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGEngine.h (100%) rename {Simulator => src}/FDM/JSBsim/FGFCS.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGFCS.h (100%) rename {Simulator => src}/FDM/JSBsim/FGFDMExec.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGFDMExec.h (100%) rename {Simulator => src}/FDM/JSBsim/FGMain.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGMatrix.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGMatrix.h (100%) rename {Simulator => src}/FDM/JSBsim/FGModel.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGModel.h (100%) rename {Simulator => src}/FDM/JSBsim/FGOutput.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGOutput.h (100%) rename {Simulator => src}/FDM/JSBsim/FGPosition.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGPosition.h (100%) rename {Simulator => src}/FDM/JSBsim/FGRotation.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGRotation.h (100%) rename {Simulator => src}/FDM/JSBsim/FGState.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGState.h (100%) rename {Simulator => src}/FDM/JSBsim/FGTank.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGTank.h (100%) rename {Simulator => src}/FDM/JSBsim/FGTranslation.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGTranslation.h (100%) rename {Simulator => src}/FDM/JSBsim/FGUtility.cpp (100%) rename {Simulator => src}/FDM/JSBsim/FGUtility.h (100%) rename {Simulator => src}/FDM/JSBsim/Makefile.am (100%) rename {Simulator => src}/FDM/LaRCsim.cxx (100%) rename {Simulator => src}/FDM/LaRCsim.hxx (100%) rename {Simulator => src}/FDM/LaRCsim/Cherokee.txt (100%) rename {Simulator => src}/FDM/LaRCsim/Makefile.am (100%) rename {Simulator => src}/FDM/LaRCsim/atmos_62.c (100%) rename {Simulator => src}/FDM/LaRCsim/atmos_62.h (100%) rename {Simulator => src}/FDM/LaRCsim/c172_aero.c (100%) rename {Simulator => src}/FDM/LaRCsim/c172_engine.c (100%) rename {Simulator => src}/FDM/LaRCsim/c172_gear.c (100%) rename {Simulator => src}/FDM/LaRCsim/c172_init.c (100%) rename {Simulator => src}/FDM/LaRCsim/c172_main.c (100%) rename {Simulator => src}/FDM/LaRCsim/cherokee_aero.c (100%) rename {Simulator => src}/FDM/LaRCsim/cherokee_engine.c (100%) rename {Simulator => src}/FDM/LaRCsim/cherokee_gear.c (100%) rename {Simulator => src}/FDM/LaRCsim/cherokee_init.c (100%) rename {Simulator => src}/FDM/LaRCsim/default_model_routines.c (100%) rename {Simulator => src}/FDM/LaRCsim/default_model_routines.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_accel.c (100%) rename {Simulator => src}/FDM/LaRCsim/ls_accel.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_aux.c (100%) rename {Simulator => src}/FDM/LaRCsim/ls_aux.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_cockpit.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_constants.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_generic.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_geodesy.c (100%) rename {Simulator => src}/FDM/LaRCsim/ls_geodesy.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_gravity.c (100%) rename {Simulator => src}/FDM/LaRCsim/ls_gravity.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_init.c (100%) rename {Simulator => src}/FDM/LaRCsim/ls_init.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_interface.c (100%) rename {Simulator => src}/FDM/LaRCsim/ls_interface.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_matrix.c (100%) rename {Simulator => src}/FDM/LaRCsim/ls_matrix.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_model.c (100%) rename {Simulator => src}/FDM/LaRCsim/ls_model.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_sim_control.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_step.c (100%) rename {Simulator => src}/FDM/LaRCsim/ls_step.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_sym.h (100%) rename {Simulator => src}/FDM/LaRCsim/ls_trim.c (100%) rename {Simulator => src}/FDM/LaRCsim/ls_types.h (100%) rename {Simulator => src}/FDM/LaRCsim/mymain.c (100%) rename {Simulator => src}/FDM/LaRCsim/navion_aero.c (100%) rename {Simulator => src}/FDM/LaRCsim/navion_engine.c (100%) rename {Simulator => src}/FDM/LaRCsim/navion_gear.c (100%) rename {Simulator => src}/FDM/LaRCsim/navion_init.c (100%) rename {Simulator => src}/FDM/LaRCsim/navion_init.h (100%) rename {Simulator => src}/FDM/LaRCsim/on_ground.ic (100%) rename {Simulator => src}/FDM/Makefile.am (100%) rename {Simulator => src}/FDM/Slew/Makefile.am (100%) rename {Simulator => src}/FDM/Slew/slew.cxx (100%) rename {Simulator => src}/FDM/Slew/slew.hxx (100%) rename {Simulator => src}/FDM/flight.cxx (100%) rename {Simulator => src}/FDM/flight.hxx (100%) rename {Simulator => src}/GUI/Makefile.am (100%) rename {Simulator => src}/GUI/gui.cxx (100%) rename {Simulator => src}/GUI/gui.h (100%) rename {Include => src/Include}/Makefile.am (100%) rename {Include => src/Include}/auto_ptr.hxx (100%) rename {Include => src/Include}/cmdargs.h (100%) rename {Include => src/Include}/compiler.h (100%) rename {Include => src/Include}/config.h.in (100%) rename {Include => src/Include}/fg_callback.hxx (100%) rename {Include => src/Include}/fg_constants.h (100%) rename {Include => src/Include}/fg_memory.h (100%) rename {Include => src/Include}/fg_stl_config.h (100%) rename {Include => src/Include}/fg_traits.hxx (100%) rename {Include => src/Include}/fg_typedefs.h (100%) rename {Include => src/Include}/fg_zlib.h (100%) rename {Include => src/Include}/general.hxx (100%) rename {Simulator => src}/Joystick/Makefile.am (100%) rename {Simulator => src}/Joystick/joystick.cxx (100%) rename {Simulator => src}/Joystick/joystick.hxx (100%) rename {Simulator => src}/Main/3dfx.sh (100%) rename {Simulator => src}/Main/GLUTkey.cxx (100%) rename {Simulator => src}/Main/GLUTkey.hxx (100%) rename {Simulator => src}/Main/GLUTmain.cxx (100%) rename {Simulator => src}/Main/Makefile.am (100%) rename {Simulator => src}/Main/fg_init.cxx (100%) rename {Simulator => src}/Main/fg_init.hxx (100%) rename {Simulator => src}/Main/fg_serial.cxx (100%) rename {Simulator => src}/Main/fg_serial.hxx (100%) rename {Simulator => src}/Main/mtest.c (100%) rename {Simulator => src}/Main/options.cxx (100%) rename {Simulator => src}/Main/options.hxx (100%) rename {Simulator => src}/Main/runfgfs.bat.in (100%) rename {Simulator => src}/Main/runfgfs.in (100%) rename {Simulator => src}/Main/splash.cxx (100%) rename {Simulator => src}/Main/splash.hxx (100%) rename {Simulator => src}/Main/ttest.cxx (100%) rename {Simulator => src}/Main/views.cxx (100%) rename {Simulator => src}/Main/views.hxx (100%) rename {Simulator => src}/Makefile.am (100%) rename {Simulator => src}/Objects/Makefile.am (100%) rename {Simulator => src}/Objects/colours.h (100%) rename {Simulator => src}/Objects/fragment.cxx (100%) rename {Simulator => src}/Objects/fragment.hxx (100%) rename {Simulator => src}/Objects/material.cxx (100%) rename {Simulator => src}/Objects/material.hxx (100%) rename {Simulator => src}/Objects/materialmgr.cxx (100%) rename {Simulator => src}/Objects/materialmgr.hxx (100%) rename {Simulator => src}/Objects/obj.cxx (100%) rename {Simulator => src}/Objects/obj.hxx (100%) rename {Simulator => src}/Objects/texload.c (100%) rename {Simulator => src}/Objects/texload.h (100%) rename {Simulator => src}/Scenery/Makefile.am (100%) rename {Simulator => src}/Scenery/design (100%) rename {Simulator => src}/Scenery/maptest.cxx (100%) rename {Simulator => src}/Scenery/scenery.cxx (100%) rename {Simulator => src}/Scenery/scenery.hxx (100%) rename {Simulator => src}/Scenery/test.cxx (100%) rename {Simulator => src}/Scenery/tilecache.cxx (100%) rename {Simulator => src}/Scenery/tilecache.hxx (100%) rename {Simulator => src}/Scenery/tileentry.cxx (100%) rename {Simulator => src}/Scenery/tileentry.hxx (100%) rename {Simulator => src}/Scenery/tilemgr.cxx (100%) rename {Simulator => src}/Scenery/tilemgr.hxx (100%) rename {Simulator => src}/Time/Makefile.am (100%) rename {Simulator => src}/Time/event.cxx (100%) rename {Simulator => src}/Time/event.hxx (100%) rename {Simulator => src}/Time/fg_time.cxx (100%) rename {Simulator => src}/Time/fg_time.hxx (100%) rename {Simulator => src}/Time/fg_timer.cxx (100%) rename {Simulator => src}/Time/fg_timer.hxx (100%) rename {Simulator => src}/Time/light.cxx (100%) rename {Simulator => src}/Time/light.hxx (100%) rename {Simulator => src}/Time/moonpos.cxx (100%) rename {Simulator => src}/Time/moonpos.hxx (100%) rename {Simulator => src}/Time/sunpos.cxx (100%) rename {Simulator => src}/Time/sunpos.hxx (100%) rename {Simulator => src}/Time/test_event.c (100%) rename {Simulator => src}/Time/timestamp.hxx (100%) rename {Simulator => src}/Time/ttest.c (100%) rename {Simulator => src}/Time/win32test.c (100%) rename {Simulator => src}/Todo (100%) rename {Simulator => src}/Weather/Makefile.am (100%) rename {Simulator => src}/Weather/weather.cxx (100%) rename {Simulator => src}/Weather/weather.hxx (100%) rename {Tests => tests}/Makefile.am (100%) rename {Tests => tests}/est-epsilon.c (100%) rename {Tests => tests}/gl-info.c (100%) rename {Tests => tests}/test-mktime.cxx (100%) diff --git a/Docs/Autopilot/AltitudeHold.tex b/Docs/Autopilot/AltitudeHold.tex deleted file mode 100644 index b066f27cb..000000000 --- a/Docs/Autopilot/AltitudeHold.tex +++ /dev/null @@ -1,206 +0,0 @@ -% -% `AltitudeHold.tex' -- describes the FGFS Altitude Hold -% -% Written by Curtis Olson. Started December, 1997. -% -% $Id$ -%------------------------------------------------------------------------ - - -\documentclass[12pt]{article} - -\usepackage{anysize} -\papersize{11in}{8.5in} -\marginsize{1in}{1in}{1in}{1in} - -\usepackage{amsmath} - -\usepackage{epsfig} - -\usepackage{setspace} -\onehalfspacing - -\usepackage{url} - - -\begin{document} - - -\title{ - Flight Gear Autopilot: \\ - Altitude Hold Module -} - - -\author{ - Curtis Olson \\ - (\texttt{curt@me.umn.edu}) -} - - -\maketitle - -\section{Introduction} - -Working on scenery creation was becoming stressful and overwhelming. -I needed to set it aside for a few days to let my mind regroup so I -could mount a fresh attack. - -As a side diversion I decided to take a stab at writing an altitude -hold module for the autopilot system and in the process hopefully -learn a bit about control theory. - - -\section{Control Theory 101} - -Before I get too far into this section I should state clearly and up -front that I am not a ``controls'' expert and have no formal training -in this field. What I say here is said \textit{to the best of my -knowledge.} If anything here is mistaken or misleading, I'd -appreciate being corrected. I'd like to credit my boss, Bob Hain, and -my coworker, Rich Kaszeta, for explaining this basic theory to me, and -answering my many questions. - -The altitude hold module I developed is an example of a PID -controller. PID stands for proportional, integral, and derivative. -These are three components to the control module that will take our -input variable (error), and calculate the value of the output variable -required to drive our error to zero. - -A PID needs an input variable, and an output variable. The input -variable will be the error, or the difference between where we are, -and where we want to be. The output variable is the position of our -control surface. - -The proportional component of the PID drives the output variable in -direct proportion to the input variable. If your system is such that -the output variable is zero when the error is zero and things are -mostly linear, you usually can get by with proportional control only. -However, if you do not know in advance what the output variable will -be when error is zero, you will need to add in a measure of integral -control. - -The integral component drives the output based on the area under the -curve if we graph our actual position vs. target position over time. - -The derivative component is something I haven't dealt with, but is -used to drive you towards your target value more quickly. I'm told -this must be used with caution since it can easily yield an unstable -system if not tuned correctly. - -Typically you will take the output of each component of your PID and -combine them in some proportion to produce your final output. - -The proportional component quickly stabilizes the system when used by -itself, but the system will typically stabilize to an incorrect value. -The integral component drives you towards the correct value over time, -but you typically oscillate over and under your target and does not -stabilize quickly. However, each of these provides something we want. -When we combine them, they offset each others negatives while -maintaining their desirable qualities yielding a system that does -exactly what we want. - -It's actually pretty interesting and amazing when you think about it. -the proportional control gives us stability, but it introduces an -error into the system so we stabilize to the wrong value. The -integral components will continue to increase as the sum of the errors -over time increases. This pushes us back the direction we want to -go. When the system stabilizes out, we find that the integral -component precisely offsets the error introduced by the proportional -control. - -The concepts are simple and the code to implement this is simple. I -am still amazed at how such a simple arrangement can so effectively -control a system. - - -\section{Controlling Rate of Climb} - -Before we try to maintain a specific altitude, we need to be able to -control our rate of climb. Our PID controller does this through the -use of proportional and integral components. We do not know in -advance what elevator position will establish the desired rate of -climb. In fact the precise elevator position could vary as external -forces in our system change such as atmospheric density, throttle -settings, aircraft weight, etc. Because an elevator position of zero -will most likely not yield a zero rate of climb, we will need to add -in a measure of integral control to offset the error introduced by the -proportional control. - -The input to our PID controller will be the difference (or error) -between our current rate of climb and our target rate of climb. The -output will be the position of the elevator needed to drive us towards -the target rate of climb. - -The proportional component simply sets the elevator position in direct -proportion to our error. -\[ \mathbf{prop} = K \cdot \mathbf{error} \] - -The integral component sets the elevator position based on the sum of -these errors over time. For a time, $t$ -\[ \mathbf{integral} = K \cdot \int_{0}^{t} { \mathbf{error} \cdot \delta t } \] - -I do nothing with the derivative component so it is always zero and -can be ignored. - -The output variable is just a combination of the proportional and -integral components. $w_{\mathit{prop}}$ and $w_{\mathit{int}}$ are -weighting values. This allows you to control the contribution of each -component to your final output variable. In this case I found that -$w_{\mathit{prop}} = 0.9$ and $w_{\mathit{int}} = 0.1$ seemed to work -quite well. Too much integral control and your system won't -stabilize. Too little integral control and your system takes -excessively long to stabilize. -\[ -\mathbf{output} = w_{\mathit{prop}} \cdot \mathbf{prop} + - w_{\mathit{int}} \cdot \mathbf{int} -\] - -We are trying to control rate of climb with elevator position, so the -output of the above formula is our elevator position. Using this -formula to set a new elevator position each iteration quickly drives -our climb rate to the desired value. - - -\section{Controlling Altitude} - -Now that we have our rate of climb under control, it is a simple -matter to leverage this ability to control our absolute altitude. - -The input to our altitude PID controller is the difference (error) -between our current altitude and our goal altitude. The output is the -rate of climb needed to drive our altitude error to zero. - -Clearly, our climb rate will be zero when we stabilize on the target -altitude. Because our output variable will be zero when our error is -zero, we can get by with only a proportional control component. - -All we need to do is calculate a desired rate of climb that is -proportional to how far away we are from the target altitude. This is -a simple proportional altitude controller that sits on top of our -slightly more complicated rate of climb controller. - -\[ -\mathbf{target\_climb\_rate} = K \cdot ( \mathbf{target\_altitude} - - \mathbf{current\_altitude} ) -\] - -Thus we use the difference in altitude to determine a climb rate and -we use the desired climb rate to determine elevator position. - - -\section{Parameter Tuning} - -I've explained the basics, but there is one more thing that is -important to mention. None of the above theory and math is going to -do you a bit of good for controlling your system if all your -parameters are out of whack. In fact, parameter tuning is often the -trickiest part of the whole process. Expect to spend a good chunk of -your time tweaking function parameters to fine tune the behavior and -effectiveness of your controller. - - -\end{document} - - -%------------------------------------------------------------------------ diff --git a/Docs/Autopilot/HeadingHold.fig b/Docs/Autopilot/HeadingHold.fig deleted file mode 100644 index ae3a7c453..000000000 --- a/Docs/Autopilot/HeadingHold.fig +++ /dev/null @@ -1,26 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -100.00 -Single --2 -1200 2 -6 1800 1800 7425 4125 -2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 0 0 2 - 2400 2775 7200 2775 -2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 0 0 2 - 4800 1875 4800 3675 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 - 2400 3375 4350 3375 5250 2175 7200 2175 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 - 2400 2775 2400 2925 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 - 7200 2775 7200 2925 -4 0 0 0 0 0 14 0.0000 4 150 450 2100 3150 -180\001 -4 0 0 0 0 0 14 0.0000 4 150 315 7050 3150 180\001 -4 0 0 0 0 0 14 0.0000 4 150 105 4875 3150 0\001 -4 0 0 0 0 0 12 1.5708 4 180 1485 1950 3450 Y axist: Target Roll\001 -4 0 0 0 0 0 12 0.0000 4 180 1890 3975 4050 X axis: Relative Heading\001 --6 diff --git a/Docs/Autopilot/HeadingHold.tex b/Docs/Autopilot/HeadingHold.tex deleted file mode 100644 index 94d1a9281..000000000 --- a/Docs/Autopilot/HeadingHold.tex +++ /dev/null @@ -1,103 +0,0 @@ -% -% `HeadingHold.tex' -- describes the FGFS Heading Hold -% -% Written by Jeff Goeke-Smith -% -% $Id$ -%------------------------------------------------------------------------ - - -\documentclass[12pt]{article} - -\usepackage{anysize} -\papersize{11in}{8.5in} -\marginsize{1in}{1in}{1in}{1in} - -\usepackage{amsmath} - -\usepackage{epsfig} - -\usepackage{setspace} -\onehalfspacing - -\usepackage{url} - - -\begin{document} - - -\title{ - Flight Gear Autopilot: \\ - Heading Hold Module -} - - -\author{ - Jeff Goeke-Smith \\ - (\texttt{jgoeke@voyager.net}) -} - - -\maketitle - -\section{Heading Hold} - -The first autopilot system implemented was a heading hold system. The -entire point of the system was to hold a single heading by using the -ailerons only. Currently the system does not use the rudder for -heading or side slip control. The system of determining how to -control the ailerons is a fuzzy logic system ( at least according to -the book I borrowed from the local library) . - -The first stage of the autopilot system determines the relative -heading by comparing the current heading to the target heading. This -step allows me to determine what direction I should turn. - - -\begin{figure}[hbt] - \centerline{ - \psfig{file=HeadingHold.eps} - } - \caption{Relative heading vs. target roll} - \label{fig:headinghold} -\end{figure} - - -The next step determines how far I should be rolled and in what -direction. By luck, or maybe by design, If I want to move to a -negative relative heading, I need to have a negative roll. And by even -more luck, To roll in a negative direction, I need to add negative -aileron. Figure \ref{fig:headinghold} shows how I determine how far I -should be rolled. The x-axis represents the relative heading. The -y-axis represents the Target Roll. The specific values where the -graph changes slope is determined by a series of variables in the -Autopilot Structure. - - -% ___________________________ -% / -% / -%0- - - - - - - - - - - - / - - - - - - - - - - - - -% / -%_______________________/ -%| | | -%-180 0 180 - - -Now that the we know how far the aircraft should be rolled, we now -determine the Relative roll. This being the current roll compared to -the target roll. Now that we know how far we need to roll, we employ -a near identical copy of the above routine to determine where the -aileron should be by using the x-axis to represent the relative roll -and the y-axis being the aileron setting. The system then sets the -aileron to that setting and finishes the procedure. - -If anyone who reads this is interested in more information on how I -built this system, feel free to e-mail me at -\texttt{jgoeke@voyager.net} or read the code yourself. - - -\end{document} - - -%------------------------------------------------------------------------ diff --git a/Docs/FDM/LaRCsim/LaRCsim-notes.tex b/Docs/FDM/LaRCsim/LaRCsim-notes.tex deleted file mode 100644 index b043dcb89..000000000 --- a/Docs/FDM/LaRCsim/LaRCsim-notes.tex +++ /dev/null @@ -1,99 +0,0 @@ -\documentclass[12pt,titlepage]{article} - -\usepackage{anysize} -\papersize{11in}{8.5in} -\marginsize{1in}{1in}{1in}{1in} - - -\begin{document} - -Here is my attempt to organize descriptions of the various LaRCsim -files required to implement the equations of flight. 99\% of the -following text is copied straight out of email from Bruce, source code -comments, or the LaRCsim manual. - -\section{Core LaRCsim Header Files} - -\begin{description} - \item[ls\_generic.h:]1 LaRCSim generic parameters header file. Defines - the ``GENERIC'' structure which holds the current value of the - flight model parameters and states. - - \item[ls\_types.h:] LaRCSim type definitions header file. Defines - the following types: SCALAR, VECTOR\_3, and DATA. - - \item[ls\_constants.h:] LaRCSim constants definition header file. - Defines various constants and various units conversions. - - \item[ls\_sim\_control.h:] LaRCSim simulation control parameters - header file -\end{description} - - -\section{Core LaRCsim Routines} - -The following share the ls\_generic.h, ls\_types.h, and ls\_constants.h -header files. - -\begin{description} - \item[ls\_accel.c:] ls\_accel() sums the forces and moments from aero, - engine, gear, transfer them to the center of gravity, and calculate - resulting accelerations. - - \item[ls\_step.c:] ls\_step() Integration routine for equations of - motion (vehicle states.) Integrates accels $\rightarrow$ - velocities and velocities $\rightarrow$ positions. - - \item[ls\_aux.c:] ls\_aux() Takes the new state information - (velocities and positions) and calculates other information, like - Mach, pressures \& temps, alpha, beta, etc. for the new state. It - does this by calling atmos\_62() ls\_geodesy() and ls\_gravity(). - - \item[atmos\_62.c] atmos\_62() 1962 standard atmosphere table lookups. - - \item[ls\_geodesy.c] ls\_geoc\_to\_geod(lat\_geoc, radius, lat\_geod, alt, - sea\_level\_r) ls\_geod\_to\_geoc(lat\_geod, alt, sl\_radius, lat\_geoc) - since vehicle position is in geocentric lat/lon/radius, this - routine calculates geodetic positions lat/lon/alt ls\_gravity - - calculates local gravity, based on latitude \& altitude. - - \item[ls\_gravity:] ls\_gravity( SCALAR radius, SCALAR lat, SCALAR - *gravity ) Gravity model for LaRCsim. -\end{description} - - -\section{Secondary LaRCsim Routines} - -The following routines help manage the simulation - -\begin{description} - \item[ls\_model.c:] ls\_model() Model loop executive. Calls the user - supplied routines: inertias(), subsystems(), engine(), aero(), and - gear(). - - \item[default_model_routines.c:] Provides stub routines for the - routines that are normally provided by the user. -\end{description} - - -\section{Navion Specific Routines} - -\begin{description} - \item[ls\_cockpit.h:] Header for cockpit IO. Stores the current - state of all the control inputs. - - \item[navion\_aero.c:] aero() Linear aerodynamics model. Initializes - all the specific parameters if not initialized. The expected - outputs from aero() are the aerodynamic forces and moments about - the reference point, in lbs and ft-lbs, respectively, being stored - in the F\_aero\_v and M\_aero\_v vectors. - - \item[navion\_engine.c:] engine() Calculate the forces generated by - the engine. - - \item[navion\_gear.c:] gear() Landing gear model for example simulation. - - \item[navion\_init.c:] model\_init() Initializes navion math model -\end{description} - -\end{document} \ No newline at end of file diff --git a/Docs/FDM/LaRCsim/LaRCsim-vars.tex b/Docs/FDM/LaRCsim/LaRCsim-vars.tex deleted file mode 100644 index 93de9cce9..000000000 --- a/Docs/FDM/LaRCsim/LaRCsim-vars.tex +++ /dev/null @@ -1,375 +0,0 @@ -\documentclass[10pt]{article} - -\usepackage{anysize} -\papersize{11in}{8.5in} -\marginsize{0.5in}{0.5in}{0.5in}{0.5in} - - -\begin{document} - -\section{Constants} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -PI & Ratio of circumference to diameter of a circle & Macro definition -& always positive & 3.141593 \\ -EQUATORIAL\_RADIUS & Radius of the Earth at the equator & Macro definition & always positive & ft \\ -RESQ & Square of radius of the Earth at the equator & Macro definition & always positive & $ft^2$ \\ -FP & Flattening parameter of oblate Earth & Macro definition & always positive & 0.003353 \\ -INVG & Inverse of sea level acceleration due to gravity & Macro definition & always positive & $sec^2/ft$ \\ -OMEGA\_EARTH & Angular rotation velocity of the Earth & Macro definition & always positive & rad/sec \\ -DEG\_TO\_RAD & "Conversion factor, degrees to radians" & Macro definition & always positive & deg/rad \\ -RAD\_TO\_DEG & "Conversion factor, radians to degrees" & Macro definition & always positive & rad/deg \\ -SEA\_LEVEL\_DENSITY & Atmospheric density at sea level at equator & -Macro definition & always positive & $slug/ft^3$ \\ -\hline -\end{tabular} - -\section{Variables} - -\subsection{Time} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -Simtime & Simulated time since beginning of current run & & & sec \\ -\hline -\end{tabular} - -\subsection{Mass properties and geometry values} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -Mass & Mass of simulated vehicle & Scalar & always positive & slugs \\ -I\_xx & Moment of inertia about X-body axis & Scalar & always positive & $slug-ft^2$ \\ -I\_yy & Moment of inertia about Y-body axis & Scalar & always positive & $slug-ft^2$ \\ -I\_zz & Moment of inertia about Y-body axis & Scalar & always positive & $slug-ft^2$ \\ -I\_xz & Second moment of inertia in X-Z plane & Scalar & +Integral(x z dm) & $slug-ft^2$ \\ -\hline -D\_pilot\_rp\_body\_v[3] & Pilot offset from ref pt in body axis & 3-element array & - - & ft \\ -Dx\_pilot & Pilot offset from ref pt in X body axis & Scalar & forward & ft \\ -Dy\_pilot & Pilot offset from ref pt in X body axis & Scalar & right & ft \\ -Dz\_pilot & Pilot offset from ref pt in X body axis & Scalar & down & ft \\ -\hline -D\_cg\_rp\_body\_v[3] & Center of Gravity offset from ref pt in body axis & 3-element array & - - & ft \\ -Dx\_cg & C.G. offset from ref pt in X body axis & Scalar & forward & ft \\ -Dy\_cg & C.G. offset from ref pt in Y body axis & Scalar & right & ft \\ -Dz\_cg & C.G. offset from ref pt in Z body axis & Scalar & down & ft \\ -\hline -\end{tabular} - -\subsection{Forces} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -F\_body\_total\_v[3] & Total forces on body at ref pt in body axis & 3-element array & - - & ft \\ -F\_X & Force along X-body axis at ref pt & Scalar & forward & ft \\ -F\_Y & Force along Y-body axis at ref pt & Scalar & right & ft \\ -F\_z & Force along Z-body axis at ref pt & Scalar & down & ft \\ -\hline -F\_local\_total\_v[3] & Total forces on body at ref pt in local axis & 3-element array & - - & lbf \\ -F\_north & Northward force at ref pt & Scalar & north & lbf \\ -F\_east & Eastward force at ref pt & Scalar & east & lbf \\ -F\_down & Southward force at ref pt & Scalar & down & lbf \\ -\hline -F\_aero\_v[3] & Aerodynamic forces on body at ref pt in body axis & 3-element array & - - & lbf \\ -F\_X\_aero & Aero force along X-body axis at ref pt & Scalar & forward & lbf \\ -F\_Y\_aero & Aero force along Y-body axis at ref pt & Scalar & right & lbf \\ -F\_Z\_aero & Aero force along Z-body axis at ref pt & Scalar & down & lbf \\ -\hline -F\_engine\_v[3] & Engine forces on body at ref pt in body axis & 3-element array & - - & lbf \\ -F\_X\_engine & Engine force along X-body axis at ref pt & Scalar & forward & lbf \\ -F\_Y\_engine & Engine force along Y-body axis at ref pt & Scalar & right & lbf \\ -F\_Z\_engine & Engine force along Z-body axis at ref pt & Scalar & down & lbf \\ -\hline -F\_gear\_v[3] & Landing gear forces on body at ref pt in body axis & 3-element array & - - & lbf \\ -F\_X\_gear & Gear force along X-body axis at ref pt & Scalar & forward & lbf \\ -F\_Y\_gear & Gear force along Y-body axis at ref pt & Scalar & right & lbf \\ -F\_Z\_gear & Gear force along Z-body axis at ref pt & Scalar & down & lbf \\ -\hline -\end{tabular} - -\subsection{Moments} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -M\_total\_rp\_v[3] & Total moments on body at ref pt measured around body axes & 3-element array & - - & ft-lb \\ -M\_l\_rp & Total moments on body at ref pt about X-body axis & Scalar & right wing down & ft-lb \\ -M\_m\_rp & Total moments on body at ref pt about Y-body axis & Scalar & Nose up & ft-lb \\ -M\_n\_rp & Total moments on body at ref pt about Z-body axis & Scalar & Nose left & ft-lb \\ -\hline -M\_total\_cg\_v[3] & Total moments on body at ref pt measured around body axes & 3-element array & - - & ft-lb \\ -M\_l\_cg & Total moments on body at ref pt about X-body axis & Scalar & right wing down & ft-lb \\ -M\_m\_cg & Total moments on body at ref pt about Y-body axis & Scalar & Nose up & ft-lb \\ -M\_n\_cg & Total moments on body at ref pt about Z-body axis & Scalar & Nose left & ft-lb \\ -\hline -M\_aero\_v[3] & Aerodynamic moments on body at ref pt measured around body axes & 3-element array & - - & ft-lb \\ -M\_l\_aero & Aerodynamic moments on body at ref pt about X-body axis & Scalar & right wing down & ft-lb \\ -M\_m\_aero & Aerodynamic moments on body at ref pt about Y-body axis & Scalar & Nose up & ft-lb \\ -M\_n\_aero & Aerodynamic moments on body at ref pt about Z-body axis & Scalar & Nose left & ft-lb \\ -\hline -M\_engine\_v[3] & Propulsion system moments on body at ref pt measured around body axes & 3-element array & - - & ft-lb \\ -M\_l\_engine & Propulsion system moments on body at ref pt about X-body axis & Scalar & right wing down & ft-lb \\ -M\_m\_engine & Propulsion system moments on body at ref pt about Y-body axis & Scalar & Nose up & ft-lb \\ -M\_n\_engine & Propulsion system moments on body at ref pt about Z-body axis & Scalar & Nose left & ft-lb \\ -\hline -M\_gear\_v[3] & Landing gear moments on body at ref pt measured around body axes & 3-element array & - - & ft-lb \\ -M\_l\_gear & Landing gear moments on body at ref pt about X-body axis & Scalar & right wing down & ft-lb \\ -M\_m\_gear & Landing gear moments on body at ref pt about Y-body axis & Scalar & Nose up & ft-lb \\ -M\_n\_gear & Landing gear moments on body at ref pt about Z-body axis & Scalar & Nose left & ft-lb \\ -\hline -\end{tabular} - -\subsection{Accelerations} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -V\_dot\_local\_v[3] & Inertial acceleration of center of gravity measured in local axes & 3-element array & - - & $ft/sec^2$ \\ -V\_dot\_north & Inertial acceleration of center of gravity measured in local North axis & Scalar & north & $ft/sec^2$ \\ -V\_dot\_east & Inertial acceleration of center of gravity measured in local East axis & Scalar & east & $ft/sec^2$ \\ -V\_dot\_down & Inertial acceleration of center of gravity measured in local down axis & Scalar & down & $ft/sec^2$ \\ -\hline -V\_dot\_body\_v[3] & Inertial acceleration of ?? measured in body axes & 3-element array & - - & $ft/sec^2$ \\ -U\_dot\_body & Inertial acceleration of ?? measured in body X axis & Scalar & forward & $ft/sec^2$ \\ -V\_dot\_body & Inertial acceleration of ?? measured in body Y axis & Scalar & right & $ft/sec^2$ \\ -W\_dot\_body & Inertial acceleration of ?? measured in body Z axis & Scalar & down & $ft/sec^2$ \\ -\hline -A\_cg\_body\_v[3] & Inertial acceleration of center of gravity measured in body axes & 3-element array & - - & $ft/sec^2$ \\ -A\_X\_cg & Inertial acceleration of center of gravity measured in body X axis & Scalar & forward & $ft/sec^2$ \\ -A\_Y\_cg & Inertial acceleration of center of gravity measured in body Y axis & Scalar & right & $ft/sec^2$ \\ -A\_Z\_cg & Inertial acceleration of center of gravity measured in body Z axis & Scalar & down & $ft/sec^2$ \\ -\hline -A\_pilot\_body\_v[3] & Inertial acceleration of pilot station measured in body axes & 3-element array & - - & $ft/sec^2$ \\ -A\_X\_pilot & Inertial acceleration of pilot station measured in body X axis & Scalar & forward & $ft/sec^2$ \\ -A\_Y\_pilot & Inertial acceleration of pilot station measured in body Y axis & Scalar & right & $ft/sec^2$ \\ -A\_Z\_pilot & Inertial acceleration of pilot station measured in body Z axis & Scalar & down & $ft/sec^2$ \\ -\hline -N\_cg\_body\_v[3] & Inertial acceleration of center of gravity measured in body axes & 3-element array & - - & g units \\ -N\_X\_cg & Inertial acceleration of center of gravity measured in body X axis & Scalar & forward & g units \\ -N\_Y\_cg & Inertial acceleration of center of gravity measured in body Y axis & Scalar & right & g units \\ -N\_Z\_cg & Inertial acceleration of center of gravity measured in body Z axis & Scalar & down & g units \\ -\hline -N\_pilot\_body\_v[3] & Inertial acceleration of pilot station measured in body axes & 3-element array & - - & g units \\ -N\_X\_pilot & Inertial acceleration of pilot station measured in body X axis & Scalar & forward & g units \\ -N\_Y\_pilot & Inertial acceleration of pilot station measured in body Y axis & Scalar & right & g units \\ -N\_Z\_pilot & Inertial acceleration of pilot station measured in body Z axis & Scalar & down & g units \\ -\hline -\end{tabular} - -\subsection{Accelerations (Cont.)} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -Omega\_dot\_body\_v[3] & Angular acceleration of vehicle relative to local frame about center of gravity in body axes & 3-element array & - - & $rad/s^2$ \\ -P\_dot\_body & Angular acceleration of vehicle relative to local frame about center of gravity in X body axis & Scalar & rt wing down & $rad/s^2$ \\ -Q\_dot\_body & Angular acceleration of vehicle relative to local frame about center of gravity in Y body axis & Scalar & nose up & $rad/s^2$ \\ -R\_dot\_body & Angular acceleration of vehicle relative to local frame about center of gravity in Z body axis & Scalar & nose right & $rad/s^2$ \\ -\hline -\end{tabular} - -\subsection{Velocities} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -V\_local\_v[3] & Inertial velocity of center of gravity in local axes & 3-element array & - - & ft/s \\ -V\_north & Inertial velocity of center of gravity in local North axis & Scalar & north & ft/s \\ -V\_east & Inertial velocity of center of gravity in local East axis & Scalar & east & ft/s \\ -V\_down & Inertial velocity of center of gravity in local down axis & Scalar & down & ft/s \\ -\hline -V\_local\_rel\_ground\_v[3] & Velocity of center of gravity relative to earth surface in local axes & 3-element array & - - & ft/s \\ -V\_north\_rel\_ground & Velocity of center of gravity relative to earth surface in local North axis & Scalar & north & ft/s \\ -V\_east\_rel\_ground & Velocity of center of gravity relative to earth surface in local east axis & Scalar & east & ft/s \\ -V\_down\_rel\_ground & Velocity of center of gravity relative to earth surface in local down axis & Scalar & down & ft/s \\ -\hline -V\_local\_airmass\_v[3] & Inertial steady-state velocity of airmass in local axes & 3-element array & - - & ft/s \\ -V\_north\_airmass & Inertial steady-state velocity of airmass in local North axis & Scalar & north & ft/s \\ -V\_east\_airmass & Inertial steady-state velocity of airmass in local East axis & Scalar & east & ft/s \\ -V\_down\_airmass & Inertial steady-state velocity of airmass in local down axis & Scalar & down & ft/s \\ -\hline -V\_local\_rel\_airmass\_v[3] & Velocity of center of gravity relative to local airmass in local axes & 3-element array & - - & ft/s \\ -V\_north\_rel\_airmass & Velocity of center of gravity relative to local airmass in local North axis & Scalar & north & ft/s \\ -V\_east\_rel\_airmass & Velocity of center of gravity relative to local airmass in local East axis & Scalar & east & ft/s \\ -V\_down\_rel\_airmass & Velocity of center of gravity relative to local airmass in local down axis & Scalar & down & ft/s \\ -\hline -V\_body\_gust\_v[3] & Gust velocity in body axes & 3-element array & - - & ft/s \\ -U\_gust & Gust velocity in X-body axes & Scalar & forward & ft/s \\ -V\_gust & Gust velocity in Y-body axes & Scalar & right & ft/s \\ -W\_gust & Gust velocity in Z-body axes & Scalar & down & ft/s \\ -\hline -\end{tabular} - -\subsection{Velocities (Cont.)} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -V\_wind\_body\_v[3] & Velocity of center of gravity relative to local airmass in body axes & 3-element array & - - & ft/s \\ -U\_body & Velocity of center of gravity relative to local airmass in X-body axis & Scalar & forward & ft/s \\ -V\_body & Velocity of center of gravity relative to local airmass in Y-body axis & Scalar & right & ft/s \\ -W\_body & Velocity of center of gravity relative to local airmass in Z-body axis & Scalar & down & ft/s \\ -\hline -V\_rel\_wind & Velocity relative to airmass & Scalar & always positive & ft/s \\ -V\_true\_knots & True airspeed in knots & Scalar & always positive & nm/hr \\ -V\_rel\_ground & Velocity relative to earth's surface & Scalar & always positive & ft/s \\ -V\_inertial & Inertial velocity & Scalar & always positive & ft/s \\ -V\_ground\_speed & Velocity at right angles to local vertical & Scalar & always positive & ft/s \\ -V\_equiv & Equivalent airspeed & Scalar & always positive & ft/s \\ -V\_equiv\_kts & "Equivalent airspeed, knots" & Scalar & always positive & nm/hr \\ -V\_calibrated & Calibrated airspeed & Scalar & always positive & ft/s \\ -V\_calibrated\_kts & "Calibrated airspeed, knots" & Scalar & always positive & nm/hr \\ -\hline -Omega\_body\_v[3] & Inertial rotational rate of the body axis frame & 3-element array & - - & rad/s \\ -P\_body & Inertial rotational rate of the body X-axis & Scalar & rt wing down & rad/s \\ -Q\_body & Inertial rotational rate of the body Y-axis & Scalar & nose up & rad/s \\ -R\_body & Inertial rotational rate of the body Z-axis & Scalar & nose right & rad/s \\ -\hline -Omega\_local\_v[3] & Inertial rotational rate of the local axis frame & 3-element array & - - & rad/s \\ -P\_local & Inertial rotational rate of the local axis frame about the body X-axis & Scalar & rt wing down & rad/s \\ -Q\_local & Inertial rotational rate of the local axis frame about the body Y-axis & Scalar & nose up & rad/s \\ -R\_local & Inertial rotational rate of the local axis frame about the body Z-axis & Scalar & nose right & rad/s \\ -\hline -\end{tabular} - -\subsection{Velocities (Cont.)} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -Omega\_total\_v[3] & Rotational rate of the body axis frame relative to the local axis frame & 3-element array & - - & rad/s \\ -P\_total & Rotational rate of the body axis frame relative to the local axis frame about the body X-axis & Scalar & rt wing down & rad/s \\ -Q\_total & Rotational rate of the body axis frame relative to the local axis frame about the body Y-axis & Scalar & nose up & rad/s \\ -R\_total & Rotational rate of the body axis frame relative to the local axis frame about the body Z-axis & Scalar & nose right & rad/s \\ -\hline -Euler\_rates\_v[3] & "Rotational rate of the body axis frame relative to the local axis frame, in Euler angles" & 3-element array & - - & rad/s \\ -Phi\_dot & Rotational rate of the body axis frame about the local X-axis & Scalar & rt wing down & rad/s \\ -Theta\_dot & Rotational rate of the body axis frame about the local Y-axis & Scalar & nose up & rad/s \\ -Psi\_dot & Rotational rate of the body axis frame about the local Z-axis & Scalar & nose right & rad/s \\ -\hline -Geocentric\_rates\_v[3] & Rotational rate of the body axis frame relative to the inertial frame & 3-element array & - - & - - \\ -Latitude\_dot & Rate of change of geocentric latitude angle & Scalar & westward & rad/s \\ -Longitude\_dot & Rate of change of geocentric longitude angle & Scalar & northward & rad/s \\ -Radius\_dot & Rate of change of radius from center of inertial frame & Scalar & outward & ft/s \\ -\hline -\end{tabular} - -\subsection{Positions} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -Geocentric\_position\_v[3] & Geocentric position of vehicle's center of gravity & 3-element array & - - & - - \\ -Lat\_geocentric & Geocentric latitude of vehicle's center of gravity & Scalar & westward & rad \\ -Lon\_geocentric & Geocentric longitude of vehicle's center of gravity & Scalar & northward & rad \\ -Radius\_to\_vehicle & Radius to vehicle's center of gravity from inertial frame & Scalar & outward & ft \\ -\hline -Geodetic\_position\_v[3] & Geodetic position of vehicle's center of gravity & 3-element array & - - & - - \\ -Latitude & Geodetic latitude of vehicle's center of gravity & Scalar & westward & rad \\ -Longitude & Geodetic longitude of vehicle's center of gravity & Scalar & northward & rad \\ -Altitude & Height of vehicle's center of gravity above reference ellipsoid & Scalar & outward & ft \\ -\hline -Euler\_angles\_v[3] & Vehicle's angular attitude relative to local frame & 3-element array & - - & rad \\ -Phi & Roll angle & Scalar & rt wing down & rad \\ -Theta & Pitch angle & Scalar & nose up & rad \\ -Psi & Heading angle & Scalar & nose right & rad \\ -\hline -\end{tabular} - -\subsection{Miscellaneous Quantities} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -T\_local\_to\_body\_m[3][3] & Transformation matrix L to B & 3 by 3 matrix & - - & - - \\ -T\_local\_to\_body\_11 & Transformation matrix element & Scalar & - - & - - \\ -T\_local\_to\_body\_12 & Transformation matrix element & Scalar & - - & - - \\ -T\_local\_to\_body\_13 & Transformation matrix element & Scalar & - - & - - \\ -T\_local\_to\_body\_21 & Transformation matrix element & Scalar & - - & - - \\ -T\_local\_to\_body\_22 & Transformation matrix element & Scalar & - - & - - \\ -T\_local\_to\_body\_23 & Transformation matrix element & Scalar & - - & - - \\ -T\_local\_to\_body\_31 & Transformation matrix element & Scalar & - - & - - \\ -T\_local\_to\_body\_32 & Transformation matrix element & Scalar & - - & - - \\ -T\_local\_to\_body\_33 & Transformation matrix element & Scalar & - - & - - \\ -\hline -Gravity & Acceleration due to earth's gravity & Scalar & down & $ft/s^2$ \\ -Centrifugal\_relief & Centrifugal acceleration due to near-orbital speed & Scalar & up & $ft/s^2$ \\ -\hline -Alpha & Free-stream angle of attack & Scalar & nose up & rad \\ -Beta & Free-stream angle of sideslip & Scalar & nose left & rad \\ -Alpha\_dot & Time rate of change of free-stream angle of attack & Scalar & nose up & rad/s \\ -Beta\_dot & Time rate of change of free-stream angle of sideslip & Scalar & nose left & rad/s \\ -Cos\_alpha & Cosine of free-stream angle of attack & Scalar & nose up & - - \\ -Sin\_alpha & Sine of free-stream angle of attack & Scalar & nose up & - - \\ -Cos\_beta & Cosine of free-stream angle of sideslip & Scalar & nose left & - - \\ -Sin\_beta & Sine of free-stream angle of sideslip & Scalar & nose left & - - \\ -\hline -Cos\_phi & Cosine of bank angle & Scalar & rt wing down & - - \\ -Sin\_phi & Sine of bank angle & Scalar & rt wing down & - - \\ -Cos\_theta & Cosine of pitch angle & Scalar & nose up & - - \\ -Sin\_theta & Sine of pitch angle & Scalar & nose up & - - \\ -Cos\_psi & Cosine of heading angle & Scalar & nose right & - - \\ -Sin\_psi & Sine of heading angle & Scalar & nose right & - - \\ -\hline -Gamma\_vert\_rad & Vertical flight path angle in local frame & Scalar & climb & rad \\ -Gamma\_horiz\_rad & "Horizontal flight path, or track, angle in local frame" & Scalar & clockwise from north & rad \\ -\hline -Sigma & Ratio of free-stream density to sea-level reference density & Scalar & always positive & - - \\ -Density & Atmospheric density (free-stream flight conditions) & Scalar & always positive & $slug/ft^3$ \\ -V\_sound & Speed of sound (free-stream flight conditions) & Scalar & always positive & ft/s \\ -Mach\_number & Free-stream mach number & Scalar & always positive & - - \\ -\hline -Static\_pressure & Static pressure & Scalar & always positive & $lb/ft^2$ \\ -Total\_pressure & Total pressure & Scalar & always positive & $lb/ft^2$ \\ -Impact\_pressure & Impact pressure & Scalar & always positive & $lb/ft^2$ \\ -Dynamic\_pressure & Dynamic pressure & Scalar & always positive & $lb/ft^2$ \\ -\hline -Static\_temperature & Static temperature & Scalar & always positive & -$^{\circ}$R \\ -Total\_temperature & Total temperature & Scalar & always positive & -$^{\circ}$R \\ -\hline -\end{tabular} - -\subsection{Miscellaneous Quantities (Cont.)} - -\begin{tabular}{|l|p{2.0in}|p{1.0in}|p{1.0in}|l|} \hline -\textbf{Variable Name} & \textbf{Variable Description} & \textbf{Data -type} & \textbf{Sign convention} & \textbf{Units of Measure} \\ \hline -Sea\_level\_radius & Radius from earth center to local plumb sea level & Scalar & outward & ft \\ -Earth\_position\_angle & Amount of rotation of the earth since reference time & Scalar & from ref time & rad \\ -\hline -Runway\_altitude & Height of runway threshold above local plumb sea level (geodetic) & Scalar & up & ft \\ -Runway\_latitude & Geodetic latitude of runway threshold & Scalar & northward & rad \\ -Runway\_longitude & Geodetic longitude of runway threshold & Scalar & westward & rad \\ -Runway\_heading & Runway heading & Scalar & clockwise from north & rad \\ -Radius\_to\_rwy & Radius from earth center to runway threshold point & Scalar & outward & ft \\ -\hline -D\_cg\_rwy\_local\_v[3]; & Location of center of gravity relative to runway threshold in local frame & 3-element array & - - & ft \\ -D\_cg\_north\_of\_rwy & Distance of center of gravity northward from runway threshold & Scalar & northward & ft \\ -D\_cg\_east\_of\_rwy & Distance of center of gravity eastward from runway threshold & Scalar & eastward & ft \\ -D\_cg\_above\_rwy & Height of center of gravity above runway threshold & Scalar & up & ft \\ -\hline -D\_cg\_rwy\_rwy\_v[3] & Location of center of gravity relative to runway threshold in runway frame & 3-element array & - - & ft \\ -X\_cg\_rwy & Distance of center of gravity along runway centerline & Scalar & beyond threshold & ft \\ -Y\_cg\_rwy & Distance of center of gravity right of runway centerline & Scalar & right of CL & ft \\ -H\_cg\_rwy & Height of center of gravity above runway threshold & Scalar & up & ft \\ -\hline -D\_pilot\_rwy\_local\_v[3] & Location of pilot's eyepoint relative to runway threshold in local frame & 3-element array & - - & ft \\ -D\_pilot\_north\_of\_rwy & Distance of pilot's eyepoint northward form runway threshold & Scalar & northward & ft \\ -D\_pilot\_east\_of\_rwy & Distance of pilot's eyepoint eastward from runway threshold & Scalar & eastward & ft \\ -D\_pilot\_above\_rwy & Height of pilot's eyepoint above runway threshold & Scalar & up & ft \\ -\hline -D\_pilot\_rwy\_rwy\_v[3] & Location of pilot's eyepoint relative to runway threshold in runway frame & 3-element array & - - & ft \\ -X\_pilot\_rwy & Distance of pilot's eyepoint along runway centerline & Scalar & beyond threshold & ft \\ -Y\_pilot\_rwy & Distance of pilot's eyepoint right of runway centerline & Scalar & right of CL & ft \\ -Z\_pilot\_rwy & Height of pilot's eyepoint above runway threshold & Scalar & up & ft \\ -\hline -\end{tabular} - -\end{document} diff --git a/Docs/FDM/LaRCsim/LaRCsim_generics_v_1.4.xls b/Docs/FDM/LaRCsim/LaRCsim_generics_v_1.4.xls deleted file mode 100755 index 14f1dfc82740250ce3eda460b6d769fe8185cb9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43008 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 bm6dQ$DG>RK6)9^q0+i!!f|Dcu*Ps3W@REgE diff --git a/Docs/FDM/LaRCsim/manual.ps.gz b/Docs/FDM/LaRCsim/manual.ps.gz deleted file mode 100644 index 1cc09b8a27cd73d782be1c70339ffa4194944440..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73588 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 z zzrLiu`}2&&05?P+67A>ol)vTzDsf|h8k3Xwr<*r7H*9=9#hE=Hj;^oAkYQYe!KXON zGX7^C|3j=PtD?lm+z&p|SCPym{ZsiP8y%?8JgmFN2JSj*TC+avWn@T>M1 zSjcklx0d!imt66Y{K8ww*6~D_gEzN7y^rg6Hax!^4KGHM>&u}o*A;zA7@X^R#Yp<} zMDPKN=%mmdqc6!fnqLN*aPlZe*B9d?^gz$P#*n7@qwo2XR|EWJyta0{!njySM-FI;_U-B1>&*FbQ4K7Zf(HNF=Z&`Jfwq6*#d?e z)8Bnsb1i5qYt7O>MRbW*+Zl2YaF{+@6jWd31%=CX}J{s>JpztFNt6EV_f z@%-S%rc>kg1^JcaDb8#~>%nI-WM3qaF}~UoyIpl)-MHfzUnkFo!~byuEWl#$6N6IX z2Ys4tIfVK7?Fkj@ zMsFeAJ2VTg=wE(1Rmfp6c+Ylty~L3IO#e)C!!u$hmNJ|-bj3%PEH0}8mbidNL^+Vjz5=oTlq^sCjcEuRqDD|8C(1}|=IKfis2y9L&fez=CwAik*|=*6#hEkO(x ze3baU#+xS-dh_UXB4<=o7Cw`H)7ABGG@{Mo1CUw*5FKBg?ou2x7heRXE3^P3-aapB zz27DFLIOF+YD_Q(*RmS_8)6?)1&C8xg*ch7zRu=i27jeqUzW%wr{fi&dWUf&Tedv3 zk?2+Y_dmB^_0*7s58lKZIr{5TrmiUERGnjPXxAbu(!U(KWY#WuknpH!s%M~%&ood~ z96*IqPXxufUdr!}F5Bj**?%`%ffHZpHkDhn^{23m4#VgKkdA6EI{ph3yq=`y$4lBj;(TDa z6!e)vv%d&tNmS$vtSe6O=Xb-atMS!U+;8RJ!+a~3Q8apFH1pK$c|UbadA|MBEfG3w zgwO#N`sPPrfmo>=<7-Yw*6LYXMlz)L(Ll%3-YdyCT>g$%{`4a*y4?n`LOiV-P6fWz mEM$5QIZBiCX`eSS94R;95AkX7kFP%b9R44bOKGw%9|Hh}f8J97 diff --git a/Docs/FDM/LaRCsim/manual.tex.gz b/Docs/FDM/LaRCsim/manual.tex.gz deleted file mode 100644 index 94603b726ead873ad8d5df044c0531412ca72824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27738 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 diff --git a/Docs/FDM/airspeed.txt b/Docs/FDM/airspeed.txt deleted file mode 100644 index 4645ec932..000000000 --- a/Docs/FDM/airspeed.txt +++ /dev/null @@ -1,69 +0,0 @@ -From: AJBrent@aol.com -To: x-plane@me.umn.edu -Subject: Airspeed Refresher Training -Date: Fri, 19 Sep 1997 03:28:53 -0400 (EDT) - -Excerpts from the book: An Invitation to Fly--Basics for the Private Pilot. - -The airspeed indicator registers the total pressure from the pitot head and -subtracts from it the static pressure supplied from the static ports. This -remainder is called dynamic pressure, which is the measure of the airplane's -forward speed. This speed is displayed on the instrument's face on a -graduated scale called indicated airspeed (IAS). Remember that this value -represents the airplane's speed through the air, not necessarily it's speed -across the ground. Why? Once it is airborne, the airplane becomes part of -the local mass of air. If the mass of air is moving (that is, if the wind is -blowing), the airplane will move with the air. While this is an important -consideration during takeoffs and landings (when the airplane is making the -transition between flight and ground operations) and for navigation (the -moving airmass can carry the plane off course, like a ship in ocean -currents), it means very little to the pilot in terms of normal flight -dynamics. The airplane flies because of the speed of the relative wind, and -this is what the airspeed indicator measures, not ground speed. - -Types of Airspeed: ---Indicated Airspeed. This is the direct reading of airspeed taken from the -face of the instrument, uncorrected for air density, positional errors due to -the pitot head installation, or internal instrument error. ---Calibrated Airspeed (CAS) is the indicated airspeed corrected for minor -installation and pitot head position error and mechanical losses within the -instrument itself. The manufacturer or instrument repair shop provides these -values on a cockpit reference card or in the Pilot's Operating Handbook. -[In X-Plane, I assume we are provided a perfect airspeed instrument so that -IAS and CAS are the same. CAS is not simulated.] ---Equivalent Airspeed is calibrated airspeed corrected for the -compressibility effects of high-speed flight. Normally this is not relevant -to private pilot flight planning. [And is not simulated in X-Plane as of -ver. 3.4. Equivalent airspeed is also the same as IAS in X-Plane.] ---True Airspeed is equivalent airspeed (or calibrated airspeed if -compressibility effects are negligible) [IAS in X-Plane] corrected for the -effects of less dense air at higher altitudes. For most light airplanes, -true airspeed and calibrated airspeed are very close at sea level, but they -can diverge rapidly after the airplane climbs several thousand feet. Since -true airspeed reflects the actual physical rate at which the aircraft is -moving through the air, it is of key importance in air navigation. - -You can easily recall the sequence of airspeed corrections leading to true -airspeed by memorizing the acronym ICE-T, the first letters of the four -airspeeds presented above. [Indicated, calibrated, and equivalent airspeeds -are all the same in X-Plane. So, it's just IT.] Equivalent airspeed is -important only on high-performance, turbine-powered airplanes. True -airspeed, however, must be determined before wind correction angle or ground -speed can be computed for any airplane. To make quick, accurate computations -of wind correction angle, time, distance, ground speed, and true airspeed, -you will need either a flight computer, a kind of circular slide rule, or an -electronic flight calculator, a pocket calculator constructed with special -keys and reference programs for air navigation problems. To determine true -airspeed using the flight computer, you must know the following: pressure -altitude, which may be read from the altimeter in flight with 29.92 set in -the Kollsman window; temerature in degrees Celsius, which may be read in -flight from the OAT gauge [must be converted from Fahrenheit in X-Plane]; and -indicated airspeed, which may be read from the airspeed indicator in flight. -------- -I've tried it on X-Plane using a circular, slide-rule type flight computer -while flying a Beech B99 and the F-86 at various speeds and altitudes; and it -works! My calculated TAS matched X-Plane's displayed TAS to within 2 knots -every time. - -Andy Schroeder -ajbrent@aol.com diff --git a/Docs/InstallGuide/HTML/arizona.gif b/Docs/InstallGuide/HTML/arizona.gif deleted file mode 100644 index 3ba1865f43803f6fff0b6411c9e0fe137e09909d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150434 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 Mkuy2>G9Ul|J3c5Xj{pDw diff --git a/Docs/InstallGuide/HTML/getstart.html b/Docs/InstallGuide/HTML/getstart.html deleted file mode 100644 index 56f395a93..000000000 --- a/Docs/InstallGuide/HTML/getstart.html +++ /dev/null @@ -1,3445 +0,0 @@ - - -FlightGear Flight Simulator - Installation and Getting Started -

FlightGear Flight Simulator - Installation and Getting Started

- - -

- -

Michael Basler (pmb@knUUt.de)
- Bernhard Buckel - (buckel@wmad95.mathematik.uni-wuerzburg.de)
- -

-

-

June 30, 1999

- -

- -

Contents

1  Want to have a free flight? Take FlightGear !
chapter.1 -    1.1  Yet another Flight Simulator?
section.1.1 -    1.2  A short history of FlightGear
section.1.2 -    1.3  System requirements
section.1.3 -    1.4  Whom this guide is addressed to and how it is organized
section.1.4 -2  Getting the engine: Installing OpenGL graphics drivers
chapter.2 -    2.1  3DFX under Linux
section.2.1 -    2.2  Rendition Chipset under Windows 98/NT
section.2.2 -    2.3  RIVA TNT Chipset under Windows 98/NT
section.2.3 -    2.4  3DFX chip based boards under Windows 98/NT
section.2.4 -    2.5  OpenGL software rendering under Windows 98/NT
section.2.5 -3  Building the plane: Compiling the program
chapter.3 -    3.1  Compiling under Linux
section.3.1 -    3.2  Compiling under Windows 98/NT
section.3.2 -4  Preflight: Installing FlightGear
chapter.4 -    4.1  Installing the Binaries on a Windows system
section.4.1 -    4.2  Installing Support files
section.4.2 -5  Takeoff: How to start the program
chapter.5 -    5.1  Starting under Linux
section.5.1 -    5.2  Starting under Windows 98/NT
section.5.2 -    5.3  Command line parameters
section.5.3 -        5.3.1  General Options
subsection.5.3.1 -        5.3.2  Features
subsection.5.3.2 -        5.3.3  Flight model
subsection.5.3.3 -        5.3.4  Initial Position and Orientation
subsection.5.3.4 -        5.3.5  Rendering Options
subsection.5.3.5 -        5.3.6  Scenery Options Options
subsection.5.3.6 -        5.3.7  HUD Options
subsection.5.3.7 -        5.3.8  Time options
subsection.5.3.8 -6  Flight: All about instruments, keystrokes and menus
chapter.6 -    6.1  Keyboard commands
section.6.1 -    6.2  Menu entries
section.6.2 -    6.3  The head up display
section.6.3 -    6.4  The Panel
section.6.4 -7  Landing: Some further thoughts before leaving the plane
chapter.7 -    7.1  Those, who did the work
section.7.1 -    7.2  What remains to be done
section.7.2 -8  Missed approach: If anything refuses to work
chapter.8 -    8.1  General problems
section.8.1 -    8.2  Potential problems under Linux
section.8.2 -    8.3  Potential problems under Windows 98/NT
section.8.3 - -

-

-Chapter 1
Want to have a free flight? Take FlightGear ! -

- -

-

-1.1  Yet another Flight Simulator?

-Did you ever want to fly a plane yourself, but lacked the money or -skills to do so? Do you belong to those real pilots, who want to -improve their skills without having to take off? Do you want to -try some dangerous maneuvers without risking your life? Or do you -just want to have fun with a more serious game not killing any -people? If any of these questions applies, PC flight simulators -are just for you. - -

-If you are reading this you might have got already some experience either using -Microsoft -'s © FS98 -, Looking Glass -' © -Flight Unlimited II - or any other of the commercially available PC flight -simulators. As the price tag of those is usually within the 50$ range buying one of them -should not be a serious problem given the fact, that running any serious PC flight -simulator requires a hardware within the 1500$ range, despite dropping prices, at least. - -

-Why then that effort of spending hundreds or thousands of hours of -programming to build a free simulator? Obviously there must be -good reason to do so: - -

- -

    -
  • All of the commercial programs have a serious drawback: They are made - by a small group of developers defining their properties - often - quite inert and not listening too much to the customer. - Anyone ever trying to contact Microsoft - will - immediately agree. - -
  • Commercial PC flight simulators usually try to cover a market - segment as broad as possible. For obvious reason, most of them want - to serve the serious pilot as well as the beginner and the gamer. - The result are compromises. As FlightGear is free, there is no need - for such compromises; it just can be given the properties its users - want. It defines itself via building. - -
  • Building a flight simulator is a challenge to the art of - programming. Contributing to that project makes you belong to - those being able to contribute to serious, ambitious and - advanced software projects. - -
  • It is fun. Not only is it fun to write the code (... or - documentation...) but also to belong to that - temporarily changing - - club of clever people on the net having discussed, struggled and finally - succeeded in creating that project. Even reading the FlightGear - mailing lists is informative and fun for itself. -
-

-The above-mentioned points make FlightGear different from its competitors in several -respect. FlightGear aims to be a civilian, - -multi-platform, - open, - -user-supported, - user-extensible - simulator. - -

- -

    -
  • Civilian: - The - project is primarily aimed to civilian flight simulation. - It should be appropriate for simulating - general aviation as well as civilian aircraft. However, according to - the open concept of development that sure does not exclude someone - taking the code and integrating military components -. - -

    - -

  • Multi-platform: - The - developers are attempting to keep the code as platform-independent - as possible. This is based on their observation that - people interested in flight simulations run quite - a variety of computer hardware and operating systems. The present code - supports the following Operating Systems -: - -
      -

      - -

    • Linux - (any platform), - -
    • Windows NT - (i86 platform), - -
    • Windows 98(95) -, - -
    • BSD UNIX -, - -
    • SGI IRIX -, - -
    • SunOS -, - -
    • MacIntosh (experimental). -
    -

    -There is no known flight simulator, neither commercially nor free, supporting such a -broad range of platforms. - -

    - -

  • Open: - The project is not - restricted to a closed club of developers. Anyone who feels he or she - being able to contribute is highly welcome. - The code (including documentation) is copyrighted under the - terms of the Gnu Public License -. - -

    - The Gnu Public License is often misunderstood. In simple terms it - states that you can copy and freely distribute the program(s) licensed - to it. You can modify them, if you like. You are even allowed to charge - as much money for the distribution of the modified or original program as you want. - However, you must distribute it complete with the entire source code - and it must retain the original copyrights. In short: -


    -

    - -

    ''You can do anything with the software except -making it non-free''.

    - -

    -The full text of the Gnu Public License - can be obtained from - -

    -http://www.gnu.org/copyleft/gpl.html. - -

    - -

  • User-supported, user-extensible: - - - Contrary to various - commercial simulators available, scenery and aircraft format, - internal variables, etc. are user accessible and documented - from the beginning. Even without an explicit developmental documentation -, - which sure has to be written at some point, this is guaranteed by supplying the - source code -. It is the goal of the developers to build a basic - engine to which scenery designers, panel engineers, maybe adventure - or ATC routine writers, sound capturers and others can (and are asked to) - add. It is our hope, that the project will finally gain from the creativeness - and ideas of the hundreds of talented simmers across the world. -
-

- Without doubt, the success of the Linux - project initiated by Linus - Torvalds - inspired several of the developers. - Not only has it shown that distributed development of even highly sophisticated - software projects over the Internet is possible. It led to a product which, - in several respect, is better than its commercial competitors. - -

-

-1.2  A short history - of FlightGear

- -

-This project goes back to a discussion of a group of net-citizens in 1996 resulting in a -proposal written by David Murr - who, unfortunately, dropped out from -the project (as well as the net) later. The original proposal - is still available -from the FlightGear web site and can be found under - -

-http://www.flightgear.org/proposal-3.0.1 - -

-Although the names of the people and several of the details -naturally changed in time, the spirit of that proposal was clearly -retained up to the present status of the project. - -

-Actual coding started in summer 1996 and by the end of that year essential graphics -routines were completed. At that time, programming was mainly done and coordinated by -Eric Korpela - from Berkeley University -(korpela@ssl.Berkeley.EDU). Early code was running under Linux - as well as -under DOS -, OS/2 -, Windows 95/NT -, and Sun-OS -. This was -quite an ambitious project, as it involved, among others, writing all the graphics -routines - in a system-independent way just from scratch. - -

-Development slowed down and finally stopped at the beginning of 1997 when Eric had to -complete his thesis. At this point, the project seemed to be dead and traffic on the -mailing list went down to nearly nothing. - -

-It was Curt Olson - from the University of Minnesota -(curt@flightgear.org) who re-started the project in the middle of 1997. His idea -was as simple as successful: Why invent the wheel a second time? There have been several -free flight simulators - available running on -workstation -s under different flavors of UNIX -. One of these, -LaRCsim -, having been developed by Bruce Jackson - from NASA -(jackson@larc.nasa.gov) seemed to be well-adapted for the present approach. Curt -took this one apart and re-wrote several of the routines in a way making them build-able -as well as run-able on the intended target platforms. The key idea in doing so was -selecting a system-independent graphics platform, i. e. OpenGL -, for the basic -graphics routines -. -


-

- -



Fig. 1: The Navion - flight model is one of the features FlightGear -inherited from LaRCsim -. Until now it is the only one plane being fully realized -in FlightGear . -


-

-In addition, a clever decision on the selection of the basic scenery - data was -already made in this very first version. FlightGear Scenery is created based on -satellite data published by the U. S. Geological Survey -. These terrain data are -available for the whole world over the Internet for free from - -

- http://edcwww.cr.usgs.gov/doc/edchome/ndcdb/ndcdb.html - -

- for the US resp. - -

- http://edcwww.cr.usgs.gov/landdaac/gtopo30/gtopo30.html - -

- for other countries. Those freely accessible scenery data in - conjunction with scenery building tools provided with - FlightGear are an important prerequisite enabling anyone to - create his or her own scenery, at least in principle. - -

-This new FlightGear code - still largely being based on original LaRCsim - code - -was released in July 1997. From that moment the project gained momentum again. Here are -some milestones from the more recent history of development: - -

- -

    -
  • Sun, moon and stars are a field where PC flight simulators - have been notoriously weak for ages. It is one of the great - achievements of FlightGear that it includes accurate sun (watch, Microsoft!), - moon, and planets, being moreover placed on their proper positions. - The corresponding astronomy code - was implemented in fall 1997 by Durk - Talsma - - (pn_talsma@macmail.psy.uva.nl). - -

    - -

  • Texture support - was added by Curt -Olson - - (curt@flightgear.org) in spring 1998. This marked a - significant improvement in terms of reality. You may recall: MSFS had - untextured scenery up to version 4.0. For this purpose, some high-quality - textures were submitted by Eric Mitchell - - (mitchell@mars. ark.com. - -

    - -

  • A HUD - (head up display -) was added based on code - provided by Michele America - - (nomimarketing@mail.telepac.pt) and - Charlie Hotchkiss - -(chotch kiss@namg.us.anritsu.com) - in fall 1997 and continuously improved later, mainly by Norman Vine -(nhv@laserplot.com). - While being probably not a substitute for a panel - and moreover - possibly being a bit odd in that tiny Navion -, this HUD - has proven - extremely useful in navigation until now. - -

    - -

  • After improving scenery - and -texture - support and adding some more - features there was a disappointing side-effect in spring 1998: Frame - rates - dropped down to a point where FlightGear became inflyable. There - were two main achievements overcoming this problem. First, with the advent - of hardware OpenGL - support and corresponding drivers for most of - the graphics cards these features could be exploited in - FlightGear as well, leading to a frame rate - boost by a - factor up to 10. Second, Curt Olson - (curt@flightgear.org) - implemented so-called view frustrum culling - (a procedure to except part of - the scenery not required from rendering) which gave another 20% or so of - frame rate boost in May 1998. - -

    - With these two achievements FlightGear became flyable again even on weaker - machines as long as they included a 3D graphics board with - hardware OpenGL - support. With respect to this point one should keep in mind that code - at present is in no way optimized leaving a lot of room for further - improvements of frame rate. - -

    - -

  • A rudimentary autopilot - implementing heading hold was -contributed by Jeff Goeke-Smith - (jgoeke@voyager.net) in -April 1998. The autopilot was improved, included adding an altitude hold and a terrain -follow switch, in October 1998. - -

    - -

  • The basics for selectable menu -s were laid based on Steve Baker's - - (sjbaker@ hti.com) portable library PLIB - in June 1998. After having been idle for a - long time, first working menu entries came to life in spring 1999. - -

    - -

  • Friedemann Reinhard - -(mpt218@faupt212.physik.uni-erlangen.de) - developed early panel code -, including a working airspeed - indicator -, which was added in June 1998 and has been considerably improved until today. - -

    - -

  • There was basic audio support -, i. e. an audio library and some basic background engine sound, contributed by Steve -Baker (sjbaker@hti.com) - in Summer 1998. Today, the audio -library is part of Steves's above-mentioned portable library PLIB -. This same -library was extended to support joystick /yoke/rudder later which brought FlightGear -joystick support in October 1989, again marking a huge improvement in terms of realism. - -

    - -

  • In September 1998 Curt Olson - -(curt@flightgear.org) succeeded in creating first complete terrain Scenery for the -USA, which is available for download from - -

    -ftp://ftp.kingmont.com/pub/kingmont/ - -

    -Scenery was further improved by Curt via adding features like lakes, rivers, coastlines -and the like in spring 1999. - -

    - -

  • In June 1999 there was a split of the source tree into a stable and a developmental -branch. Even version numbers as 0.6, 0.8, and (hopefully) 1.0 refer to stable versions -being intended for general use while odd versions as 0.7 and so on refer to developmental -versions. Policy is to do only bug fixes in the even versions, while new features are -generally added to odd-numbered versions, which finally after things stabilized will turn -into the next stable version by adding 0.1. At present (and probably in the future), this -guide refers to the stable branch. - - -

    -

This is by no way a complete history and a lot of people making even important -contributions were left out here. Besides the named achievements being more on the -surface there was a lot of work done concerning the internal structure, by Steve -Baker - (sjbaker@hti.com) -, Norman -Vine - (nhv@laserplot.com), Gary R. Van Sickle - (tiberius@braemarinc.com), and others. A more complete list of -contributors to the project can be found in Landing: Some further thoughts before -leaving the plane, Chapter 7, as well as in the file Thanks -provided with the code. Moreover, the FlightGear Website - contains a detailed -history of all of the development under - -

-http://www.flightgear.org/News/ - -

-

-1.3  System requirements

- -Compared to other recent flight simulators the system requirements -for FlightGear are rather decent. A P100 is already sufficient, -given you have a proper 3D graphics card, but of course for -getting good performance we recommend a P200 or better, if you run -it on a PC. On the other hand, any not too ancient UNIX - -workstation - will run FlightGear as well. - -

-While in principle you can run FlightGear on 3D boards without OpenGL support or even on -systems without 3D graphics hardware at all, missing hardware OpenGL support can force -even the fastest PIII to its knees (frame rate -s typically below 1 fps). Any cheap -3D graphics card will do as long as it features hardware OpenGL - support. For -Windows 98/NT - drivers, you may contact the home page of the manufacturer. -Moreover, you should have in mind that several OpenGL drivers - are -still marked as beta and moreover, and sometimes these drivers are provided by the makers -of the graphics chip instead of the makers of the board. More detail on OpenGL drivers -can be found under - -

-http://www.x-plane.com/v4ibm.html - -

- as well as under - -

-http://www.flightgear.org/Hardware. - -

-Next, you need around 16MB of free disk space for installing the executable including -basic scenery. In case you want to compile the program yourself you need around 50MB for -the source code and for temporary files created during compilation, independent of the -operating system. - -

-If you want to hear the sound effects - any decent sound card - should serve. -Besides, FlightGear supports a joystick - or yoke - as well as rudder -pedals - under Linux - as well as under Windows -. - -

-With respect to operating systems, FlightGear is being primarily developed under -Linux -, a free UNIX clone developed cooperatively over the net in much the same -way as the FlightGear project itself. Moreover, FlightGear runs under Windows -95 -, Windows 98 - and Windows NT - and given you have a proper -compiler - installed can be build under all of these platforms as well. The primary -compiler for all platforms is the free GNU C++ - (i. e. the Cygnus - -compiler under Win32), however there is some support for MSVC - as well. Moreover, -FlightGear runs and can be build on several UNIX -/X11 platforms with GNU C++ -installed. - -

-

-1.4  Whom this guide is addressed to and how it is organized

- -

-At first: There is not much of the material in this Guide being originally invented by -ourself. You could even say with Montaigne that we ''merely gathered here a big bunch of -other men's flowers, having furnished nothing of my own but the strip to hold them -together''. Most (but fortunately not all) of the information can as well be grabbed from -the FlightGear home page - being situated at - -

-http://www.flightgear.org/ - -

- and its various sub pages. However, there still seems to -be a small group of people preferring neatly printed manuals over -loosely scattered Readmes and those may acknowledge our effort. - -

-This Installation and Getting Started is intended as being a first step towards -a more complete FlightGear documentation - (with the other parts, supposedly, to -be written by others). Its main addressee is the end-user who is not interested in the -internal workings of OpenGL - or in building his or her own scenery, for instance. -It is our hope, that sometime there will be an accompanying FlightGear -Programmer's Guide -, which could be based on some of the documentation under - -

-http://www.flightgear.org/Docs, - -

- a FlightGear Scenery Design Guide -, and a -FlightGear Flight School -, at least. - -

-This Installation and Getting Started is organized as -follows: - -

-The first Chapter 2, Getting the engine: Installing OpenGL graphics -drivers, describes how to prepare the computer for handling FlightGear 's graphics -routines. FlightGear is based on a graphics library called OpenGL, thus you must install -either hardware or software OpenGL support for your graphics board (except, you did so -before). - -

-Chapter 3, Building the plane: Compiling the program, explains how -to build, i. e. compile the simulator. Depending on your platform this may or may not be -required for you. There will at least be binaries available for those working on a Win32 -(i. e. Windows 98 © or Windows NT ©) platform. For those on such -systems, who want to take off immediately without going through the potentially -troublesome process of compiling, we recommend just skipping that Chapter and going -directly to the next one. - -

-In Chapter 4, Preflight: Installing FlightGear , you find -instructions for installing the binaries in case you did not so by building them in the -previous Chapter. Moreover, you'll have to install scenery and texture files, which will -be described there, too. - -

-The following Chapter 5, Takeoff: How to start the program, -describes how to start the program including an overview on the command line options. - -

-Chapter 6, Flight: All about instruments, keystrokes and menus, -describes how to operate the program, i. e. to actually fly with -FlightGear . This includes a (hopefully) complete list of key strokes, an -overview on the menu entries, as well as a detailed description of the HUD (head up -display) and the panel. - -

-In Chapter 7, Landing: Some further thoughts before leaving the -plane, we would like to give credits to those who did the hard work, and give an outlook -on what remains to be done. - -

-Finally: We kindly ask others to help us improving this document by submitting -corrections, improvements, and more. Notably, we invite others to contribute descriptions -referring to alternative setups (graphics cards, operating systems, and compilers etc.). -We will be more than happy to include those into forthcoming versions of this -Installation and Getting Started (of course not without giving credit to the -authors). - -

-We hope to continuously maintain this document at least for a foreseeable future, but -probably will not be able to produce a new one for any single release of FlightGear . -While we are both watching the mailing lists, it might help, if developers adding new -functionality could send us a short note. - -

-

-Chapter 2
Getting the engine: Installing OpenGL - graphics drivers - -

-FlightGear 's graphics engine is based on a graphics library - called -OpenGL -. Its primary advantage is it's platform independence, i. e., programs -written with OpenGL - support can be compiled and executed on several platforms, -given the proper drivers having been installed in advance. Thus, independent of if you -want to run the binaries only or if you want to compile the program yourself you must -install some sort of OpenGL - support for your video card -. Naturally, you -can skip this Chapter in case you already did (maybe for Quake or some other game). - -

-Unfortunately, there are so many graphics boards, graphics chips and drivers that we are -unable to provide a complete description for all systems. To give beginners a hand, we -just describe what we did to install drivers on our systems, which might be not too -exotic. - -

-By any means, try getting hardware OpenGL - drivers for your system, which is -exemplary described in Sections 2.1 to 2.4, resp. If you are -unable to locate any such drivers you can try software support - as detailed under 2.5. - -

-

-2.1  3DFX - under Linux - -

- -

-An excellent place to search for documentation about Linux and 3D accelerators is the -Linux Quake - HOWTO at - -

-http://www.linuxquake.com. - -

-It describes all the following steps in an in-depth fashion and -should be your first aid in case something goes wrong with your 3D -setup. - -

-The 3DFX - graphics card is a quite popular one (We tested -the Voodoo -1 to work). At first, you need the GLIDE - -library installed. Grab it at: - -

-http://www.3dfx.com/software/download_glidel.html - -

- and install it. -Be careful, you need different Glide libraries for the different types of VooDoos (I, II, III Banshee). -There is even an install script included that will do things for you. The canonical place -for GLIDE - is /usr/local/glide, if you prefer another location, you'll -have to edit the Makefile for FlightGear by hand. Be sure to read and understand the -file /usr/local/glide/README. Next, you need to install the MESA - library -version 3.0 (or later). Grab it at - -

- ftp://iris.ssec.wisc.edu/pub/Mesa, - -

- unpack it and run - -

- make linux-glide - -

- in the Mesa - directory. Follow the instructions in the README file, take -a close look at README.3DFX and play with the demo programs. - -

-Besides these, you need the GLUT - library version 3.7 (or -greater, aka GameGLUT) installed. Grab it at: - -

- http://reality.sgi.com/opengl/glut3/glut3.html. - -

- Note: Glut-3.7 is included with Mesa - 3.0 so if you've already grabbed the latest -version of mesa, you should have everything you need. - -

-For the lazy of you, there is of course the possibility to install the 3D stuff included -in your distribution. At least RedHat - 6.0 and SuSE - 6.1 are known to -contain all the necessary stuff. - -

-Finally, some more notes on the behavior of Voodoo - boards: - -

-Your card comes packaged with a loop-through-cable -. If you -have only one monitor, then the Voodoo will take it over when -used. This means that all the applications on your desktop will -continue running but you'll only see the FlightGear screen. If -your window manager uses a focus-follows-mouse policy, don't move -the mouse. If you lose the focus, there's no way to shut down -FlightGear graciously! Better solution: Use two monitors, one for -your desktop, connect the other one to your accelerator. You'll -then get a window on your desktop which manages all keyboard -events and you're still able to see your desktop. - -

-Running FlightGear under Linux using a 3DFX accelerator board is -somewhat tricky. Most of the boards behavior is controlled by -environment variables. - The two most -important are: - -

- -

    -
  • MESA_GLX_FX: When set to f rendering will be in - fullscreen mode, - w will perform rendering in a window at a significant speed penalty. - -

    - -

  • FX_GLIDE_NO_SPLASH: - When set to 1 the rotating 3DFX logo - won't appear. For a description of all environment - variables - for VooDooI/II have a look at - -

    -http://www.bahnhof.se/~engstrom/e_3dfxvars.htm. - -

    -

This completes preparing your 3DFX - equipped Linux PC for running -FlightGear . -Now proceed and install the support files as described later in this document. - -

-

-2.2  Rendition Chipset - under - Windows 98/NT - -

- -

-This Section serves as an example for installing OpenGL - drivers under -Windows 98/NT -. The Rendition 2100 chipset - is, for instance, included in -the Diamond Stealth II - card performing especially well in somewhat weaker -machines. - -

-Diamond itself does not provide any OpenGL - driver support for that board. -However, Rendition, who make the graphics chip, do. Go to their Web site and grab the -latest OpenGL - Windows drivers - from - -

- http://www.rendition.com/download.html - -

- Follow the description in readme.txt. We recommend making -the drivers the default ones by copying them to -\windows\system (which avoids the -hassle of not being sure which driver actually runs). - -

-With this step you're already done. - -

-According to our experience, so-called mini-OpenGL - drivers -provided by some manufacturers for making Quake playable do not -provide the level of OpenGL support required by FlightGear . At -least, Rendition's mini-OpenGL - driver definitely does not. - -

-

-2.3  RIVA TNT Chipset - under - Windows 98/NT - -

- -

-Because of its high performance, the RIVA TNT is one of the most popular chipsets today. -The Diamond Viper 550 -, ELSA Erazor-2, Creative Graphics Blaster -, and -more cards come equipped with this chip. At least the default Viper 550 drivers are known -to us having native built-in OpenGL support making any add-on OpenGL drivers obsolete. -Similar things should apply to the other RIVA TNT based boards. In any case, NVIDIA's -reference drivers being available from - -

- http://www.nvidia.com/ - -

- do the job as well. - -

-

-2.4  3DFX chip based boards - under - Windows 98/NT - -

- -

-The 3DXF - based 3D add-on or 2D/3D boards are perhaps the -most popular ones today at all. 3DFX - made Beta OpenGL -Windows 98 drivers available on their Website at - -

-http://www.3dfx.com. - -

- From the main page go to Develop 3DFX and further to SDKs and -Demos and grab them there. - -

-First, make sure you have the file glu32.dll either under -\Windows\System or elsewhere in your path. If not, install -the MS OpenGL kit opengl95 available from Microsoft or elsewhere on the net -(which by itself only provides software rendering). - -

-Next, locate the file 3dfxopengl.dll. in the 3DFX driver package, rename it to -opengl32.dll and copy it into \Windows\System -overwriting the file with the same name installed from the MS kit. This should get you -going. - -

-

-2.5  OpenGL - software rendering - -under Windows 98/NT -

- -

-If you have an accelerated 3D card, it is highly recommended you -install hardware OpenGL - drivers for your specific card. - -

-However, in case you are really unable to find such drivers and -want to try FlightGear despite this you can install SGI software -OpenGL - rendering. For this purpose, get the file -sgi-opengl2.exe from - -

-ftp://ftp.flightgear.org/pub/fgfs/Misc/. - -

- This is a Windows 98/NT - self extracting installation -program. Install it by double-clicking in Windows explorer. The -package includes some demo games you may wish to try by invoking -them from the Start menu. - -

-

-Chapter 3
Building the plane: Compiling - the program -

-This central Chapter describes how to build FlightGear on several systems. In case you -are on a Win32 (i. e. Windows 98 or Windows NT) platform you may not want to go though -that potentially troublesome process but instead skip that Chapter and straightly go to -the next one. (Not everyone wants to build his or her plane himself or herself, right?) -However, there may be good reason at least to try building the simulator: - -

- -

    -
  • In case you are on a UNIX -/Linux - platform there are supposedly no -pre-compiled binaries - available for your system. We do not -see any reason why the distribution of pre-compiled binaries (with statically linked -libraries) should not be possible for UNIX - systems in principle as well, but in -practice it is common to install programs like this one on UNIX - systems by -recompiling them. - -

    - -

  • There are several options you can set only during -compile time. One such option is the decision to compile with -hardware or software OpenGL - rendering enabled. A more -complete list goes beyond this Installation and Getting -Started and should be included in a future -FlightGear Programmer's Guide -. - -

    - -

  • You may be proud you did. -
-

-On the other hand, compiling FlightGear is not a task for novice users. Thus, if you're -a beginner (we all were once) we recommend postponing this and just starting with the -binary distribution to get you flying. - -

-Besides, there have been two branches of code starting from version 0.6. For more -details, see Section 1.2. This description generally refers to the stable, -even-numbered branch. It is almost certain, that odd-numbered versions require -modifications to that. - -

-As you will note, this Chapter is far from being complete. Basically, we describe -compiling for two operating systems only, Windows 98/NT - and Linux -. There -is a simple explanation for this: These are just the systems we are working on. We hope -to be able to provide descriptions for more systems based on contributions written by -others. - -

-

-3.1  Compiling - under Linux -

- -

-If you are running Linux you probably have to build your own -binaries -. The following is one way to do so. - -

- -

    -
  1. FlightGear needs some supplementary libraries which are usually - not contained in any distribution we know of. These are: - -

    - -

      -
    • plib which is absolutely essential for the building - process. Get the latest version of plib at - http://www.woodsoup.org/projs/plib/ and follow the - instructions contained in README.plib. - -

      - -

    • gfc is only needed if you want to build the scenery - generation tools but it doesn't hurt to have it installed. It can - be found along with the building instructions at - http://www.geog.psu.edu/ qian/gfc/index.html. - -

      - -

    • gpc which is also needed for the scenery generation - tools. Get it from - http://www.cs.man.ac.uk/aig/staff/alan/software/, building - instructions can be found in README.gpc in your FlightGear source - directory. - -

      -

    Now you are ready to proceed to the task of getting, compiling and installing FlightGear itself: - -

    - -

  2. Get the file FlightGear-x.xx.tar.gz from the - source subdirectory under - -

    - ftp://ftp.flightgear.org/pub/fgfs/Source/ - -

    - -

  3. Unpack it using : - -

    - tar xvfz FlightGear-x.xx.tar.gz. - -

    - -

  4. cd into FlightGear-x.xx. Run: - -

    - ./configure - -

    - and wait a few minutes. configure - knows about a lot of -options. Have a look at the file INSTALL in the -FlightGear source directory to learn about them. If run without -options, configure assumes that you will install the data files -under /usr/local/lib/FlightGear. - -

    - -

  5. Assuming configure finished successfully, simply run - -

    - make - -

    - and wait for the make process to finish. - -

    - -

  6. Now become root (for example by using the su command) and -type - -

    - make install. - -

    - This will install the binaries - in /usr/local/bin. - -

    -There is a problem concerning permissions under Linux/Glide. All programs accessing the -accelerator board need root permissions. The solution is either to play as root (this is -bad practice and not always possible) or make the /usr/local/bin/fgfs -binary setuid root, i.e. when this binary is run root privileges are given. Do -this by issuing (as root) - -

    - chmod +s /usr/local/bin/fgfs. - -

    - Again, this is a quick and dirty hack. The perfect solution for this - problem is using a kernel module called 3dfx.o. It is available - along with documentation at http://www.xs4all.nl/ carlo17/3dfx/index.html - and it might be a good idea to read some of the Quake-related links there! - -

    - To install this kernel module, just download it, become root and - issue the following commands: - -

    -mkdir dev3dfx - -

    -cd dev3dfx - -

    -tar xvfz ../Dev3Dfx-2.7.tar.gz - -

    -make - -

    -cp 3dfx.o /lib/modules/`uname -r`/misc - -

    -mknod /dev/3dfx c 107 0 - -

    -insmod 3dfx - -

    -It is a good idea to put the last line into one of your bootup scripts! After having -installed this module, you can even go ahead and remove the S-bit from all programs -that need access to your 3D hardware. - -

    -

-3.2  Compiling - under Windows 98/NT -

- -

- -

    -
  1. Windows, contrary to Linux which brings its own compiler, comes -not equipped with developmental tools. Several compilers have been shown to work for -compiling FlightGear , including the Cygnus Win32 port of GNU C -++ and the -MS Visual C - compiler. Given that the project will be a free one we prefer the -Cygnus Compiler as it provides a free development environment. However, we will be happy -to include a proper description in case those who worked out how to compile with MSVC or -other Compilers provide one. - -

    - -

  2. Install and configure the Cygnus - Gnu-Win32 development - environment. The latest version is Beta 20. The main - Cygnus Gnu-Win32 page is at: - -

    - http://sourceware.cygnus.com/cygwin/. - -

    - You can download the complete Cygnus Gnu-Win32 compiler from: - -

    - ftp://go.cygnus.com/pub/sourceware.cygnus.com/cygwin/latest/full.exe. - -

    - Be sure to read this package's README files to be found under the main page, first. - -

    - To install the compiler, just run full.exe by double-clicking in - Windows explorer. After doing so you'll find a program group called - Cygnus Solutions in your Start menu. Do not forget making a copy of the - shell under c:/bin, as detailed in the docs. - -

    - -

  3. Open the Cygnus shell via its entry in the Start menu. - Mount the drive where you want to build FlightGear as follows - (assuming your FlightGear drive is d:): - -

    - mkdir /mnt
    - mount d: /mnt - -

    - You only have to do this once. The drive stays mounted (until you - umount it) even through reboots and switching off the machine. - -

    - -

  4. Before actually being able to compile FlightGear you have to install a hand full -of support libraries required for building the simulator itself. Those go usually into -c:/usr/local and it is highly recommended to choose just that place. - -

    - First, you have to install the free win32 api library - (the latest - version being 0.1.5). Get the package win32api-0.1.5.tar.gz from: - -

    - http://www.acc.umu.se/ anorland/gnu-win32/w32api.html - -

    -Conveniently you may unpack the package just onto you FlightGear drive. Copy the file to -the named drive, open the Cygnus shell via the Start menu entry and change to the -previously mounted drive with - -

    - cd /mnt - -

    - Now, you can unpack the distribution with - -

    - gzip -d win32api-0.1.5.tar.gz
    - tar xvf win32api-0.1.5.tar - -

    - This provides you with a directory containing the named libraries. For installing them, - change to that directory with - -

    -cd win32api-0.1.5 - -

    -and type - -

    - make
    - make install - -

    -This installs the libraries to their default locations under c:/usr/local - -

    - -

  5. To proceed, you need the glut libraries -. Get these from the same site named -above - -

    -http://www.acc.umu.se/ anorland/gnu-win32/w32api.html - -

    -as glutlibs-3.7beta.tar.gz. Just copy the package to your FlightGear drive and -unpack it in the same way as describes above. There is no need to run make here. -Instead, just copy the two libraries libglut.a and libglut32.a to -c:/usr/local/lib. There is no need for the two accompanying *.def files -here. - -

    - -

  6. Next, get the Glut header files -, for instance, from - -

    -ftp:://ftp.flightgear.org/pub/fgfs/Win32/Mesa-3.0-includes.zip - -

    -Unpack these as usual with unzip -d and copy the contents of the resulting -directory /gl to c:/usr/local/include/gl - -

    - -

  7. Finally, you need Steve Backer's PLIB - being one of the key libraries for FlightGear . -Get the most recent version plib-X.X.tar.gz from - -

    -http://www.woodsoup.org/projs/plib/ - -

    -(There are mirrors, but make sure they contain the most recent version!). Copy it to your -FlightGear drive, open the Cygnus shell and unpack the library as described above. - -

    -Next, change into PLIB -'s directory. It is recommended to configure PLIB - -with the following command line (you can make a script as I did if it hurts) - -

    -CFLAGS="-O2 -Wall" CXXFLAGS="-O2 -Wall"
    CPPFLAGS=-I/usr/local/include -LDFLAGS=-L/usr/local/lib ./configure --prefix=/usr/local
    - -includedir=/usr/local/include/plib - -

    -You must write all this on one line without any line breaks in between! - -

    -Finally, build PLIB - with - -

    - make
    - make install - -

    - -

  8. Now, you're finally prepared to build FlightGear itself. - -

    - Fetch the FlightGear code and special Win32 libraries -. These -can be found at: - -

    - ftp://ftp.flightgear.org/pub/fgfs/Source/ - -

    - Grab the latest FlightGear-X.XX.zip and - win32-libs-X.XX.zip files. - -

    -(It you're really into adventures, you can try one of the recent snapshots instead.) - -

    - -

  9. Unpack the FlightGear source code via - -

    - pkunzip -d FlightGear-X.XX.zip. - -

    - -

  10. Change to the newly created FlightGear-X.XX directory with e. g. - -

    -cd //D/FlightGear-X.XX - -

    - and unpack the Win32 libraries there: - -

    - pkunzip -d win32-libs-X.XX.zip. - -

    - -

  11. You will find a file called install.exe in the Win32 -directory after unzipping win32-libs-X.XX.zip. This -version of install.exe should replace the one in your -\H-i386-cygwin32\bin directory - -it's sole claim to fame is that it understands that when many -calls to it say install foo they mean install -foo.exe. If you skip this step and attempt an install with the -older version present make install will fail. - -

    -Side Note: We need to make a distinction between the -build tree - and the install tree -. -The build tree is what we've been talking about up until -this point. This is where the source code lives and all the -compiling takes place. Once the executables are built, they need -to be installed someplace. We shall call this install location -the install tree. This is where the executables, the -scenery, the textures, and any other run-time files will be -located. - -

    - -

  12. Configure - the make system for your environment and your -install tree. Tell the configure script where you would like to install the -binaries - and all the scenery - and textures - by using the ---prefix option. In the following example the base of the install -tree is FlightGear. Make sure you are within FlightGear 's build tree -root directory. - -

    - -

  13. Run: - - -

    - ./configure --prefix=/mnt/FlightGear. - -

    - Side note: The make procedure is designed to link against opengl32.dll, glu32.dll, and -glut32.dll which most accelerated boards require. If this does not apply to yours or if -you installed SGI's software rendering - as mentioned in Subsection 2.5 -you may have to change these to opengl.dll, glu.dll, and glut.dll. (In case you're in -doubt check your \windows\system directory what you've -got.) - -

    - If this is the case for your video card -, you can edit - .../Simulator/Main/ Makefile and rename these three libraries to - their "non-32" counterparts. There is only one place in this - Makefile where these files are listed. - -

    - -

  14. Build the executable. Run: - -

    - make. - -

    -Assuming you have installed the updated version of install.exe (see earlier -instructions) you can now create and populate the install tree. Run: - -

    - make install. - -

    - You can save a significant amount of space by stripping all the - debugging symbols off of the executable. To do this, change to the - directory in the install tree where your binary lives and run: - -

    - strip fgfs.exe resp. strip fgfs-sgi.exe. -

-

-

-Chapter 4
Preflight: Installing FlightGear -

- -

-

-4.1  Installing the Binaries on a Windows system

- -You can skip this Section and go to the installation of scenery in case you built -FlightGear along the lines describes during the previous Chapter. If you did not and -you're jumping in here your first step consists in installing the binaries. At present, -there are only pre-compiled binaries - available for Windows 98/NT - while in -principle it might be possible to create (statically linked) binaries for Linux - -as well. - -

-The following supposes you are on a Windows 98 or Windows NT - system. -Installing the binaries is quite simple. Go to - -

- ftp://ftp.flightgear.org/pub/fgfs/Win32/ - -

- get the latest binaries from that subdirectory named - -

-fgfs-win32-bin-X.XX.exe - -

- and unpack them via double clicking. This will create a directory FlightGear -with several subdirectories. You are done. - -

-

-4.2  Installing Support files -

- -

-Independent on your operating system and independent on if you built the binaries -yourself or installed the precompiled ones as described above you will need -scenery -, texture -, sound -, and some more support files. A basic -package of all these is contained in the binaries directory mentioned above as - -

- fgfs-base-X.XX. - -

- Preferably, you may want to download the .tar.gz version -if you are working under Linux -/UNIX - and the .exe version if you -are under Windows 98/NT -. Make sure you get the most recent version. - -

-If you're working under Linux - or UNIX -, unpack the -previously downloaded file with - -

- tar xvfz fgfs-base-X.XX.tar.gz - -

- while under Windows 98/NT - just double click on the file (being situated in the -root of your FlightGear drive.). - -

-This already completes installing FlightGear and should you enable to invoke the -program. - -

-Some more scenery which, however, is not a substitute for the -package mentioned above but rather is based on it can be found in -the scenery subdirectory under - -

- http://www.flightgear.org/Downloads/ - -

- These may be older versions which may or may not work with the -most recent binaries. - -

-In addition, there is a complete set of USA Scenery files - -available created by Curt Olson - which can be -downloaded from - -

-ftp://ftp.kingmont.com/pub/kingmont/ - -

- The complete set covers several 100's of MBytes. Thus, Curt -provides the complete set on CD-ROM for those who really would -like to fly over all of the USA. For more detail, check the -remarks in the downloads page above. - -

-Finally, the binaries directory mentioned contains the complete FlightGear documentation -as - -

-fgfs-manual-X.XX.exe. - -

-It includes a .pdf version of this Installation and Getting Started guide -intended for pretty printing using Adobe's Acrobat reader being available from - -

-http://www.adobe.com/acrobat - -

-Moreover, if properly installed the .html version can be accessed via FlightGear 's -help menu entry. - -

-

-Chapter 5
Takeoff: How to start the program -

- -

-

-5.1  Starting under Linux

-Under Linux, FlightGear is invoked by - -

- fgfs --option1 --option2..., - -

- where the options are described in Section 5.3 below. - -

-

-5.2  Starting under Windows 98/NT -

- -

-In Windows explorer, change to the \FlightGear\ directory. -Call runfgfs.bat by double-clicking if you want to invoke the hardware -accelerated version of FlightGear fgfs.exe, or runfgfs-sgi.bat if you -installed SGI's software OpenGL - support. - -

-Alternatively, if for one or the other reason the batch does not work, you can open an -MS-DOS shell, change to the directory where your binary resides (typically something like -d:\FlightGear\bin where you might have to substitute -d: in favor of your FlightGear directory), set the environment variable with - -

-SET FG_ROOT=d:\FlightGear\bin - -

- and invoke FlightGear (within the same shell - Windows environment - settings are only valid locally within the same shell) via - -

-fgfs --option1 --option2.... - -

-For getting maximum performance it is highly recommended to -minimize (iconize) the non-graphics window while running -FlightGear . -


-

- -



Fig. 2: Ready for takeoff. We are at the default startup -position in Arizona. -


-

-

-5.3  Command line parameters -

- - - -

-Following is a list and short description of the command line options available. In case -of Windows 98/NT it is recommended to include these in runfgfs.bat. - -

-

-5.3.1  General Options

- -

- -

    -
  • --help: gives a small help text, kind of a short version of this Section. - -

    - -

  • --fg-root=path: tells FlightGear where to look for its data - files if you didn't compile it with the default settings. - -

    - -

  • --disable-game-mode: Disables fullscreen display -. - -

    - -

  • --enable-game-mode: Enables fullscreen rendering. - -

    - -

  • --disable-splash-screen: Turns off the rotating 3DFX -logo - when the accelerator board gets initialized. - -

    - -

  • --enable-splash-screen: If you like advertising, set this! - -

    - -

  • --disable-intro-music: No MP3-sample is being played when - FlightGear starts up. - -

    - -

  • --enable-intro-music: If your machine is powerful enough, enjoy - this setting. - -

    - -

  • --disable-mouse-pointer: In the future, FlightGear will - feature a mouse interface so that options can be set at runtime. As - this feature is not implemented yet it seems wise to disable the - mouse interface. - -

    - -

  • --enable-mouse-pointer: Enables another mouse pointer in the - FlightGear window. This is useful when running FlightGear in full - screen mode and will allow access to the - yet to be implemented - - mouse interface of FlightGear . - -

    - -

  • --disable-pause: This will put you into FlightGear with the - engine running, ready for Take-Off. - -

    - -

  • --enable-pause: Starts FlightGear in pause mode. - -

    -

-5.3.2  Features

- -

- -

    -
  • --disable-hud: Switches off the HUD - (Head Up - Display). - -

    - -

  • --enable-hud: Turns the HUD - on. This is the default. - -

    - -

  • --disable-panel: Turns off the instrument panel -. This is the - default, as the instrument panel is not yet complete - but in our opinion - should be given at least a try. - -

    - -

  • --enable-panel: This will give you the look of a real cockpit -. - -

    - -

  • --disable-sound: Pretty self explaining, isn't it? - -

    - -

  • --enable-sound: - -

    -

-5.3.3  Flight model -

- -

- -

    -
  • --fdm=abcd There are four allowed values for abcd: slew, jsb, larcsim, -external, which you might want to try. Default value is larcsim. - -

    -

-5.3.4  Initial Position and Orientation -

- -

- -

    -
  • --airport-id=ABCD: If you want to start directly at an airport, - enter its international code, i.e. KJFK for JFK airport in New York. - A long/short list of the IDs of the airports being implemented can - be found in /Flight Gear/Airports. You only have to unpack - one of the files with gnuzip. Keep in mind, you need the - terrain data for the relevant region! - - -

    - -

  • --lon=degrees: This is the starting longitude in degrees (west = -) - -

    - -

  • --lat=degrees: This is the starting latitude in degrees (south = -) - -

    - -

  • --altitude=meters: You may start in free flight at the given - altitude. Watch for the next options to insert the plane with a - given heading etc. - -

    - -

  • --heading=degrees: Sets the initial heading -. - -

    - -

  • --roll=degrees: Initial roll angle. - - -

    - -

  • --pitch=degrees: Initial pitch angle. - - -

    -

-5.3.5  Rendering Options -

- -

- -

    -
  • --fog-disable: To cut down the rendering efforts, distant - regions are vanishing in fog - by default. If you disable fogging, - you'll see farther but your frame rates will drop. - -

    - -

  • --fog-fastest: The scenery will not look very nice but - frame rates will increase. - -

    - -

  • --fog-nicest: This option will give you a fairly realistic - view of flying on a hazy day. - -

    - -

  • --fov=xx.x: Sets the field of view - in degrees. -The value is displayed on the HUD. Default is 55.0. - -

    - -

  • --disable-fullscreen: Self explaining, isn't it? - -

    - -

  • --enable-fullscreen: - -

    - -

  • --shading-flat: This is the fastest mode but the terrain will look ugly! This option might help if your video accelerator is really slow. - -

    - -

  • --shading-smooth: This is the recommended (and default) setting - things will look really nice. - -

    - -

  • --disable-skyblend: No fogging or haze -, sky will be displayed - using just one color. Fast but ugly! - -

    - -

  • --enable-skyblend: Fogging/haze is enabled, sky and terrain - look realistic. This is the default and recommended setting. - -

    - -

  • --disable-textures: Terrain details will be disabled. Looks ugly, but might help if your video board is slow. - -

    - -

  • --enable-textures: Default and recommended. - -

    - -

  • --enable-wireframe: If you want to know how the world of FlightGear internally looks like, try this! - -

    - -

  • --geometry=WWWxHHH: Defines the size of the window used, i.e. -WWWxHHH can be 640x480, 800x600, or 1024x768. - -

    -

-5.3.6  Scenery Options Options -

- -

- -

    -
  • --tile-radius=n: Specifies the tiles radius; allowed values for -n are 1 - 4. - -

    -

-5.3.7  HUD Options -

- -

- -

    -
  • --units-feed: HUD displays units in feet. - -

    - -

  • --units-meters: HUD displays units in meters. - -

    - -

  • --hud-tris: HUD displays the number of triangles rendered. - -

    - -

  • --hud-culled: HUD displays percentage of triangles culled. - -

    -

-5.3.8  Time options -

- -

- -

    -
  • --time-offset=[+-]hh:mm:ss: Offset local time by this amount. - -

    - -

  • --start-date-gmt=yyyy:mm:dd:hh:mm:ss: Specify a starting time and -date. Time is Greenwich Mean Time. - -

    - -

  • --start-date-lst=yyyy:mm:dd:hh:mm:ss: Specify a starting time and -date. Uses local sidereal time. - -

    -

-Chapter 6
Flight: All about instruments, keystrokes and menus -

-This is a description of the main systems for controlling the program and piloting the -plane: Historically, keyboard controls were developed first, and you can still control -most of the simulator via the keyboard alone. Recently, they are becoming supplemented by -several menu entries, making the interface more accessible, particularly for beginners, -and providing additional functionality. A joysticks provides a more realistic alternative -for actual piloting of the plane. Concerning instruments, there are again two -alternatives: You can use the rather advanced HUD or the emerging panel. - -

-

-6.1  Keyboard commands

- -

-While joystick -s or yoke -s are supported as are rudder pedals, you can fly -FlightGear using the keyboard alone. For proper controlling via keyboard (i) the -NumLock - key must be switched on (ii) the FlightGear window must have -focus (if not, click with the mouse on the graphics window). Some of the keyboard -controls might be helpful even in case you use a joystick. - -

-After activating NumLock the following keyboard commands - should work: -

- -

- Tab. 1: Main keyboard commands - for FlightGear . -


-

- -

-
-
Key Action -
Pg Up/Pg Dn Throttle -
Left Arrow/Right Arrow Aileron -
Up Arrow/Down Arrow Elevator -
Ins/Enter Rudder -
5 Center aileron/elevator/rudder -
Home/End Elevator trim
- -

-

- - -For changing views you have to de-activate NumLock. Now -Shift + < Numeric Keypad Key > changes the -view as follows: - -

- Tab. 2: View directions - -accessible after de-activating NumLock. -


-

- -

-
-
Numeric Key View direction -
Shift-8 forward -
Shift-7 left/forward -
Shift-4 left -
Shift-1 left/back -
Shift-2 back -
Shift-3 right/back -
Shift-6 right -
Shift-9 right/forward
- -

-

- - -The autopilot - is controlled via the following controls: -


-

- Tab. 3: Autopilot controls. - -


-

- -

-
-
Key Action -
Ctrl + A Altitude hold toggle on/off -
Ctrl + H Heading hold toggle on/off -
Ctrl + S Autothrottle toggle on/off -
Ctrl + T Terrain follow toggle on/off -
F11 Set target altitude -
F12 Set target heading
- -

-

-


The last one is especially interesting as it makes your Navion - behave like a -cruise missile. - -

-Besides these basic keys there are some more special ones; most of these you'll probably -not want to try during your first flight:

- - -

- Tab. 4: More control commands. -


-

- -

-
-
Key Action -
H/h Change color of HUD/toggle HUD off forward/backward -
i/I Minimize/maximize HUD -
m/M Change time offset (warp) used by t/T forward/backward -
P Toggles panel on/off -
t/T Time speed up/slow down forward/backward -
x/X Zoom in/out -
z/Z Change visibility (fog) forward/backward -
b Toggle brakes on/off -
p Toggle pause on/off -
W Toggle fullscreen mode on/off (Mesa/3dfx/Glide only) -
F2Refresh Scenery tile cache -
F8 Toggle fog on/off -
F9 Toggle texturing on/off -
F10 Toggle menu on/off -
F11 Sets heading in autopilot -
F12 Sets altitude in autopilot -
ESC Exit program
- -

-

-

-6.2  Menu entries -

- -

-Albeit the menu being not yet fully operational it provides several useful functions. At -present, the following ones are implemented. - -

- -

    -
  • File - -
      -

      - -

    • Reset Resets you to the selected starting position. Comes handy in case you got -lost or something went wrong. - -
    • Save Not yet operational. - -
    • Print Not yet operational. - -
    • Close Removes the menu. (Can be re-activated by hitting F10.) - -
    • Exit Exits the program. -
    -

    - -

  • Edit - -
      -

      - -

    • Edit text Not yet operational. -
    -

    - -

  • View - -
      -

      - -

    • Toggle Panel Toggles panel - on/off. - -
    • View Not yet operational. - -
    • Cockpit View Not yet operational. -
    -

    - -

  • Aircraft - -
      -

      - -

    • Communication Not yet operational. - -
    • Navigation Not yet operational. - -
    • Altitude Not yet operational. - -
    • Autopilot Sliders for setting limiting values for the autopilot. -
    -

    - -

  • Environment - -
      -

      - -

    • Weather Not yet operational. - -
    • Terrain Not yet operational. - -
    • Airport Typing in an airport id - beams you to that airport's position. - FlightGear comes with an extended list of airport ids to be found under - /FlightGear/Aircraft/apt full.gz which you can unpack with gzip -d. -
    -

    - -

  • Options - -
      -

      - -

    • Realism & Reliability Not yet operational. - -
    • Preferences Not yet operational. -
    -

    - -

  • Help - -
      -

      - -

    • Help Should bring up this Getting Started Guide -. At present not yet fully - implemented. Under windows you can get it working by placing a file called webrun.bat - like - -

      - c:\programme\netscape\communicator\program\netscape.exe
      - d:\Flightgear\docs\installguide\html\getstart.html - -

      -(you may have to substitute your path/browser) somewhere in your path. Under UNIX a -comparable shell script might do. Requires fgfs-manual-X.XX.exe being properly -installed. - -

      - -

    • About... Not yet operational. -
    -

    -

-6.3  The head up display -

- -

-At current, you have two options for reading off the main flight parameters of the plane: -The HUD - (Head Up Display - and -the panel. Neither are HUD -s used in usual general aviation planes nor in civilian -ones. Rather they belong to the equipment of modern military jets. However, in view of -the fact that the panel - despite recent progress is not yet complete the -HUD - may well serve as a main instrument for controlling the plane. Besides, it -might be easier to fly using this one than exploiting the panel - and several of -the real pilots might prefer it because of combining the readouts of critical parameters -with an outside view onto the real world. (Several Cessna - pilots might love to -have one, but technology is simply too expensive for implementing HUDs in general -aviation aircrafts.) -


-

- -



Fig. 3: The HUD, or head up display. -


-

-The HUD - shown in Fig. 3 displays all main flight parameters of the plane. In -the center you find the pitch indicator - (in degrees) with the aileron -indicator - above and the rudder indicator - below. A corresponding scale for the -elevation - can be found to the left of the pitch scale. On the -bottom there is a simple turn indicator -. - -

-There are two scales at the extreme left: The inner one displays the speed - (in -kts) while the outer one indicates position of the throttle -. You may recall the -Navion - taking off at a speed of 100 kts. The two scales on the extreme r.h.s -display your height -, i. e. the left one shows the height above ground while the -right of it gives that above zero, both being displayed in feet. - -

-Besides this, the HUD - displays some additions information. On the upper right you -find date and time. Below, you see latitude - and longitude - of your current -position on the l.h.s and r.h.s, resp. In the lower left corner there is a number -indicating the frame rate -, i.e. the number of times the picture being re-drawn -each second. - -

-You can change color of the HUD using the ''H'' key. Pressing it several times -minimizes the HUD. - -

-

-6.4  The Panel -

- -

-Besides the HUD -, FlightGear has a panel - which can be activated by -pressing the ''P'' key. (It is recommended disabling the HUD then by pressing ''H'' -several times.) While the panel is not yet fully complete the basic five flight -instruments - to scan are present and working. -


-

- -



Fig. 4: The panel. -


-

-In the center you find the artificial horizon - (attitude indicator) displaying -pitch and bank of your plane. It has pitch marks (hard to be seen in this version) as -well as bank marks at 10, 20, 30, 60, and 90 degrees. - -

-Left to the artificial horizon, you'll see the airspeed indicator -. Not only does -it have a speed indication in knots (recall: The Navion takes off at 100 kts) but also -several arcs showing characteristic velocity rages - you have to consider. At -first, there is a green arc indicating the normal operating range of speed with the flaps -(net yet being implemented in FlightGear ) fully retracted. The white arc indicates the -range of speed with flaps in action. The tiny yellow arc shows a range, which should only -be used in smooth air. The upper end of it has a red radial indicating the speed never to -be exceeded. - -

-Below the airspeed indicator you can find the turn indicator -. The airplane in the -middle indicates the roll of your plane. If the left or right wing of the plane is -aligned with one of the marks this indicates a standard turn, in which you make a full -360 degrees turn in exactly two minutes. - -

-Below the plane, still in the turn indicator, is another instrument, called -inclinometer -. It indicates if rudder - and ailerons - are -coordinated. During turns, you always have to operate aileron and rudder in such a way -that the ball in the tube remains centered; otherwise the plane is skidding. - -

-To the right of the artificial horizon you find the altimeter - showing the height -above sea level (not ground!). At present it is not yet working in -FlightGear . Below the altimeter is the vertical speed indicator - -which, on the other hand, is operational. It indicates the rate of climbing or sinking of -your plane in hundreds of feet per minute. - -

-There is one more instrument working in the panel, i.e. the second one in the column on -the r.h.s. indicating position of throttle -. - -

-This completes description of the present main FlightGear instruments. If you are -looking for some interesting places to discover with FlightGear (which may or may not -require downloading additional scenery) you may want to check - -

- http://www.flightgear.org/Downloads/Places. - -

-There is now a menu entry for entering directly the airport code - of the airport -you want to start from. - -

-Finally, if you're done and are about to leave the plane, just hit the ESC key or use the -corresponding menu entry to exit the program. - -

-

-Chapter 7
Landing: Some further thoughts before leaving the plane -

- -

-

-7.1  Those, who did the work

- -

-Did you enjoy the flight? In case you did, don't forget those who devoted hundreds of -hours to that project. All of this work is done on a voluntary basis within spare time, -thus bare with the programmers - in case something does not work the way you want -it to. Instead, sit down and write them a kind (!) letter proposing what to change. -Alternatively, you can subscribe to the FlightGear mailing lists - and contribute -your thoughts there. Instructions to do so can be found under - -

- http://www.flightgear.org/mail.html. - -

-Essentially there are two lists, one of which being mainly for the developers and the -other one for end users. -


-

- These are the people who did the job (This information was -essentially taken from the file Thanks accompanying the -code): -


-

- Raul Alonzo - (amil@las.es)
Author of Ssystem and -moon texture. -


-

- Michele America - -(nomimarketing@mail.telepac.pt)
- Contributed to the HUD - code. -


-

- Steve Baker - (sjbaker@hti.com)
- Author of PLIB -, a graphics/audio/joystick interface written entirely on top of - OpenGL -/GLUT - used in FlightGear . An immense amount of coaching and tutelage, - both on the subjects of flight simulation and OpenGL -. It has been - his comments and thoughts that have prompted the implementation of - most of the more sophisticated features of FlightGear . -


-

- Michael Basler - (pmb@knUUt.de)
- Coauthor of Installation and Getting Started (together with Bernhard - Buckel). -


-

- John S. Berndt - (jsb@hal-pc.org)
- Working on a complete C++rewrite/reimplimentation of the core FDM. - Initially he is using X15 data to test his code, but once things are - all in place we should be able to simulator arbitrary aircraft. -


-

- Paul Bleisch - (pbleisch@acm.org)
- Redid the debug system so that it would be much more - flexible, so it could be easily disabled for production system, and - so that messages for certain subsystems could be selectively - enabled. - -

- Also contributed a first stab at a config file/command line parsing - system. -


-

- Jim Brennan - (jjb@foothill.net)
- Provided a big chunk of online space to store USA scenery for Flight Gear. -


-

- Bernie Bright - (bbright@c031.aone.net.au)
- Many C++ style, usage, and implementation improvements, STL - portability and much, much more. -


-

- Bernhard H. Buckel - -(buckel@wmad95.mathematik.uni-wuerzburg.de)
- Contributed the README.Linux. Coauthor of Installation - and Getting Started (together with Michael Basler). -


-

- Gene Buckle - (geneb@nwlink.com)
- A lot of work getting FlightGear to compile with the MSVC -++ - compiler. Numerous hints on detailed improvements. -


-

- Oliver Delise - (delise@rp-plus.de)
- FAQ Maintainer. -


-

- Didier Chauveau - (chauveau@math.univ-mlv.fr)
- Provided some initial code to parse the 30 arcsec DEM files found at: - -

- http://edcwww.cr.usgs.gov/landdaac/gtopo30/gtopo30.html. -


-

- Jean-Francois Doue -
- Vector 2D, 3D, 4D and Matrix 3D and 4D inlined C++ classes. (Based on - Graphics Gems IV ed. Paul S. Heckbert) - -

-http://www.animats.com/simpleppp/ftp/public_html/topics/developers.html. -


-

- Francine Evans - (evans@cs.sunysb.edu) - -

-http://www.cs.sunysb.edu/~evans/stripe.html - -

- Wrote the GPL'd tri-striper. -


-

- Oscar Everitt - (bigoc@premier.net)
- Created single engine piston engine sounds as part of an F4U package - for FS98 -. They are pretty cool and Oscar was happy to contribute - them to our little project. -


-

- Jean-loup Gailly - and Mark Adler - -(zlib@quest.jpl.nasa.gov)
- Authors of the zlib library -. Used for on-the-fly compression and - decompression routines, - -

- http://www.cdrom.com/pub/infozip/zlib/. -


-

- Thomas Gellekum - (tg@ihf.rwth-aachen.de)
- Changes and updates for compiling on FreeBSD -. -


-

- Jeff Goeke-Smith - (jgoeke@voyager.net)
- Contributed our first autopilot - (Heading Hold). - Better autoconf check for external timezone/daylight variables. -


-

- Michael I. Gold - (gold@puck.asd.sgi.com)
- Patiently answered questions on OpenGL -. -


-

- Charlie Hotchkiss - -(chotchkiss@namg.us.anritsu.com)
Worked on improving and enhancing the -HUD - code. Lots of code style tips and code tweaks... -


-

- Bruce Jackson - (NASA) (e.b.jackson@larc.nasa.gov) - -

- http://agcbwww.larc.nasa.gov/People/ebj.html - -

- Developed the LaRCsim - code under funding by NASA which we use to provide the - flight model. Bruce has patiently answered many, many questions. -


-

- Tom Knienieder - (knienieder@ms.netwing.at)
- Ported Steve Bakers's audio library - to Win32. -


-

- Reto Koradi - (kor@mol.biol.ethz.ch) - -

-http://www.mol.biol.ethz.ch/~kor - -

- Helped with setting up fog effects -. -


-

- Bob Kuehne - (rpk@sgi.com)
- Redid the Makefile system so it is simpler and more robust. -


-

- Vasily Lewis - (vlewis@woodsoup.org) - -

- http://www.woodsoup.org - -

- Provided computing resources and services so that the Flight Gear - project could have real home. This includes web services, ftp - services, shell accounts, email lists, dns services, etc. -


-

- Christian Mayer - (Vader@t-online.de)
- Working on multi-lingual conversion tools for fgfs.
- Contributed code to read msfs scenery textures. -


-

- Eric Mitchell - (mitchell@mars.ark.com)
- Contributed some topnotch scenery textures -. -


-

- Anders Morken - (amrken@online.no)
- Maintains the European mirror of the FlightGear web pages. -


-

- Alan Murta - (amurta@cs.man.ac.uk) - -

- http://www.cs.man.ac.uk/aig/staff/alan/software/ - -

- Created the Generic Polygon Clipping library. -


-

- Curt Olson - (curt@flightgear.org)
- Primary organization of the project. First implementation - and modifications based on LaRCsim -. Besides putting together all - the pieces provided by others mainly concentrating on the scenery - engine - as well as the graphics stuff. -


-

- Robin Peel - (robinp@mindspring.com)
- Maintains worldwide airport and runway database for FlightGear as we as X-Plane. -


-

- Friedemann Reinhard - -(mpt218@faupt212.physik.uni-erlangen.de)
- Development of textured instrument panel -. -


-

- Petter Reinholdtsen - (pere@games.no)
- Incorporated the Gnu automake/autoconf system (with libtool). - This should streamline and standardize the build process for all - UNIX-like platforms. It should have little effect on IDE type - environments since they don't use the UNIX make system. -


-

- William Riley - (riley@technologist.com)
- Contributed code to add ''brakes''. -


-

- Paul Schlyter - (pausch@saaf.se)
- Provided Durk Talsma with all the information he needed to write the astro code. -


-

- Chris Schoeneman - (crs@millpond.engr.sgi.com)
- Contributed ideas on audio support. -


-

- Jonathan R Shewchuk - -(Jonathan_R_Shewchuk@ux4.sp.cs.cmu.edu)
- Author of the Triangle - program. Triangle - is used to calculate the Delauney triangulation of our irregular terrain. -


-

- Gordan Sikic - (gsikic@public.srce.hr)
- Contributed a Cherokee flight model - for LaRCsim -. Currently is not - working and needs to be debugged. Use configure - --with-flight-model=cherokee - to build the cherokee instead of the Navion -. -


-

- Michael Smith - (msmith99@flash.net)
- Contributed cockpit graphics, 3d models, logos, and other images. - Project Bonanza - -

- http://members.xoom.com/ConceptSim/index.html. -


-

- U. S. Geological Survey - - -

-http://edcwww.cr.usgs.gov/doc/edchome/ndcdb/ndcdb.html - -

- Provided geographic data used by this project. -


-

- Durk Talsma - (pn_talsma@macmail.psy.uva.nl)
- Accurate Sun, Moon, and Planets. Sun changes color based on - position in sky. Moon has correct phase and blends well into the - sky. Planets are correctly positioned and have proper magnitude. help with time - functions, GUI, and other things. -


-

- Gary R. Van Sickle - -(tiberius@braemarinc.com)
- Contributed some initial GameGLUT - support and other fixes. -


-

- Norman Vine - (nhv@laserplot.com)
- Many performance optimizations throughout the code. Many contributions - and much advice for the scenery generation section. Lots of Windows - related contributions. Improved HUD -. -


-

- Roland Voegtli - (webmaster@sanw.unibe.ch)
- Contributed great photorealistic textures. -


-

- Carmelo Volpe - (carmelo.volpe@csb.ki.se)
- Porting FlightGear to the Metro Works - development environment - (PC/Mac). -


-

- Darrell Walisser - (dwaliss1@purdue.edu)
- Contributed a large number of changes to porting FlightGear to the Metro Works - development environment (PC/Mac). Finally produced the first MacIntosh port. -


-

- Robert Allan Zeh - (raz@cmg.FCNBD.COM)
- Helped tremendously in figuring out the Cygnus - Win32 compiler and - how to link with .dll's. Without him the first run-able Win32 - version of FlightGear would have been impossible. - -

-

-7.2  What remains to be done

-At first: If you read (and, maybe, followed) this guide until this -point you may probably agree that FlightGear , even -in its present state, is not at all for the birds. It is already a -flight simulator which has a flight model, a plane, terrain -scenery, texturing and simple controls. - -

-Despite, FlightGear needs - and gets - further development. Except internal tweakings, -there are several fields where FlightGear needs basics improvement and development. - -

-A first direction is adding airports -, streets, and more things bringing Scenery -to real life. - -

-Second, the panel - needs further improvement including more working gauges. - -

-Besides, there should be support for adding more planes - and for implementing -corresponding flight models differing from the Navion -. - -

-Another task is further implementation of the menu system -, which should not be -too hard with the basics being working now. - -

-A main stream of active development concerns weather. At present there is simply none: no -clouds, no rain, no wind. But there sure will be. - -

-There are already people working in all of these directions. If you're a programmer and -think you can contribute, you are invited to do so. - -

- -

Achnowledgements

-Obviously this document could not have been written without all -those contributors mentioned above making FlightGear a reality. - -

-Beyond this we would like to say special thanks to Curt -Olson, - whose numerous scattered Readmes, -Thanks, Webpages, and personal eMails were of special help to us -and were freely exploited in the making of this booklet. - -

-Next, we gained a lot of help and support from Steve Baker - and -Norman Vine -. Moreover, we would like to thank Steve -Baker - for a careful reading and for numerous hints on the first draft -of this guide. - -

-Further, we would like to thank Kai Troester - for donating the -solution of some of his compile problems to Chapter 8. - -

-

-Chapter 8
Missed approach: If anything refuses to work -

-We tried to sort problems - according to operating system to a certain extent , but -if you encounter a problem it may be a wise idea to look beyond ''your'' operating system -- just in case. Besides, if anything fails, it is definitely a good idea to check -the FAQ maintained by Oliver Delise (delise@rp-plus.de) being distributed -along with the source code. - -

-

-8.1  General problems

- -
    -

    - -

  • FlightGear runs SOOO slow
    - If the HUD - indicates you are getting something like 1 fps - (frame per second) or below you typically don't have working hardware - OpenGL - support. There may be several reasons for this. First, - there may be no OpenGL hardware drivers available for older - cards. In this case it is highly recommended to get a new board. - -

    - Second, check if your drivers are properly installed. Several - cards need additional OpenGL support drivers besides the - ''native'' windows ones. For more detail check Chapter - 2. - -

    - Third, check if your hardware driver is called opengl32.dll - or just merely opengl.dll. By the default compilation, binaries are linked against - open gl32.dll. If you require the non-32 version, - consider rebuilding FlightGear with the libraries opengl32.dll, - glut32.dll, and glu32.dll replaced by their - non-32 counterparts. For more details check Chapter - 3. - -

    - If you installed the pre-compiled binaries runfgfs.bat invokes - fgfs.exe while runfgfs.sgi.bat invokes - fgfs.sgi.exe with the first ones being linked against the 32-versions. - -

    - Usually, hardware accelerated drivers use the 32-libraries. - -

    -

-8.2  Potential problems under Linux

- -

-Since we don't have access to all possible flavors of Linux distributions, here are some -thoughts on possible causes of problems. (This Section includes contributions by Kai -Troester Kai.Troester@rz.tu-ilmenau.de.) - -

- -

    -
  • Wrong library versions
    - This is a rather common cause of grief especially when you prefer to - install the libraries needed by FlightGear by hand. Be sure that - especially the Mesa library contains support for the 3DFX - board - and that Glide - libraries are installed and can be - found. If a ldd `which fgfs` complains about missing - libraries you are in trouble. - -

    - You should also be sure to keep always the latest version - of Steve's plib on your system. Lots of people (including me) have - failed miserably to compile FlightGear just because of an outdated - plib. - -

    - -

  • Missing permissions -
    - FlightGear needs to be setuid root in order to be capable of - accessing the accelerator board (or a special kernel module as - described earlier in this document). So you can either issue a - -

    - chown root.root /usr/local/bin/fgfs ;
    - chmod 4755 /usr/local/bin/fgfs - -

    - to give the FlightGear binary the proper rights or install the 3DFX module. The latter is the ``clean'' - solution and strongly recommended! - -

    - -

  • Non-default install options
    - FlightGear will display a lot of diagnostics when being started up. - If it complains about bad looking or missing files, check that you - installed them in the way they are supposed to be, i.e. latest - version and proper location. The canonical location FlightGear - wants its data files under /usr/local/lib. Be sure to - grab the latest versions of everything that might be needed! - -

    - -

  • Compile problems
    - Check as far as you can, as a last resort (and a great information - source, too) there are mailing lists for which information can be - gotten at - -

    - http://www.flightgear.org/mail.html. - -

    -This will give you direct contact to the developers. - -

    - -

  • Configure could not find Mesa and Glut though they are -installed - -

    -If the configure script could not find your Mesa and Glut libraries you should add the -Mesa library-path (i.e. /usr/local/Mesa) to the EXTRA_DIRS variable in the file -configure.in (i.e. EXTRA_DIRS=''/usr/local/usr/ -X11R6/usr/local/Mesa''). After this you have to run autoconf. (Please read -README.autoconf for running autoconf ) - -

    - -

  • SuSE Distribution - -
      -

      - -

    • If you have a SuSE distribution use the egcs compiler instead -of the compiler delivered with SuSE. Grab it at - -

      -http://egcs.cygnus.com - -

      - -

    • SuSE 6.0 users should also use the Glide, -Mesa and Glut Libraries delivered with the distribution - -
    • A known problem of Flight Gear until version Version 0.57 with SuSE concerns - acconfig.h. If 'make' stops and reports an error in relation with acconfig.h -insert the following lines to /usr/share/autoconf/ acconfig.h: - -

      - /* needed to compile fgfs properly*/
      - #undef FG_NDEBUG
      - #undef PACKAGE
      - #undef VERSION
      - #undef WIN32a - -

      -(a solution for this problem is coming soon ) -

    -

    - Additionally there are two versions of the GNU C compiler around: - egcs and gcc (the classic one). gcc seems to have its own notion of - some C++ constructs, so updating to egcs won't hurt and maybe help - to compile the program. - -

    -

-8.3  Potential problems under Windows 98/NT

- -

- -

    -
  • The executable refuses to run.
    - You may have tried to start the executable directly either by - double-clicking fgfs.exe in Windows explorer or by invoking it - in a MS-DOS shell. Double-clicking via explorer does never work - (except you set the environment variable FG_ROOT - in the autoexec.bat or otherwise). Rather double-click runfgfs.bat or - runfgfs-sgi.bat For more detail, check Chapter 5. - -

    - Another potential problem might be you did not download the - most recent versions of scenery and textures required by FlightGear , or - you did not load any scenery or texture at all. Have a close look - at this, as the scenery/texture format is still under development and may - change frequently. For more detail, check Chapter 4. - -

    - A further potential source of trouble are so-called - mini-OpenGL - drivers provided by some manufacturers. In this case, - FlightGear 's typically hangs while opening the graphics window. - In this case, either replace the mini-OpenGL - driver by a - full OpenGL driver or or in case such is not available install - software OpenGL support (see Section 2.5). - -

    - -

  • FlightGear ignores the command line parameters.
    - There is a problem with passing command line options containing a - ''='' to windows batch files. Instead, include the options into - runfgfs.bat. - -

    - -

  • While compiling with the Cygnus Compiler Configure -complains not to find glu32.dll. - -

    -Make sure you change to the Main FlightGear directory, e. g. with - -

    -cd //D/FlightGear-X.XX - -

    -before running Configure and Make. Do not forget the win32 library -package. - -

    - -

  • I am unable to build FlightGear under MSVC -/MS DevStudio -
    - By default, FlightGear is build with GNU C++, i. e. the - Cygnus - compiler for Win32. For hints or Makefiles - required for MSVC for MSC DevStudio have a look into - -

    - http://www.flightgear.org/Downloads/Source. - -

    -In principle, FlightGear should be buildable with the project files provided. - -

    - -

  • Compilation of FlightGear dies not finding gfc. - -

    -The library gfc cannot be build with the Cygnus compiler at present. It us -supposed to be substituted by something else in the future. - -

    -As the simulator is already built at this point, you simply can forget about that problem -as long as you don't intend to build the scenery creation tools -. Just go on with -make install. - -

    -

- - -

Index (showing section)

- -
FlightGear Flight School, - 1-4 -
FlightGear Programmer's Guide, - 3-0 -
FlightGear Scenery Design Guide, - 1-4 -
FlightGear Website, 1-2 -
FlightGear documentation, - 1-4 -
FlightGear home page, 1-4 -
3DFX, 2-1, 2-4 -
3DFX chip, 2-4 -
3DXF, 2-4 - -

-

Adler, Mark, 7-1 -
ailerons, 6-4 -
airport code, 5-3, - 6-4 -
airport id, 6-2 -
airports, 7-2 -
airspeed indicator, 6-4 -
Alonzo, Raul, 7-1 -
altimeter, 6-4 -
America, Michele, 1-2, - 7-1 -
artificial horizon, 6-4 -
astronomy code, 1-2 -
audio library, 7-1 -
audio support, 1-2 -
autopilot, 1-2, 6-1, - 7-1 -
autopilot controls, 6-1 - -

-

Baker, Steve, 1-2, - 7-1, - 7-2 -
Basler, Michael, 7-1 -
Berndt, John, S., 7-1 -
binaries, 3-1, 3-2, - 4-1 -
     installation, 4-1 -
binaries, pre-compiled, 3-0 -
Bleisch, Paul, 7-1 -
Brennan, Jim, 7-1 -
Bright, Bernie, 7-1 -
BSD UNIX, 1-1 -
Buckel, Bernhard H., 7-1 -
Buckle, Gene, 7-1 -
build tree, 3-2 - -

-

Cessna, 6-3 -
Chauveau, Didier, 7-1 -
Cherokee flight model, 7-1 -
cockpit, 5-3 -
command line options, 5-3 -
compiler, 1-3 -
compiling, 3-0 -
     Linux, 3-1 -
     Windows 98/NT, 3-2 -
Configure, 3-2 -
configure, 3-1, 3-2 -
Creative Graphics Blaster, - 2-3 -
Cygnus, 1-3, 3-2, - 7-1, 8-3 -
Cygnus Win32 port of GNU C, - 3-2 - -

-

Delise, Oliver, 7-1 -
Diamond Stealth II, 2-2 -
Diamond Viper 550, 2-3 -
documentation, 1-1 -
DOS, 1-2 -
Doue, Jean-Francois, 7-1 - -

-

elevation indicator, 6-3 -
environment variable, 2-1 -
Evans, Francine, 7-1 -
Everitt, Oscar, 7-1 - -

-

field of view, 5-3 -
flight model, 5-3 -
Flight simulator -
     civilian, 1-1 -
     free, 1-2 -
     multi-platform, - 1-1 -
     open, 1-1 -
     user-extensible, - 1-1 -
     user-sported, 1-1 -
     user-supported, - 1-1 -
Flight Unlimited II, 1-1 -
fog, 5-3 -
fog effects, 7-1 -
frame rate, 1-2, - 1-3, 6-3 -
FreeBSD, 7-1 -
FS98, 1-1, 7-1 -
fullscreen display, 5-3 - -

-

Gailly, Jean-loup, 7-1 -
GameGLUT, 7-1 -
Gellekum, Thomas, 7-1 -
Getting Started Guide, 6-2 -
GLIDE, 2-1 -
Glide, 8-2 -
GLUT, 2-1, 7-1 -
Glut header files, 3-2 -
glut libraries, 3-2 -
GNU C++, 1-3 -
Gnu Public License, 1-1 -
Goeke-Smith, Jeff, 1-2, - 7-1 -
Gold, Michael, I., 7-1 -
graphics drivers, 2-0 -
graphics library, 2-0 -
graphics routines, 1-2 - -

-

haze, 5-3 -
head up display, 1-2, - 6-3 -
height, 6-3 -
history, 1-2 -
Hotchkiss, Charlie, 1-2, - 7-1 -
HUD, 1-2, 5-3, 6-3, - 6-4, 7-1, - 8-1 - -

-

inclinometer, 6-4 -
initial heading, 5-3 -
initial pitch angle, 5-3 -
initial roll angle, 5-3 -
install tree, 3-2 -
instrument panel, 5-3 - -

-

Jackson, Bruce, 1-2, - 7-1 -
joystick, 1-3, 6-1 - -

-

keyboard commands, 6-1 -
Knienieder, Tom, 7-1 -
Koradi, Reto, 7-1 -
Korpela, Eric, 1-2 -
Kuehne, Bob, 7-1 - -

-

LaRCsim, 1-2, 7-1 -
latitude, 6-3 -
Lewis, Vasily, 7-1 -
Linux, 1-1, 1-2, - 1-3, 2-1, - 3-0, 3-1, - 4-1, 4-2 -
longitude, 6-3 -
Looking Glass, 1-1 -
loop-through-cable, 2-1 - -

-

mailing lists, 7-1 -
Mayer, Christian, 7-1 -
menu, 1-2 -
Menu entries, 6-2 -
menu system, 7-2 -
MESA, 2-1 -
Mesa, 2-1 -
Metro Works, 7-1 -
Microsoft, 1-1 -
military components, 1-1 -
mini-OpenGL, 2-2, - 8-3 -
Mitchell, Eric, 1-2, - 7-1 -
Morken, Anders, 7-1 -
MS DevStudio, 8-3 -
MS Visual C, 3-2 -
MSVC, 1-3, 7-1, - 8-3 -
Murr, David, 1-2 -
Murta, Alan, 7-1 - -

-

Navion, 1-2, 6-1, - 6-3, 7-1, - 7-2 -
NumLock, 6-1 - -

-

Olson, Curt, 1-2, - 4-2, 7-1, - 7-2 -
OpenGL, 1-2, 1-3, - 1-4, 2-0, - 2-2, 2-5, - 3-0, 5-2, - 7-1, 8-1 -
     drivers, 1-3 -
     software rendering, - 2-5 -
Operating Systems, 1-1 -
orientation, 5-3 -
OS/2, 1-2 - -

-

panel, 1-2, 6-2, - 6-3, 6-4, - 7-1, 7-2 -
panel code, 1-2 -
Peel, Robin, 7-1 -
permissions, 8-2 -
pitch indicator, 6-3 -
planes, 7-2 -
PLIB, 1-2, 3-2, - 7-1 -
problems, 8-0 -
programmers, 7-1 -
proposal, 1-2 - -

-

Quake, 2-1 - -

-

RedHat, 2-1 -
Reinhard, Friedemann, 1-2, - 7-1 -
Reinholdtsen, Petter, 7-1 -
rendering options, 5-3 -
Rendition 2100 chipset, 2-2 -
Rendition chipset, 2-2 -
Riley, William, 7-1 -
RIVA TNT chipset, 2-3 -
rudder, 6-4 -
rudder indicator, 6-3 - -

-

scenery, 1-2, 3-2, - 4-2 -
scenery creation tools, 8-3 -
scenery options, 5-3 -
Schlyter, Paul, 7-1 -
Schoenemann, Chris, 7-1 -
SGI IRIX, 1-1 -
Shewchuk, Jonathan, 7-1 -
Sikic, Gordan, 7-1 -
Smith, Michael, 7-1 -
software rendering, 3-2 -
sound, 4-2 -
sound card, 1-3 -
sound effects, 1-3 -
source code, 1-1 -
speed, 6-3 -
Sun-OS, 1-2 -
SunOS, 1-1 -
Support files, 4-2 -
SuSE, 2-1 -
system requirements, 1-3 - -

-

Talsma, Durk, 1-2, - 7-1 -
terrain, 5-3 -
texture, 4-2 -
textures, 1-2, 3-2, - 7-1 -
throttle, 6-3, 6-4 -
time options, 5-3 -
Torvalds, Linus, 1-1 -
triangle program, 7-1 -
Troester, Kai, 7-2 -
turn indicator, 6-3, - 6-4 - -

-

U. S. Geological Survey, - 1-2, - 7-1 -
UNIX, 1-2, 1-3, - 3-0, 4-2 -
USA Scenery files, 4-2 - -

-

van Sickle, Gary R., 7-1 -
velocity rages, 6-4 -
vertical speed indicator, - 6-4 -
video card, 2-0, - 3-2 -
view directions, 6-1 -
view frustrum culling, 1-2 -
Vine, Norman, 1-2, - 7-1, - 7-2 -
Voegtli, Roland, 7-1 -
Volpe, Carmelo, 7-1 -
Voodoo, 2-1 - -

-

Walisser, Darrell, 7-1 -
win32 api library, 3-2 -
Win32 libraries, 3-2 -
Windows, 1-3 -
Windows 95/NT, 1-2 -
Windows 98, 1-3 -
Windows 98(95), 1-1 -
Windows 98/NT, 1-3, - 2-2, - 2-3, - 2-4, - 2-5, - 3-0, - 3-2, - 4-1, - 4-2, - 5-2 -
Windows drivers, 2-2 -
Windows NT, 1-1, - 1-3 -
workstation, 1-2, - 1-3 - -

-

yoke, 1-3, 6-1 - -

-

Zeh, Allan, 7-1 -
zlib library, 7-1 - -

-

-


File translated from TEX by TTH, version 1.57. - diff --git a/Docs/InstallGuide/HTML/hud.gif b/Docs/InstallGuide/HTML/hud.gif deleted file mode 100644 index 6a1a5a1a5bd40c2451faef5188052620c6f0ca7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126751 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å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 Qm$rD^l}9=C(-~v*Clu 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%0DHG?$Za+-U9?NFXPWd3cMY{G94qnLAHtFK0wXQ{ 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

&<*Wl;Snym9>O`OEXoAep_^ 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

qhoPb?R7iZwuy%e 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≦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%0AS;y?fiKQv3IHzHfJUM*fFur)F70FcE;k- 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%0A8;Q(XkW23`v)%vv>IP1U0hp&I| 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

!uX4d?!U2t_7}K<t4$!U9@{ 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⋙L|QD9f($O6cEA8c1eN41T1(g`_wRB$ zpD~GL4=gp6e0EMfe}c~F!qEGAEl$T7XPv~X73b#7<<>fM5A%RFTjWs!k#;Y$*lpGa zWM1K)G_9!mb$54X1?vNLW`14a)K|^EjH;w%VVe5xurH*zApNP{Zk~SrjbHesU!*sX zu6(iOsue^xZtm|cx4UECF+!)a*om|n-+1~IUR%!l7cU6}Q?A?5b|P;Txxp+}pa)`= zd@1y(+^4BnS^_^3fhWVf#shEv4!NCdNGCmB=_k=r(v=atuXL4kXdu$iAT8*LqPVa1 zCARsoGIk<(S!XK$(-@}Y1(W33^-5Ebi#hS%`0>bz-}%8WFH_w_1g5JZueh3d-AW!) zjuc|VK3V~&K{QGY16L&|{{mFN=IoMOoteM3sDC zI2c-Cq}37erSU)ZsI;ol)S4?y?-@--5rR82ER(6EtV`%vDpVnlQ|$x`-lMV8%W=*q z%VgP(CB{O?BA>aSMdsR&_fA-2DVo^yblK8Cq0GIjtdrxv=*(X6clZ}4# zfKZ^*;zAytmSg^8?V}2gOM-F&K#n-X!v97|q+cD+DoI z7g7Y%rs5XUK)DiunW)QR#qNmOQyf!Wvi*i+0xopeNS$Na?UtCH5F~;V zZ{BVh2xz+<=#8|V8C$gIkTOT@>~;g_&&c7%3#`Mk%t{c=X4%`)LVC_crS)2h>z{pK zPK{)FT2KCSp-mDaGFE@@zyDt%Cw|wredRFlSJ5sdEu>>Ox-E%mqKT30K*N0$?c^X| zF2%egvj~WzsO*be#x?#Y9W+l~;9WF=gFPJMsJ;s2#8^gSrs3r)GN+aE;Sd)+$B>4k zbr@8sLsdw^SPmv>evp&_k^$8O=#*jCmiYMkF-+9DaD0R3#C+l+idDQ-&&MKr}^A@-nJ28OJV4<`o0-O z&Y1C#M76F}%;&N2fY;;yB5PpL2{^jkvfrPMO@MF$g~AtSUt<=!16N&N;D@dTXj8=X5WA zX_kW+vXK2Ek1);9NJc>jNwT|9dIGf%la9yGLlOy}K6|67w-=Y&BPS{|Vg_SEY%j!6 zTybWwmBKT|9lLIK{h%BA-Ddmj_9@-@m0$hk!j^}Y)6h{Nl=vv1( zS?_PfCf5|S%NR4U?GD7|=}gz25xx!bBUE<+icVMwWG7dkN}^#c$@v-OpNK6H|FQbf z|L*TLqj2Is_UFDD`6M;NdeIQDM~Cjvz|xe_9g^SaYw1k)0kx?3pQv#i@jvHrrV&$A z`r%TERuhe!6XFaOp2KGbsf!x_kvKx;ZKnVth`FvqSe^|EZCWY^W9-1;en6{aK99jI6XQ%H_|3~wBa~s3Dv0UQO7nn12 z@Z?-*Al+hLoRqwUoJ@=`-{8~dFQtTuvl=t`#Wi|n7Iw-YWhPH(hE7~8@cEUqifJ_K z-n5?QxgPO(nmdNt*lxSFby5v_l)!B48tf6s;;5{3JnkFLiQ;+>CDD6ZcKwl7)OOe0 z-rQeY?SLCdXUp}MJTTNaxB@#?c<`p)()%TD!e{rM6m!ax-Ya|;=Amq*Vr}zxm45Bdd2hWhPaML zIrJHhi5(~Gq$E=a6P?g4rcBvczO1$`_5*jS_;bFO!pw5$LT1WWqD-_;IiL8o9dgeB zQW|SjT}*h|s37Dsz_!H6mYi~NEF=ugcE#XK9$fKE!;Wo}ABdxcWB&21#Ab+<8)p2q zFsRsMv?@fw)n2DWAZx9{Z@F~vq%)?Z%QJ(6=srV&M^Mj-mwisMGXka*PnhMia@u%K z>yjENsApn?yaf29fW#s4X(u^y94C~aAJDh3re&t&gj|?V<5Co~%|w_$-&B&zB43Im z0vfHXjvsmP2e_1Sx+MCnA_S8V?4mTCq5(p}g^u1C1^*q$WPWVH}T)*n0MagJ^!5l-!# z;(T_pTF)Zv79OSi?B-Ueb({0al?5YdLYcoQ;wCO)>C<^C5o@xDt^8dRQD%Fvk)<9X zzU4xqE>aepl{k+iX2n>F)V*0C*z{d)a!Zp^RHrDvLNGN!vV0at<`QrUXUz^hj96Iu z5RC2*d)TG0-=WAx-)ggir~%v6&D|}Di2|P)(f3%G-fchkx!-^M_+@Ix77eNAaczq* z4Kv9<|Jk22$&?a52WDze)L5SlMr;{O5$Q-pVJ1qfC9Kur&L-GLK=j9c(XpJk6xuQZ_r0qcJ3)rOqHjN?-FW?JP= zK{VB|eudX5{(aK+C#ZQkYn|zz$7|o#VhdjScx}(cc!{S1+R9LYh;*faS zUU$1>c0)2_*l(d|UNLcq+D0AG%pw3Gy$qpW#0KYn6KFqPVt40VG$7$25!>jG7<;-(tCX3d&J(<2K{ z$^?ckMNSnus)-6Obn6(l#;8wq^qPwpQ3^>&wg=Ce1Q)S69O$>Kq2AqZcbkD^jj?Yk zl1Tcl>uXLia_@it*I#Zg=sr+t+e5qCZDpN!#MtJ;9yBjs`m+&0f7I$(^gJ$I0VR;- zml^@#ScRFS@15$>=$}Njg@T{Q{pHr_9FWb$O>_Qm3wvE~T$R9N2DVDUH-Yx^W(Xg1&1Qo@m)E!c*+K5}H ziK!R?2AP`Y&Il@G{4L!lc6)bs2jNejK~mH0?d@i_?b{jDPt3j%ostz8&NJpdlQ^jD zh#;7vJ?c3A{MBVOICFbAe)hAUrSH1GXYmnq52Q8-1T(Mk>A1|$x4|Q zqZVpWTZ?KUM9kjf8a7k5nNIwH@AyiuSS0n7uZd+;7WLqJAZ{ZML>#^` z9}Cs`;6P0Z#N39=iR?VYm8;sJjZy4n32XK!NG^1LQ*Dm@u`aljBlQ7n6~hW!N}fO3 zb}`IdZK1&PVtf`cgU9S-KZ!Xu#ni|~cB5#PM1t!Hg>JwYA@j9qwseQCJ>$5R8s|LQ z%qt8s=v%Caq-~%GJEMfGiOFGt?gKB6;3Vg++Qg(lK_>0Nj)FzTeH$`t*M2zJ?59C(S@ zQ9cnV?-=zJo{lLWnurCL0Vg_jb#*11ZtRY&nBqlA?OFtkNd6v2Y3}Og{qKMO3l$6bMn)Pgf4`30o>|C80zjWoC7>bRQ+ln47T`lPgSb@rW5O zGnlHF1RVc9wJz6-SI&E77o3=f+{NFjPLRG=d2p(NQ7zY4 zh^aps^pGd1i`nHw)x06qlQ)@Ep}a6RN-M+j^E}tc=4Fwc%zqU+TrKYV)pse}ST2cT z#G*tlmFgGY6*cwjd*N)N4HZS?d4NtxN$q)Xi72BJVnz;5pgu1(l={SzKvgt6B_x}C z{+1|j!yjfL9B zw+Da(@PHKUK)-FGv}A(v1!5CbQJdEM!yo?f$cf+ov9AIf*1Swj1!3frZm658YkQm> z`;QCF)5_}*M+>GLInfUY;%Ix0*d(?g&ojh1X*rVF)@x6>iFL7Ip&t@ zXv)CF?Xj8iO3R|6^+jrWRnV+-ONJ2ab$ z{SZ6qt<>rCiKZ;ATOvBy$tDTwL`c#0g5Gd|j2y?)M6*8x7p$1L97CctbKnl`c}Rv< z$=FQL93ysxowiVF2eMuOaK*~s=G3l|Dw(hqE<_6zn`nqny`ND`@0I7Vi#>w+!Il0if+n3h4*$d*A!M z>YeYT?$LS+5}QUNBVc=MpyMqdWs6{G2l58;deMdG9bdsO=tS6gWr7f9H9RJAA0|GO z|7p#@)+=Z6Mq_3?9&9ptf}Q3RBpxgW$kVw`Sl`h=CGBSX3U|V;n|DKd9#RlV{!uxf zIN6z`Q%>Ue9Vg$LrOcDZ>sl|?uk+{<-zCRIVz6hdF0-(x$9K^YnjzM z&+ZQr{}_uN=KTcqPzQ=iLN*07!FrT)N}u3G7xx+JSojBYRxOyQW1gFxuz~$N&OnD< zFNQuDip#=gc3>5MGc!Q3uoA-(788F3Glca$t~OY3Rb!zienfInF<7>&lJZ7R(#HJs zr$0?+dMUHIKE}temA)#4r}P|~yxqZQfm!2%NTL}U@xz4_pBqxR9HZV^-}fU?9+ChM zO=XjItM(Y?$AU2e&mAe8GM@Y0j`-==ix7iMZrBW(-F6_ZIyV3KQ$GTu>)D4PMob*svP%A92%gctxRBszK#At=6G75H{=fSfECAk1O{nQ}D zdENJIFT%Q3nAR~=)-_4$N|&-4)j7QR!hsr#0tjsz6LwYpy=nj-=M^}rEO}&|ND{k| zcAN~q%el4B;yh$jE44i!aCK8w)NN=lU;(fI(+NDAHU7X6OT2zaqvO)FEj0_AT{;im zwB3P5txoQ3T52?&zxkWL`Q+wVE!C)4V;0CrV%lajbf0D_4zl39%IXwuE7h@@?FPzf z6sr0TA{tMqAw7_^g~_<}i^fiz z(jab@*s#QH9=cxhq+xy(H>FGMOUO*u5@GcT_n236)J`XNEdHHdk(dGJ!}ZOs+20?b zTVu&;8P#*rV*T|T$h;fD`pgnL6|2x#Wk_kdZh^WiO3oI-tL`tg1>(JI3zTFHf66Mb zmW1L*A;&@vH(wjGFZI)^gRZu~__J9h8#N5DJI0wQMkiXlqjg7n2s}&aq(G^Q&p3}| zb19Pw=%>nwc@K_aNiHH9rTnA>h7uf?#NjMEl^WV}JsytGH^i+*#5`3M{V95^O^QTg zI#XApGd&o*<7!bwU3G`8I9Z}`Z&#+0v#<$}D-+(~eC zaTyIYLt7Va6c-vlzu935C17B^+{GRxge;m|c4%Mx&|-3ls`?grqU9jC9x`xsH?Y5! zmMmQl98^Uj60v;JHSgI!+V0D$;qV6u5>}_I)&Pkyx-)$hTU=H^E%~+0Ho8Eho&x6n zNV3f4;?TzY)KSD4LFZ1nY3J0!w%KqyWhII26MCwehQ#So zXd@cQj7^dcX^N@w%6>wa)eo9*%@W=S$H7V*@Py!x9V?o>mqNrgi=UZBD6I$e(<|xG zyk!2X_@`;pjlL&oK=bn=mR1Z6igs^_`4TKW6LdXbbtx<}WGU2HD;sf9)0VRZ%GdW< zKCy~N>Q?7*8@==6cYO4t&UmFkiR`M6A?CsRFgmI7ga|2GGnbc_{EdF#RG-bp#jsuv ztF>Vpx$8tb=TGQks;=TB#84MO@PR%Dfriu4P91h`8jWyQG01VoFd|VK&gH3_llRYY zEa&pyV)(K!f)yvu^W*33q!i(0)?B6^yIfb!KWFM&pAc6TkL5fjZ}T}vnEPuZKR#s; zGO6@}O^I+5ldzEvEb`Z3>ZChFvPnsxGlWRP`7%-Woosa)B_u{^rK=MAgD|mTL2pB} z5ytApN|$(TWOPIOnG4@D2}a^?Vvtucm4H+O^YAbSxn#|`b+r7X<0DOo5U73&e8txRYocnu%w{yD3aoW z@Ep0HGQLrDt8iRG1o7KEn%;4?L#zsEIKP>sPFfu7z3w|&9BkjBrxE{*_YPr_&ZZ09 zjk0d=Ep0D|P6O}9IFOj6sMgQi&5s3Ev7w5809MH+Uin$7c4FAM6=Q*a^y5 zw7RPdD1lrPG=y3X5#unUGN~Rjhewqb{-<_-sJ9!b4_Zv-sg~Nxw}Qo_EZhYa9sdrK$ySkDP~pT(YhX0yx1}=SpdX`>0f=2 zRD@LTS&5)f_9*43z|Mi$-B?-XlubGL;mV@;&hPwAlk|A>T*xjzyo?W*c7grE8=ICK zOWYj-=%_Pgs+ELZiKogU_7We+(fCz~+LS`66n>&O~gTwN5AJrI~+%&-~4^KAho{>n$Anf2Kbs zg+pstQCy?Bbm8%;acC}PPB|(UcsUeB)vWe z2sV)jWJ57%2~pQED|0949JJU-H#l?$S`!_8FYqzaq!^SR6$@v{sF6}9gE@V)dYZ(E zi8_;F&~_cymupIRi;+u0?LWJH`os=4duZpC5fvn zx|Wj_c?!n*lmGSKsm6_DF@5(pU{KWVk8)IiKmx9w3heMc3Vq=SWd2j|m?zYT2A9(P zDLlrBs&9eD6;qg)G6%Rc21bNu?XX~hWej#gHRDle+cLr*^6UyU$B5FHq6Q7yrtm$7 zR<#UgUn8Xw`)aD=n+cC0dQUmXnfeP`G5x7M_DBE_VpSZ)_rS9vYYY*_X_8`Wf^2>< z8fQK>)b4P+YDYWyBt>tYOjsN<967-hDH9{VVm>QlJB)e$qOd$xZw-6pD_96pjiW)4 zv=KXo_!yQR3ZLbB%)&kwB+tb7rYZPEwFG_AreHCRyofe-V<+ibaHk`WG!tNNQla=S zg-XH0n6xpbI9!cfV@)mR)&1Mw{+)J=u*|S>qUScr4Y~`uW5FARx@V6X( zDA6ls<{w?mm(64;lm3v`QO={-@^g%6J99jb8QaskwK*5D^=3^i)Hr`y<&J3{Yn?cp z(a|+xc@e9eS3}94S5^lms+`!QcZC$@Kb4!i)a$g+`4V14mgkzu z7Wh^EJd*68l{QtaNJ>D_npY(UvP221Pws!E?rlj#kg6LU!=`4DF-3_uUdH$%;hv~2 zmm(bs7xR$^8568n>0vZLLgy3z_XZ^;Ecg^xUS3K#SWI`;@N(Ga8EdR6 zi%ofRcT237*x1AC2cm_CG38z>;RVbVe;0#UvJakmhnQ{n;6;ZT5pXKn^UyThPfi!4 z&+}Y309zjT)vO8>;Lrl~D!Wjq8IL?308CAs?i9z6=id|Mp_u|w_ubw8mw)+}Zv+GU z=ANrLzyUfS!%6B5yRrJ@U;9+)g%f|};IT}b=%)La58j!{YEG@OF z4`Yl*Mr4{80iuQ{x{fR51EdHf>LmaLhS5TJ{f(rJ*i^Gt0dj&kiJ@mF{Rw291QA9F zfF+?jwm>-msTDzmRbch;7$oP4n?%gxB7%rKNa~FdJ|VMiq3;@C_gmW&p`0+D#)*#j z$!p@HqfJ~aLjV^pE0;%RrJi^(67naIniV9%83->$3H(1V*^nlr`o2;5WE(Vp6?9E@ z3KcY14&D)Dw#5k9;8D|zNpnNYTgm+5*uc=qG+S)Kzn<#vnp|S@Q;?C(0uFK? zq|FWh3W9p7qAy=3DGkSVdwFs9?1s*CEl6r!Z4x<3E3cWvBp?|;N-#;`Qw03TNPI7j z7~X-{oEF>)*Rg81~6_}0+RTO!FF*z#PHN*M7F)b`jFeJ4g12l5MCzp={B;y=~a5^N1 z1uKyEV@VXKgguWzW5ioTE0)e<$NnQ(TCsbXRgA$G=^JUp5Y)!wcH~Tb*%U!73Oa5k zp_I&o5+-3&H4F5!NP95y;4*u_MID+SE3J-m5}2GC{F|oYoD0h|r%A5WfSOG~~e0EK zS(uefp5ETbeTnr2PK`vO4{4=($%Hmyx193%BtG8AzAYT`4rA)q=#5&Tm0aS7*yp6n zswp0}8k1~CYQjpvO4es^B@hCc1ezJRLquN5MG6jB}6m zfN4saM?ZvNp$lSNDNSGa7ukX`nmk`tQ*PGnu)KXHElLfNDzC(6tYmWylZ94=5~0Pj z3|CO(kP;O2tZaCl*UO=!Lz@YaLw-GvJr*Q5S1AK764pIkt6?MO#6hfmS?<7g!qk)L zg9ld=llT*gWj}LK26Sf1%NO_^T}AmqLNOH`nHZz$99%Q-TVtPQgBj^Yj$1%FF4RxnhdA-+cVlO^bY7S53uT^3-IBf{a35ZefK^U(WFrKnYK*H}CW4 z7@PR9%-s}%5K=HXt7@ekLR>j@ndfI`fGU{??>H?oE{49-BIrzbBnBRF09QoKfETu@ zW9A5|HMf1lOF%^ft2s|0ns}K>lA=}NyJ`e@atmSuXY}apmb!=b3%C33@B048iQoNi zymP)BV@y!Y1u_xmHf=Uyp=^Fs#WcYB=NKOf%n~syg(#|pZ015FBSd8*AJmmB_;cJ^ z*Ih7#En1WzYkOlu!!~VeTcW(_j zoMCTA#EOU=C$k;+=E;5bj&ZFO=L@jqSS$J5$q%z1+Ey^zkUQT=fyhg3 zJk)dDr{@U`VZI_78`2rL^~ZYGWHcU5ED$J1;U=-XhF}8rhbpFTTkEX%%v)k8R1g@mtTJQ`0${&Z<;aVk8y~!GQ!zC zze)k;`HlXH=dMtsFUYuF^0qD-{T8z+TUQE`xTOw3YN7To<4{f=Gd ztpV|cStcAeiW{)`(=b4EC9GNf@PHhJewTK}B&6+1$r!IQ0L;9f$Fqa!+^F4OXA|<9 z_#|IdS&2r;qkX$O!6`T+@3U5&0BbZxUay?rR)hu%u3s_y(&G=AP#3YyUD6B&E8~6K z6n<`Q@q6nwcv0G$(B6*40dYzaYNXB$aS#?7B2qa+3#mkB?6X9X`uqB9T7@wq$fHx^ zAg?ayIyhf>TB=9Kb(VnR$zh&4B3;T@x^9h~mi>U0iJD*9mTDG}@mbw3FRIUX`tVS{ ziP!1DmfUv(^P2tKbenqUw9FWQv4KQdL@)6&o|EEcICuAbi}eSLj_e!OjY+-ghAS8z zidAr1=kfd~Y#pf@p7#{uUnew}$%A6z6Yrm)A1~K_qa#^YJnSX=_k~p_=Z*bFaRdAX zzk8ln^#>7$N^e8>yW+S(P9DL)+4PGi3D~ zILgnm&}tTJ;nsO|XjW&P+>#vNAX)4zP1VJ#I!&XE-e?iPPeorO2^NvvEmM*XAOIj? z3$g8ywa$6Q6u+}XI(u?C2Rh8$=Ku=`CGJ~KoN_h0!fewq>Kyn_tST(jEcP@zih!6G zyAj;S2JTH*usiR{Kou)uEL-F0f>(XIRP5!Pb-piSu(64kc{U!QTM$_vj@DN;QPe3L z@P@NYRv0>@0ud zhA+OAXovoW|G9^;46nOyzMAK_@x**Cx~{qN(2WtC_Hryge*B2LPqz!;Ps&bS-nj2Y zkF@3-S+8boY2+kqXkGB=2(cfS%`6gwWLALo9LI}D^N%-kpy!pCkt1usv&Y==BM52y zC`!Ubx^A0okN1)D0zuIJ{>xe%@Xk+Sh8}WUx+>cFBhtHMtQbsto2IKHY~`HN^)vsT z9_e>VsTpx9y*)gCI=xYbF>^gC(>r+B;lvwVACYFHo$1)-oit*|p?>=G=^Nkp##di` zg@Q9WfA^VU4oEaFHTyp~raJPB#lG!)uq-m*rcs>-Th9xUfz+TDm2XycUPiBh0a=}Z zChK|`1af$OeWkm9q4CcAQn8u(YvUuDlri}g z(rOTe+`KGu&x~I}xqCCHjunp|5Pe}DR#6JAJehKO|L0FXNK4x0^tgL~QezSakHhoV ze)eYsm%*`lZ!M6HrwETw^S33E)<7$jz=eab?I3}d)YW$nhtH?CUUCll+~?%X7XWtp*J=yGj+RO{nYYd|wITFJ5F8 zA4B)$M33jQw!q~1>1MvT!g8;KOC>z!HZY;pX1Oz^Yonwg@BCcuMWvcHlLodAD={1R~)jmBJ$Nogp-K@UJsj(zxpfxoqFP5{MOHlNpInL6_o(b+SLiNj=vRt;rdv%8u0S(#*F0uO>BsV zR(S%at1ic8!#ufUebCF~eF%<`CqYdlo9XB~Mq|~`!IhP2WW#Y0#*YCO0=e?WoFd0W zBKpr`qUVV+70y97HI`uwv!rtBC09F+{)bW*k{qza=40qYz@_I+cG&JrL|%I&Sm^C$ zj~e4*+=I1V^dPy&qOZrmFNm;%5m-3q#wNhG5b?+A34BG84t~b{Dvix`VdkrV-N-?n z&aZpU{-+~vk@NAufzgKt&aV2Q6*$$d%k9%}_)q@o&+N85<5pzX4wpARCrh4+++tL& zc#@i6j>gQ5c`oR^y^#??L_Z633wwQU&GPYbVPwF=14Z00)-|Tiiz}2N3MvL!fNJSY zUmP!>zq;kY&kOWy9nZfQ2YcnwbMo#+G2U}}FZp(V;~$y=+~qc{;hF~xZW&dZgb+3J1OUj4}X}bObYq5>aou{FoV_yauDtWMLdwc11Y~nX}i;W(U?I z5cqVjS?h=0D%XTCUtCy}Gw`dz*B>!U5q3vTBErNo%Is3#eFx56LUF!?pN*VxGFX&@ zlGFP1`3Dcjr*XRU9j(K;KL6l#4- zvP?RUaF$Ye>SFrTSb=w0SelXEhwLGg?=~H0!yHDlb|JHw2Nb=t5P}EgBe|{s^dV%C zRrbWYDq>EHti#Ur17L4q!+B1yD-_ZCWa+y%OESzqnY+$Vr~)bw%hrN%(!xGCEDLrR zIcpJSKRV^muhz!L2A~Em1L4kPbNf0%k8xuj>zLlIcTT4yV%KDKAT z{QLx1_-bA+Pa znwZHjjeVE6hMYJX{_!9Ck&hog7Ma;8?d0M4^UH@XzRdFk)6CL+;}yNDzJ=M<-a*fb z&>as5-!WY4;SdUg8y?a?+mvf%mn%#Il4EE%Ys8b(95ByVs>itrnqn-#&Pp6j)0p2} zj~?nPU(>0U4CAv(ukg5Bxh%|fRm5^qb7WIB*B*C;s8WBEDp9^MMQDE+9~s-FRthex zQPs6TsA7&f{SKxkB2LUNK~9{^6YJeGOertdTnldQep*amaeW1>r)Nl88)V6>&$?oD;-m}=?Z^#y4Fl^l&dOGzvj(+%bSRl| z(6y{Uw_z21JR_jdDTWI*K+m;iwhBa~EyQZuoIPi}na!Di} z9X!cVezxRPS_Uvwm9II%vea~;+22bBNS3zuniFa{(s$<}I%NrZ8;I&=^?i;W$64-$ zkB;EXzN8{3rC)upY)k{X|o|YA$gb#hQL|i(5bX!#zglv;%i{hP!Z)9kWDc) z3KsQfWhA5`lRIRzSs266Bg@J|wI)ypj;y#$=L_bV6~X)3@7lbS9u-GM>@3mO6l4mr z7~nHu0%#xL9OkvqtK0M}tgUEd8_Rfr_ZGysp3eZ6P)nM-6}1LGo!&uM7S@^uT(ILY zbrgnkzv`Rc{3aQfw&e5WZMPvG*__^9rPy-eC_4-CaL(;^3vO$#W8`O9c}~mPM$vrQ z^N`uRq8~#3p0jP~K9c#^ZluGkWg?k;r6%b*;6vJ0WG zPQIuc&FtS%6f2$K=c_GZCM$DeM&ceL-QkQk>nf|h0G2?M%Vh2o-ds+yA;_wt2#yAy z8rI*z1PjK=&s-2|jB?Y;0CNRWv_o`Yo?qgN&>D_5mel{2PjWw8#`BIc#qm4@WhhKI zr}xC1b3Ta@{_Z#X&##{!505XWm&5ijveH7fwMuYEUiB%4bVWeZDt~l%6D#dv(0=n*c47*B`kHu!38!|tM@CokW7cOP~LarY!X8#B(Asy zat#Lx7T?~U$jH9F((hM>O~_awVPSND6-Z>?_37Q5*joUeb04@1zDUD}r>(~+?@&}l zhGSFgvd(>1WH_|&>VD(#^?XKD*>F-_gxvPZ_nqk8Nqor-07Gk1M#wr`^4K=o#5Sh-Zcjy&@-U|$Ev-O~D1N`H# z1Cm2pCk*;SA|wIdf=22vm`&z&rn@jf9}T+>@6QZx!NGVkfB|%d3j-im0>oB}d`(kZ zz+@!8^P7LHp7D$DQjrb6Hi8iiW}C^ieaQomyZn z-eLgtMKF`6my?&yc#0IOJI#YhJ^O@F&1F*yMp}V#?CHASDmw0~&z~R%@Ax|H;fVo7 zoPL=pp50w8r~uFO0(wvBu|0qB#fQ(IKR|LR&nF4L92GOq`5XyM#)9tkJK>ewbgX^0r2uH&9kx6VF0?j!1F058v8uDtzTIJ~Fdx%0 zlp9)|uB=k)-Ds~#aA1U4*6pgVHTop5akzL9!r z8vXo3*)E2%USuata`Vw02t!e;=M0q3$YsOXken8FQ@7F`1TphraUX z>}6}fYD0Hg|3{L)9N#~daB;A$g_EU|m!T3Rc}Xg&Mp;m^!ehvLY^1zi2(s#xC+6QX zh7hcJUEqZYv)$X1A){i2?~Fbcrc`oNzKpJ31dUS`zLM(qZrFJv3T1QpYGUBDU8)fF zlA%q_rIfBc9CoMIH~JH@<8%w3zxu(`S?nt7>ag$X>E0)o0b?oQKr z$rMgbDJVd^TUPBE40mB|JT?kwmKi7K5zJxRx|p0ia0jp9OdF`J*(cPqXzVcDY z+kx`n3m)m*<+KPIx5-l>r!!q<{GJ$)M7j9VC$28gE9g;hAq#f$j*%tIm3Vu5*>Awb zkk-N-)*6QheMIjcbB&}=n9CknYSva>@plzDUz9ZEm};D8a6`ypP_X`Re5%HMzi~*B z^PwF%?==I*M>SfkTaRiFJ;M9i_8I}!IP4!_+T_lKZDb(@ z$Lns{i}h9|7pH{MFr_+!h|7HqiZ(^aJFMHHwF90QF-a_$SW{x*1deM7-1Q`*z~+V` zdWE(NtbljSrk8He3tjVWv&F?OAhlV_>tQ~X&M(Y4U{9Yfw;~dw0WT8Hwd+mCCE@LDlE6; zwQ@qsBz1m)hc$0!o#oZZASPy(pI<+G`0)Jv+53@b(x9~X=@UQy`ofsranT|km#SXh z9Mitc>V};#vxGxytpRbjt-1l{Cy-eLfk8z0P=;cH&GjVl^29k@31;zfzV45d!%d0h z3mVFGD7V|uetzKsz6TAg3OAF}O4=htRw0!u$7*`_u9)mYEZ8QKuXA|{)Iz|s^u^x< zG5M~k)LRh!aqlQ@9&E1d+gs&RdQcv3v73}^eCV13WihV;R|N0>GAiGCFqss}O|hPw z6+zkUe2Lgpzu>lM0`enk)j>3PX>U^gDpdoS6-wuqc2P+qMY^e*@=QCJo+%XHQ!dM8 zXL1s>dL8$hn8QawVRt=UME2p8gS-<@H&6V5%Jc;|$otA(ck#@R3tIEl=hOzCbmuh# z*i{&P{zg3yBf;z@)3v_(IfcDKp;anXthvW6C9596Y1Iml!FN0t6mcZeS2$hc^@QVD z4Jo9R0aHToimSzE;f^>~T-G5u#yIM7W3!FxInA9MV8z&@#C_C$ZLwKZ4uS(_z65N1 zoF#?z0WX}c(|O^o5e_2-&KfaY?C;_Vi@Cpu_47)G;}39m5CkJmsw-^DHk}Mn22UNq z?$AH{_ILhA^~B%&?Vt1svZfayG#FDrmiy45Kfy($4G(G9l2N1O-W|yZLJid>0-?U$ zstTse)3us(iAR)^NaOoDA9NDon^H{uue8XFafQIr6~+~JQO|jqieVN#Nbms$D0B)FaB)0v8X3?#6jyKB(~Xu;@#LXeEbh_0rKP8`iiH-Bil1 z9!{^%lt(Vp_;h^w>eKh>o01vjSpM@Tx=!-GyPii2fc(=)QG;GrSb8yC@j`r;kdsrF=OLq2*IezK8Sl}a+<)S=n*+nW3VGXci?xzh-AYe zISUIKbIHU~lJ&DyuT9V0*3EH@uHt#8cfo%hSWt^Xv1TjPEpMo;E0xk;>d9CYi96le0np zx)=B6m|HIVTHX%|XExGi;eAqWu+uQ&U3cqoxtr7KJm7dP(0%lhru8ZLTP!6xHW+SR zh7c@vBdU6u^r{O5<>RDH7Ptowk9_@|Z_VdI`qRpL-ao|a3Ae8@3w$EQP3~TVk3QI} zHZRyxC^5gMebxs}G&pb7S7@@I8dqFc0zVke)ie9n(Av?DIEf3TX6%0r+TMG;pEazH zb020Y{zrTO=29;~)CIw4WdT@=C$95k^Ifp2wQ`m>zyG`ci+bW;`0h_g*RDlp*VQX| zzMG)81l7qET#6-U(Qzj0IMG7Ta=-DQ!|8H`a%s@f)pz4hEdqpY@{K26Yz{8?i@15x zv_nlI}q#laH`=6h)yWeMA`iWX4t#%{Uv z_84@=8(rXVXYC)qBDMm#sFhLhQ;@u25cts11)W$!YCoRG$0y2!7_Q7dY}3DfettOc zar*E??{j_J?f&{-{pqbZl`KGI`mF!w|NXze@xwp-_VRhN--(pD`X@F(wD?o;;VPqK zuCiTt8ALa9?F{2mJS*7FA6-M5+q6N0S1Pz^(0a!I~b zgR8*NQpuqMT}>IU%+b=G-B-O#r1}emh`Iucqi^?cTY;>fLi$y+PPN4n3Fv;_?%6}SNfv$&5 z1F!RLlr9mDCGBVDp~A>AsyylEQob(S|L4QQ(KWzZlXOLR!Srt04m?TB&r#K=YOUZL zIgZF7B0ti3*f^CjkLNDir>f=lBicRwASjGFh3ofhOd9OO>w!-t3S>zM*sieDKX$dfKH zgGh5_L7j3}i;Lu^GpZs(rq8m1gdxUc;}5Atxo{Ba-V zrXwfo!`x!H6F23sfne?xiL}c+ZFd~LeEH><6fA!D@Ikc}tPlEN1$=cv0`CH^*KHT;*Im7k6o41Y60l z{p^_Y<`2I2&#gNB8$a$ju}}7>Q;cL%LJP)+Slhx;Scy9<#=>q_Jv8pX6V1vJcBOmz zoeb-4U>@ypPfnEiwWAP$z&g=#R#NP=>em+=t{Li_!s9%g&aa2#qsLb7UXM6m9hoPl z0@IU#)a^CLdgEB;`R$b=L>MneB@8y#(|0Gc`Z%svVS!BN;Ci8F_pB2nb52ICAv3^a zv-zo?{3}27#h2sd+KOBsb6T2m9J)M@PY;i;r#ILXQKw*k0MraUc{m=Y`N|VFOLG|Z zl!fp26qnIC-#kBmZbhxBm+5A>REkJ^eX?8VE*j|YB266M)rcaMLl5CdA zyYeQjm${m3f{XHl+mwxK&bgy?N>Bn4-YNzj8pEMdYF8baUX^K8G{4npjNN4ttGb30 zdnjsw>R2P_ZJ3T1h!eoy>hnWF&U#;)$-;MpO4>!|D9^wPvoV?-+nnqoXY|owK6YEl zIrux~{f7Cz^!_Elix_G|kP=_En|5r`Lajr9?8c)VR6iAC5+rxTx~=HN{geD~X$8?k$v*{)wF)%b%EhnX%m)u#l25=O}_>-#mBJnC{cw|lg; z!hQ7n>z!l8Z9wC1yU%4wc|pL`8oV68!zB9oDu!XsqWS<{Z_MeVxv<|A&w*A5tpK@s z$q}`{%l2e9cwt%HRjYwf{9b-|{dxah$yhLxiB`HD@cr*@TY}L#*E#aJ>kTzcb=?E0 zcZ3A?&#D(=&_y>gF*J__YP0}=6-Nmj`!lNz?;?uZj}>Zo;CXY!U5BszkwY2tvXT|k$i*n(!_g!6Sp$k&_lnF^Fm+5h zJbiV>cG_D9n_m{ zxDP!E*?Iyxml33WVg&EQo&~HLJ@!|?i!zjkbU0LF)CF4swTx~iN|aDuc!k`E)YUTq zYT#ED^Z~F>(Pi}4XH4y;>#+>d&CR@&7#R7VF!0UhvAb`e%a}BZR4#uqB@^#}#@JS3 zScb_wKYyZ};QQbIe$_&ftc9Xfdgjmn{Lks}`I(F+19On8!Mx&-3^Ge9#?(%U;T&#= zI>|~D(ai_yt^A6mrHw=fW*+BZ!>499)Y2IsR3{p{-)OTLv zwS?6sj0x#)Hr{;Yxyo&gQhbWuoHZk9O_d!cqnDo>9_`R?UD;ojz4kuw3v}u2>}2@D zX3a1T2B7hxqE>4q7(*jt5Ro5Y7R<5W%z2E3&Pl|TxZf|GW4fCkKYsL_iQU+n=2G-L z=79AObkstT?pt?MdW#3O!V*fh#hgLPYJ7`ggWIe1L3KSTY?6LliJ(Hm7SZQM*pxw& zmL~9wqy6;Aa`k-SkudIhtF+{VKIm24AqPXJxAT6tr3@d8UU%4w6Xyaf%l|b8O|JO4 z_xDauY@^iBfR>;9^>IJwKFMu+qxq#864Se%+lv|WRwGWg_i=sQHYSZZ7ZnUfayZ!3 ztj4sryl<^JchT>Q71;RPX!Eb_3R5lBtD=2nT>m&-Jce^3Uow50IX8V!9CIFdHpVl) z7dSOtd-$#2{704(|JqN)755+6!`Z~j6OcGuBF+gcTX6n-KJkqgcVF&QsP%nyh;!v# zA>}RddFmAmOT{;Sx5dICns_z+&%ucHTF8>+o-;?X@6==kq0p?OyyA+=T%r_QpDi@K zXlPi%a4UT~)mRZS4=nY=@%Upu_G5<~_hNbX@TcZHUMXhRSn1_;FSn4@US7Co&N(I?G_n9yfl>g9t(huNE{k92UnA=-%_kC9BzuWfxPXF_JhEu*00*C|Io7W-x)V8vT=xJn?;{uTLuSBk5c6 z-`$*f#R4ThZd>*M2x*VpI${V zf%EXS<=a&5<`b{g-28cUZ>Apr2izFz#L^+?i*aSE?*_8F6cS#?GqO+MTHp*^Q(`pX zPtAQzf+Jp!U)8-Q#>~2Ggk3oxQ!ND#t-rsz>L%170_!OUTCg{Uuy2bLPCC0Vx_D%t zc3x%=`}hKecW6IWzBO`a5khWjPW*F!??-*neK%MH3Y2!`rSOedD(^bX1mezPRJ8Ys_hNbotr8*h zNU!d$-*QYc?z9YoN6Dh9Ci`6K{7#8tW?GuY0E$?kS=5!sd4jb<&dr>VytG{(!w%R- zeM4iF$P@y*a&2N6Q6jf$|2LfE{dal6wnKBqr_R(@;8~RwORYx+-9@DY( zQUh!p<45S_eZ%UM^vp(vLbk}CT5(`9ym%2NJ|oOS4^KR?!d%_ylGhcycNOH@+ANgW zwz8uQvHR2FBg&nI-y+awZr`LP8=EX8nOG|Ba}bdh7&5G^c5@-4H&d2ZT)C%TC0 z?^fVcg2QNq)2C<-uuD~@#$|TQfWqS3+Rz3%CcMsoBLRMLweg+Jdpt{4$hPoEhBs^t zI=8?*IKm4h{q7EHno{yU`mCJGtMiFLa0j1w5iGhF!-`5bB(yZtbaa^dte=il6{nB? zWWJqntaY_n<|flYrh_DmcgrtI>U4^^*6k8>agvPHV=M)Fbwf8`8Y>IjEJZNN=$!KF z{ftNFT6cK39?U!U754At&cod#`i{UcxSR36f`*`00kP}oyNK=v*%0r?$NP(O=Uf1_ zKfxPi!|QoL`2PAEnFfUOjz$St;EfNxD02*6`9L*&V_{-8G&=%ougbVx;=38vO)C>A zx$C{Z9$>$5wGKRl!;bxI=QrbAd%LGIB{F2jH~W*VL8;fT;drX}f1zk<5T-T1+*qS3 zw2CAQig!@&W3&6tZ~U=);vc`sS({p0s7beOqtXCN84o%C`MMNbH=;he=7SxlwxAZS ztlX+GBob>}=Itn7+)-{}rhF4Mbhdk>`69QOeaLpWTGlWl!vXCZ8PC{)Co{{)Qh+`X zm*G~EPvyIHW$@}@xBJl_{n6v$feheCUbgL)nN?va_o7FfcHVRlpfGqO^A!2})ILYR za29tYUP_f)I8&?uelxaOYgK&7Dp}iW8a3NsPHJ8_Q^rgZV3y5ov~6XZG^W#x{u+mkA6^vA;y{UPttLBHm(-+z)Z9-m*H;o2K3gNM7Og&KUE zmy*0Th+GyqS?x1zgvmFo5D9RQ06K{T$`>#?$h10>b(M+N*=?MAVgZdCApE`gvdD>J zvZ6Q2@rea{7(2J>GJXaP8uwHHW)R&nHBqcId)1JFsueL+qH3w?LoNo>0S|}$& zSL-@oS)R7c{L0MJz{tW-HVi#y9|+%5-aKEyCSZ-*GW+AWkX_o1^8C_haWdW)&xsxT z=4jz83V=(Hsqxq2eEFCG-~a89e1FE85R?R&i7r4$UP-cbnIfKbR-}yFcE9Jh%zWzm!%mAAQYT{}tZ${+0Lvj;S&IMFdKSH(k{%xDYm= zP*~+DNvsW2<<~vGIlU?0u47Uor#QG7SRF~fSf7miviK4v_tR@=m1t|SPRPQ85h2t1 z;qmc@tf$M4oV={`N@eL6IUS1+n|l>iqYF<{K8)8ZzRt!*T|yg{4zqW36iYctq}J7v zK(T^6Hyul#N?kNWEs{-j{k9vg^RTU;CydgRcYugV#e`$Fm+Ey(GRZa2rU>(-lu!^e zhO`>rA3O}6_TO2Le2w2jMGeyAEre1G}E3RdPE zu-Q<|@POAZ&yzgdaW+ym!^it-jeUz0=7aI2?vA4khsKk-0%dk;$I{d})|dmWxk#z| zytpbGV~KfpjXJYP3sb$%TO9$qu|6mlW~4-B`vJ4alB1f(IxA+rijflV9WdMUJ`(Q8 zz))6}X7kO@U(e2iOl5WS-20*m=l|Lh-X#JmcbOJupe+$V;r_IU8G^xA*@6T1Lr-u$vB(?pW^T>(41dUyh(y9a<*R$u@PPL_icT1sUyUJN*w4i^lbC?4SlM-~5<)!76BC-z1C{u;fdOIy{HguJM|XA{SKwl7Ai8 zNM*xdCvf-@4+G4|{u(L3GE=I7QfmVY>QzMp-kg>|AA#vc&I;fGK{5scwL9kTH;g-F zvo6?7x)Sol^zNHY|M>XfNB+bAh@Ph$7rHsz+FK?;hlqwWLYnUTIdG2y4%Xfz6U?)*RGml%^$fpJemkd;uQ)@@>!S9fXBE{4|Ml42mauXd>Y(VQ#x1dp=o>6;ce zqqr*Ml#P{YS&Ef|6@4GFi*z4Z$M}45e&;xkE%)Pj{;r}ZMXEw`BNS;fO63@vt;NIL zmff(=yJfn0vp%6twn;TljcGA7^~b->DFzd;|{GoBpOp}peb#XWv!%if%7 z;vkw5`tDxtYX$i@Yz@nIV(J(I zcF$+!0gLwjex34s9Vm(Wg`5&=1+@$IJK*l1d$Tw>z(LdD=4vzORh%le?U> zLgqWc&lgIv=P++LmWX|QypTKD>@4uhHCPE+Z}I!a^d`Q)%;%mR-*62Av7Wnw*Na*X zCQ5BhOAha2V7e9G9jK84Zcd<1#rKCkdE^auMv;o&%ZrY;-)rhBpZKr+w?7dq&Z;A8 zN4tte7g3ZcT2GdK%X%ccRI0s4OaWBsJ9QG^>hXBg)C-d@1JwoOHmi^|in>JX}v1;{o%JEhngn-NsS-t$*>HQ?u=RCO>N-E17NYL`2;-Mx-HJLqV?%jDftH>Q}5QUeH98?K2g$2Lpu z#k_)-Ihec#&%o}Q>)ouI#fc(h{?4Q4rmeuj)XBZdEFDn-Qg4cRw4=#FX<}WhA}t)# z9QJe4w7|y$&uO93rb2B)}oa(g7|c*Z=Cq4l5%&7JN|QeRB56!!1yp z_gX^J(~V)BRQjd>i5z8g9e)=KwmOj)ZCYginsZ}b?`j^iwNx9cOS>m-LQ%T<>1K(w znH0#@Fd{G$Zj?QFVwW(l`k>JSduB5W&+ua7*&X}3s>%eCcPFnuUD$!WAXgsm_QUDy z{94+je4XbD)(sRpcU_ZRzm{IP0@QW}pRskj#2npUf4QDKXN7~*`^D6}sU*8|EPpPYO)6X#9y~)A=F2ri{g5hUgMpOB?UXyTC%6Of@L`MaM&*sGM zOo1y*2}IWzRM>#rsv~4O=$vrF+%1>N)^RK(xPqJ@!K^FN4Ad5TEJ| z=)B}wn{hY%?&~Qe?}m3c8b||N&%j@w=Vb`<*JH34xe59{-SNA>^^c9k^!I*Ja^JQI zWFGU)6?&l0w7gHfD;!>lm(`S7&uSuzPzj^{uWcB3n(U{66lK%S*BYT*WRgbVK_8r? zJ{%r_iKQ=z0>u|kALxHs$4ctbd~bx~y8|mUE9fA}xJvOrz}BZa&xi6z)~XZ{2Fju` zbKo#sjQMbl%D-fp? zxw8mBr@3R~|9Q-)eWQ)K8R-MnvGBAL&@=Wj3>0&a`*ylB71`lcyBxUgKJliOp+p;e zH$;u3!J(UtWyAPD4pW-qu#VkMhaY6a%J#~iJ~*$D4OZsw^$PPejXd*;HR(Efo?=KX zIiAj#ADsG5bGQ?X3;z`bU!CkmnJavf_g76TRH$NEt1&iOJYsc+bf`J)qGsHra`wvm z+}k|e#dy8SS=b$YKbJ5i&{;9?#My)f{e5QB_uj5GmH3>>XiGA7>;S+w-EBRGQ{Lxp zUvoP_@BvNj4G!$_p=`x#Xk+!wsw;fL2zb7Id~BmWgOB#)$PO^y*QeeA-< zFxU44e|3l0z50sK`b zJ!ZHu8DF7ccZ4tP4_mJld2Ime$#;2o^uD-g9%^0&3+iUX%67t8P{34)wyz-vO-j)lxn_xXDm1~ z&Iv{zM2mUk&4GEqlseEeD6$VSC-HRR4cCj(TLOew>RsrQ?Y9Rk2a0vP-3uu8n9Hu} zkMJ4fMWoxB@%tb@T+rZ|FwES#o<}Hr3DA%T&Qm=oSurPj{wPPM@;i%sXr$QN0WM84UU}B<^cuC+ve0JZ^AF(zN3+Z0SffVs!O1(&YLq8Op}UxudnTW^ ziiDuEF%088_1g`7mehf|MusG6rP>oy)qe03&L;b zD`ddCFutDuw}~NgaMgw_cV6RYy1Q_e4m-m8gM(|DN3YJec4wACe#}()QYYs)wIdmy zGHNH`eL75GS|nqGK0&VdXRPNk&D9MQoet~GX|zI-el51I{PppD0CSs-KkCoRqv|tb zT9?1R+YI-wkLx3#wiRFY=Jmd>{QBGX_{1@gs#Z}_7$%D@WB6Rv*h<3ik#|-|6z+0s z06KRMz6f}MBSIEo-S{gFJazWq33KKBw6^kgaAT6ozRG>nV1n0whU&oLSvBSqEcZNV z`@~orrcb0uq7D4`-nj4h6YslshD14CE^y@Dp?A1ex1Q&X&qbg31}^8W+F$RbZ(irV ziSR>IhV1>bzg~lwTt#UrC{+px?LDtL?Z5TQf1sZDKmU!N4k>A)73a2u=4F^a%4mKR z?y}pagg;TNb(dCYan6>&>5H>A>WZiW)IF!~DIChu?zZ|f8;g!&d~$fl{o&K6Pai*i z1cFx1<`(W?3?sLdt;`<`1w|xAZ!Xv_7b!(v#OvpoJK`uOE?rV!Q8IM&rV9x0evmwCaVD71HLTKT^q8XD zZZ^=FZZIbWt8m9Lbnb(lk3mn4ORiOMiNw8cqy<%;4?Rqr4fOO#CY%Y!MQ6uKrMYUv zD3*0MAm&9)+mDTGzRS=JV38$jL&C&w`vKv_O`$SQJ=#hM_sE(`Csv1^s{$16HUFW^ z*<|y?@TH^c10S@&TTzts$%xY(R3)FHQ7w!wh(M_2x`Atog4B}gy=6ZmL)W??(|%`L zdpdfgQ-6av(^q!L18S%N#I=;rjUU;kGnZ9+sGZZEhat-ng#$Tk1zsLyLI+>i{NmY- z4xpa(E+Li!NbfLXnh-gAia2QvWt7_nECcT8@Zb~GWNxI-Js4jfCCYiOt}$Y3f$hgh zpM=!Zgg#d`41dhkS_>-|FO|2UV*=1k3OrX#H7)`67?g}!``w+86sQ>oG&2=Y22hI5 zLDWJJJ~vO&^-pnEF_#s~mgjvp%#o!>vNp93Cp?fYRbrCg{hRCIXXKR}Qph9z7DyVh zQ4AdyG#StNU>nQ(kgi;=pTC8Sk1b$QByRg>uGI+#B-;S1*81^{@sByzUq;sHlesJu zB_oi^rXS#z7W`l*s&RF&>F~%hBT`-KdsSB!*Rpkh685vL9^1gCTY^9zx=}nMFYgdIC2bXDN zw81oT3RI-+l2-E{m9Zk{V$*MheZGZ9kndQviM&L=*u<)I!+Xw~U;FkyP*41Ke(&cU z1GVQiCo8(K$7&J?9=qMvV-1eSWw4jp9q=!ixuYy$Ol|@HuMzSe!`M5Sq&TxW1Ua@A zJA*tZE5EYyBfl$dsj@-54}mjme8k?r-rzd*Q`MgJ)JLNd(^-wYI>=Y?S3c~~X0MT# zb&t@2fZ>>I(iHxRV&sO^!Fc{4DioNC2u2p=WarC>{Et^}(rwqf+MK8j&%*8Fu`-(h zIgqHO@Nzdk$JaKTmQeN^FbF#*jC#pssiMj-a}#~XonlQfkkcV2DUjl|M0Py9J-^W7 zbODP|6l4}OHDS!20j>;D#%fhQ#s_LHm<7C`E zfEvc@OwJy&n~D@?vQNT>uCz>0@Zh57TbhZidN;ULR9xzvfB$man)F9+1 z4&J-wURi+@t1vXn>V65np`O`LIcO`b!SRW8|6NS*Rs2O!kfYgEWY}{c$l-JGh=j*! zcy6O~m1Irxv06_Cd`AZVB=Qls!`>jqB;S0Agc3t}6;!Cr84oA{xX2 zp-!=+$j2z4v1dIjh^I#YLRNK4N}r3f(W^` z59qdH4vf7(1>vNp!I*Yd>5`s;V-eAnTmo@E8}R_oAZE8x=g#}bzT@S)RIxg5q9gR- z_Y}}qv+A3)uDZtKae^mqTblwX>(^Cax#q!0l5C4=9jvuRS5#atf8ezvU$(ul0-Jh60~ZX71{j3X|(Z zGOjeCTO{AKb=RAG3Y@LRrmw=5UVHQ1-mHI?fTQ$x@U0$KxSq!x_F+M^T6r;Ev&G^^ zPkjI5>*no-%);w4!ezjz0M7D)b1XqC+>A5GwplmSWSK-8)n4zs+mdvCv!qfRj?X#` z-{p^Jr;;y8cx=|bIj#nICGE$PFB^t83L5AugYPa36R9rn3geOQLdnpBV*4zg>u=ke zio1lfo!gc^@VsFs;eGlQ?_ae7eOI`9ZpyauiNEy^e-Z0g8fACD!?iMGmv7rLx@s2_ zZ3QalwnoaqE#~i*1%f!t9-&|8Zt>encQ|D&R1TtnqSU7>vkh;>6EqO6{Idx+N!MLk z=v9)t1fFr^pZR9OqIj}Wr1s+fT7OTCA7+mh-EvcYfbn4#DYHfoWg(+!%^*`p0GotQ ziToSJ6qemfbJOK&*jJw4>45k+H4>GDht3<^tb#GNn=5P)PkP& z5|b7GUHHBm9@DwsT;;sTeN1i8a+0}2z3P(kfh>|WD&j#DnsoB_V2TzLQTdzUl1 z2d;*cQF|>RbfYRjq6PY{S;z9mqJ1oixF`10+L&&zW9;cMiHH#P1MlZ^RZm;*=gIf; zoV8O(K={=DV-fBwH}lwF?g{YcSOt_5btR zX@BH-=Sy5nhx209Eg7vI#8QNC$A?b_>~MOo$*W+%uM{IqZ%&;hm^CI_@0r zZ4qMQ*3$>_`10xg%aw-*;{|@9s4nZsu!GGHUe@k3*6hV@gO4aJ6l_P#a(UPv9N+_8R)Bi=YNyfrE@6H4bC|UiJ@LY`aauXX2k(O( zkB_zdWpl4x8`>$75 zQTA>(ie28^3NbR5YA0?8XKBQ+R@clLb99tw-QJyUDc`!}{dRY{ocEHc=>8G;8Yz9h zJv}_Wyq%7+&aKVTaULYCmBid~##8I(-P%1poTB{RK)6N?U!YXvbyd?tSU0|IUQvVL z#t=r0m7250+$*?^Dy7LgVWVpZ)UNN(xc>#iuZ7dLf1jV)G|m0<3=NZSiaYDP>P5H@ z`MnsU74AcH#%UdkBpYe$|LgY0yR-g%zs?iC>nZOqhT9WO^~5E|Jlp+N6?{%#6E-D- zo87M)W;glu*II%+^NyVf_4#=5QcGKQYt64kG_$xyTW6!mepW7n(B2x|a_HBBq8M{I z{7x^Ej_=Or%>zf0WrmX5$rE#PxZ&da0Td(UfAcUBPJWz!9D@e8hfe(xT+utcVL`^J zUG?=5@K^u6-~VUoiN7nJxD%pS7V`e4l5?3+3Wp~-1Fg@wHR!*1#MN9 zetSLp`$xA8ekTx{W!6>##0RYJ&Uc)h>*c!JZ_lU8cBfjM$D(@M!xH~*muj< z)S5vwNw6#sH0?#B>f!Nldb`jg{f_l9dz6g_-)TZ4J$?YM%-G49N1>9{w&%o?n-?ey zFQ&H;y4`vW?r!BfYCRB`VHsBOePD(?*z#rf-|15~+n%oc>BGaP&o56;lv|%=7UY5{ zERObXbpBZ3RQ1ZZ2a551zZIhrJsh7-FR#a^rz^$&8&&Og-X!eUX$omE)h zqA;}1?n{wDCATS#oAfLTnQA>ryS1WgcF(^Q)yAqO=$jwcfN%{p2Kp;L)`G>wPJoC? zG5%=ntKbH1XdwK2d+Uk)N4&)1$*3D8 zKZCJygMtT$oz0yy&N%>S>kp?%O-&GMjXHY4WMc2lN;hKl)x4_Y>!x@bb2GG)KYjXy z0iatG-?-k*{Y6o?DJf|BB%|E8)9QT~L#X^X z?xPWeNbDPR0fC8651xs!til^kUXal|rs-mg!%IBu7|zB8XYOZTE~o7vk21@s75rh} zZ7$an#Vg!T?YRKbHZrHym~GB4bSyD)XlxE-2FybZb4+2@k?VjLc#v5%c)gc=FJTVo z5}1@edj!1F%plgHf)%|MriwM0^!;}@oLn_2v%da(dGkWI+!4uvWR9%PuNAi9X4s?k za5M8H#?)MxJ)f98%rPnVp?!19_3N>}Ny3EToq=2SPSsS08CS86b&!77Co?R%T#|%q z*AY`Y(X@jna0>#3gp}&Y?_7giro1?8N{67lzV5hgH_~6t6lBo%rR!&F z21W^m_U)7xho`|Vfgn1@8l=d-(9Y@CbC-R;CDS1DaW$OGOx^GO&i|~Q_>cbZ7wDzm z_{KNr(FK)gb!3ZgZBCIv&jr7=7_VPtj%9I$ADyS`L`R(&z(Y@$#iR>8nG(MnIT>UO zMS3{CL(m^+PRB#2b9Ng=vayp;w6nmJxfLKuDej;Sqq%`WglO{^N3 zy;v~op$*hS*8O1QSD&mPrls#Ww>(jpiK;Uzt&s5@g(|afDlU-QnR$@R)9w3?9|hei zf+5R_XJ)|QCD4r|Qv(e$D9`Rc2$Fw}uzdQEL& z)sl7Ks>(g9MxhU5l_j`QIX#^z+k{@bg2*bt(Om-GD)yxYE)|mJW8uqS3hsWg0_^3y(&gqgG5&G4*1sip(wb(F z^^?RH350hsPNe6i(Xu;E3XueD>DB$6ASS>fakHq8jaSjMnYa_yw7Q-WVX#S}j9;#* z@$U+*>RF#S1~I+@ ztwAH4nH6ywBLTeh>Fokx+VHG#i$E0;E+K zZ&QHrad4>F89xGkOg!I}9zT~8eV^ZW%@Tfm%>(bW&Jc5xXdNX(Vw#k_|0ILQws-v6 zHpojfAsloQI#+(S*1Ed)3gCW8{`zHAag2h=V79yowIK{zbv(0v=f)92 z)3Wn{m6t0rK)-7R;_|ZkWNknb?PRD=OS?{_E}NF8>w2=sqx0x|iRxC{+cU{Ak|(WViLpj!OLEp*&zf_E zbwEr2)pEY&+ulFdy^9;}*#D5sm_0EA?o&T4ob_rBEwcFJdfh(K7p2v(64T;pA>e58 z=tjwjTbB1=zA3F0umC8idY#ja&P^f3G2w!(T@A3qC`sMKn>tr`FwLM6s0E&jsNKA0 z6O~#b>x^IPE29OaooZkSl2BJ*(UD}luIyC$&Agz%brD7{bG!NVoY7_now>0C$V+R6 zK|K+ioD^7|z@ebqT5NEen+96vn_S;&1FL!4&I^eKB6womr+#gKt#SBbeGL?Nz2v0@ z{BGkgH$8+p<~=!&7VinYB*e&;6Yr!dQ`{}>!W`c=&~EV6a)wgm$>(BBEKg9YFEw!mb+}Hn{D#Zj_-Jo@|jl{ZADFxUMG zNdk&h@MGrt0G$u7N93gbJMJNW+mIDG*G08yll-AW zr*%AOzYEq*C{mg!2)ZvB*Drbk_Xn_0Rn24l7-OqiY;RP!t^(_GEr-sbFsm_IS%tBF zfc<~tqGgLOYZ2bW0l-4JF#)Y%p6ZWc8dXVDPmc9vd8f|e;N`<(LO>rKvBXu(eX3@< z!Xl&*-54Tt2|Vd8X;|R*6uXEs=~l4%#*DUwTw2>N z;uVZ|vxMhg@x2gs(3>zs*~+SNf?B8=0S59S;3fy(NtdpI#gL10G)()GV`9cGcnw4E zJ1UbU)v;ZjVy78iy~ue-oW3x&b1`ErEe}Dyq}J~gL?35i!zbhQ#w<;Ca#AlO1&bUo z!<5mYmGdk(kBCH>!fYZ>8Cw$$D+Z-ZGLW~aYOh`N9K|rn2vM{EyG&kV!(Vk__-?V( z(~U-MRuk5J2799xUOV;pJ&DdtTK_C!&AOn~>bLKv6TCV%0c#!Yz)&{+zc(+4uheIf zdM~S^=<4|ktih+SJGrM#4M7%FyYm&pd3?2fNV_zmYL-C6a&PKJwKJ`icb*K|5BMS| zP4i`wX9X@@Bk#Ef6H-ho?~~nT7P_or-CMBCIk#a&8c`7z-3_SnA&ld3t2|AsON(ws z0G5)o6j5IXrvT5pVOyFa>;owV%W`AXI$bB*;VoYewAi|yFC*F?|Gs0usMnAyBDVhQ zU;gfGOo~}I8mrbhqfC}qCJMbNrtTQjaE*Malr+;=Wb%?u9wy&RuQvg_?NDE@7o;^z zt-m24WmRg!-+RDonOy6CrF${(7vmoF7|=`B_PH5@;k>lyC*;1rNVi716to-22-5X$ zEjxiDDTnROW_n0JV4C^#GJE=#qYrmuBzMipvhd!$(-u!)j1T;GP{I~dVO6s`)Jd@= z#GC4b46kv2^6!5K9mV;4n=o%RS&1yhMvP$O1SLma5N2x00LN-~{O)kpN)hw`2@$#r zOyyd{Kg;E}+5BWH>g4EgM$?n!$8atiFVt(0o|Mn+4Agjk9q~BYoYck&Vpki_j_*ru zgJBv+#&QGW4d+Vnb-W(0*LhUoh%GZEYKg>z)#@u&25I7K!(8QvCUVcfkUxEZ;3XsN zbtT)hiiZ~NvYHz^%RJ_}m%fPx3QgBUH=L4R47rdk1sNj1!s9x~X>@H0)e-Hx>)`4R zL5bF-@&u)-1SYaXp2CAzXm`nZmqY*75| zt)&y$V^n%j-uKjE%B+0wb~$5K9#BotEW>0UFi9=J?x>` zG@dW*b|6p8b3kp*s2AMKQg|2HFR$jx(SJn5P1n?|yfnArq5rMN+ULN#1;22LS|?YX zf9WN`$PZh%*V|p*F2|?i+w+_0YXaA2`D#TeDTHizxu()j~~(C=+n@? z4|37K(HmW|XgmuDcP+1R2{B9X@~`lz_&t5fwR`9}R~X3a$@t<)_>m%pv)T5S^T=57 zb5(oppn0Ovm=5s9CSfVf%Y{No=(^(`al$=~ZW%2&Xu-3*+FVt#mf-av=0^O@Rg)&o zdL9)wl#P3h@5{nr0UM7hA6hDoRd!PdPaIFT)Rx+c1v6Z3)6{SWmG-VuYqXW%qYu6B z-rV^@T=0!Xn11w{z3M-GQv>L-j&5(_Grh>>cIVu`XZ*?Ys*iT_C-r%_oj}2BP`pI{aGe>O?mp zQq}#D)1TfFQ19!o+s zsYk50tfK6jb8_?5$a*d2iEn;9s9(isB0kp!go{%WS3WynciTG);ye33Hs_^ob$#@H zU3dbL`};m=G1fhCY8PkXw(l92WHk&;Oq)6YPS;uFRI&b>{Z28BGS8TtG5z&CW#=&~ z3`%;LOW>W?`L*56eSF)-d9L<)kLVYftpphj$1ppWMoV)~kI2=QF@qk5Xd~V)F;a^J zXLB&VZPtIRaaA(rX!t{|9I`K@NK0x?7mjo{s2ODG3}tr4+tcZ7OHOpW4E<)FSe2IC zq~w%b(ie34;49y)cr2Zti~UykvIh>A>G#ZYZMl*`L9><|L)J12KmLu34rAKSU=Tx(USH6W3r zAn2qx5(4)HGn5#cT~O<~LMu&cauU{T1uC_|v~y*s@kMq^m1GJZW<$mAg&VZFn+=6v zQIy`V9yG|UTxOG4_8DT{8-}*s;L{3tsCeV8w8*Ol>&ef)?(MSu)o=Zgdg6cjC%=j; zWPjK)Kku;h!X3Z$)v=&-iDaI-ECl~$DK{87l*VAKJM^Dut)Aaru~}QubM8%3 z?DMPg#VN7w8q7Bx;k;deD+gXR?OWsjsgf-p_=7rQFHp<;^U4VL3qfbAjE)u+4A|u)H6)zt1MU3tg>nckP!Fw*WhuaWt2yh81W4xZ zu%}F7yVrGYRzG0`SljuU*t7D#fVV*SQ)fwK@Z*b>4P)K@{zU6)H#MVe$~#r}n?5lE zEsepiat&gyLJ@wIrg-r`-rRdnT%_iiRUe_;{|R!+VuUoDQ&E*)eWMtV-F#F1vH2qY z;=jNdCz(DIo~hTPJY703hb`QyjGk*TJL|fh?>m^PKh7hHPRnTS)r3jp|0+@UTZip8LUvC$6)Y z{?|YG6*o5;#R%h#(U{8jI>#8K7adn9;cbFwvz8zPtBg%AReN>@Q!d+nI9)H>&8}+S zNN3(J3#o&g*y2y(V3;yj*yZJ&U@&?b{P<>au#aI!-{X7bI!Cke3k8No4v#hv%(OU( zhskK~{QT?b>EZG9^ac&14QBYf2g2*sYa6Dc>joE33|Uue?JBA9Y&S zR<`uJT76V1>hga-8?crKa2DMRd#E?3Hlrz>j=l?6y$-s;1iXK(Zy`RHDal$?mOF)S*vO4mdJIAt`2 z3Xee%F`Pr;bzH)c%)6u2rZ~5xSi91kBjntEE_Bh#+}wF$y%V8NTr2M7*^A(rGo=`+pJIlGbcJF}^K?b#E-g*LmV%UFVx%H(qo6-TB;D z`S8l@C1r^4U_fNksj3><1(j|rFQH(cbDn1A>SmJZE}7` zx*iHo505XWm;GiBl?zO-8Yx8Uw^Jr7x&?}sN1YD4^Yygf9xmf~x7jbH7Jyv@X0W*i zzTXD&1zZ{JvJmau??k^@?Dj?PR`RCi#DDs~ecQLG6a+TlK6b5cU$g9%d!ggiuI><4 zmT!5kB!Mgg9t3FC(g_#kskyg_zg*Vjn_X)`3cXLO!yukm&sE)R!4o&{wM_gZI1fx? zH2Owm6}$1WPAeXv;B}|KZ>z2Q`epkH6%nE(^zz?1U^hqW{sl|Ge#c+Rnz|DTo6Swt zdea3=W>|lH#v+@W&y6QPTqxi!%Ad=|KjvIhJ!^#<=!%s&zQK)wNcPb+7GSh;t)}o1 zorR}l9DvqF(ZSs3z$R}LA*Ds0&a}E_;~9%Px#3TD9{lR_8;w`AfKMKmm1#5POhe5I zv#WuA67Y!jFXR^7tXpX?Ny2WHc~Ip|2`|7{KwaREmJ083vSyaCD0FRP<|xMh>eDBB zL?vLck0??E?vyA3eFGJ%K}3%sE~pzN%tljuldQ0uYx;}bh8f#irc%skIsSa2YQa zRlsSg`UE#=07rO@A}CvfZaMC!30AAx9}aEFIn~;d)lh5o-a%Wy_OZs?>-pj7`26|R zbRf3A|Eqt2jJmwP9VN2NZJt-Nwz%WKOk3vLVk#Ghv!7qT{Gl(t`u-<+e0w3Mz7fIN zW*L`$+f%wT>;`&7$e6<1ZZA?c65gpEz}tzEibK zJ@LQ!SHIC%Y}f)dE}A=%_ZPE1$!|vCi7f)n@2mW#R3UnIdsc$p2*kfvxWA1UBiB`I z+yZ(?IcZiw=Xnw?T@(0Ah;WxBst4397+u$D6Fd1bxU?e1CVt-{D5SVqvvhKyC462M?k*>Gs8gCu2?AHr;Pd{!RGO zNaBRKN%V;MQSt(w;ggHa0fpvxVJw#4mz(upZ9Cy#Dz__iD|yzb(3iOrV>&xr3VV9= z+-1{Mp-mf`p*YM{n6mi2?r!d*7hPqJFMlG(={}W3CRuHVje{%<-rTF|8Xt7729WoX zckbR>H;_O$Dt|q{9(ViKv*va@6L-3ro^91hF335$&620hup{FLE+ZeS`AYHl>*)&^|1{Dg zYZcKQ5pFbiSwMtUEOy8dV;{5)@HgjPb~XW`7=+W2Xx{6&*{(XqM!y}nhVmtV)3(S< zzgois+32ho@|0I;nF}z(j=ZJ&OQ}303mF#9@72i+_|7rsohbebYdJ?OdepVPpMiM0 z?CYA1KzkQgcm)@T&qas3$)6JS1F&d0tNInPK$NCkgRf768>M9Mpk(umd!trrL#NC` ztE|5z5DRfmah+JDR#nv~6ljrUUgaGOex**)G1B}z@H#DK!O8yu~MBW>kUyYWxfW5TRY?>9+jsg}oL=um>$N9TgqWbP|s>;L?- zU-#JDJKi_v&3{;6i)%|VqHfTy2OVIIP_zmc<}&6=jgU={z;N;#DVhYPgPPJck3M`} zJ&l3glVKvFFY$_>=eRZPkV|gDpRBFt${XdZpXiwCY~vHcpWn_nlYi>&tL5k}_#NtP zE^iLCO2pAuyJq=ZF4Um=d$aI<4uv4Zh+pqpN0@6|9Q`Gih&8>r&b##y+a&nsI1toN zvd8{z5oBz5?*-vVo$Q<%!Mz`W7x6Q-0+Hth7@5|lEiH?Ruy1S{?s=@p_PqE=P>RQS zg}cgfsoxsWXA>%o8jr50y6QxokR-*(sdB!<_vIZpF-Z?+iHoZ|!$x)(bT7Kr`pR6mpMAPw$~706-!9}_VW~OG7e*hZyK~{|?)CI3;(V(s zN`}}#_inSEBdbQrhKsnyR;pYBu3gciBb+yK2Hl*wiLeB;crpsDLNXAe>8QJ&vj*Zk zslFcr`ZP1{Iyu`9Q|hwKiXTMg1#^7y47cG+_Oi$9ns*A89{f1yf~3{Nmk9CoGRev} zi`pwTLz2mR$$cDnhbhj)U8I@9dQ7eZf0l*|g-|HZ(lehwy&R6a@jAPD{4!BywwcF; z@-wKYGXG*|>6w1hK}9@^w5K;Rlca&|(8EuI3+{$K+>6HQC1mK85lZ{x%I75|o099{ z%arwA#1@|KPn_S2%_En(%T&*APFI)ulcy+-W zxCm3wFK^2Bw|?^^thb~8^rES8uy>mZkLyBr&OR)k4a!mnD-^_)iMtEJFy zsJz}%0WV8+4=pDjR~9$eNt0z;38mEHW^RkAiZbVrJN^5+JJFgC1Ko60S&w(iv zKPXN)rQ^ym-SL1?de|I7Ea~Dk)Qgeq{Jj`y@dXZCSb! zU?#y6?QFJ^Jpb|K<+JqHub6qY?FWC&VDsSYQ&zF05Y=sjV!!p^3>8TK7R_z>F2`@0 zQi_F?c=v(Djo&DCAMJUIR|>Zi&;pRSke$%dz_`y6L2J&zr2;7nmqoR@yqkdikI2cd z1Rh0*kBq; z5&JhW+n)2+j{8l_Ih(j*u{)nnhr>~3>F{hWsU-_ITw~gf=(JpCtZJyZk z9w?1lATr#%K6>K#d>aHZqlXq_W+x(^cU5T(!EQ#XBju1>XO=+2f&LjVABJ;&VE#0C z(sZ?Bn42!=j+ih=2R9zvHD>-Kk0cvZ)zfF~Ah_BDkY) zzVLjc^Mfjr{ZGAsR(gXa^CZhq5aG7>ic3rFD`G<-b@G(HTUg z^0Q;tY7sYsnCtCL_>|Ibi1%14Iq1VRD@-^>2ll4fq+cg|drG6~|NQ%V;hiQmoLYwiqU{Bq9UiiScp#{+OlB<2}3|Ry5<^t>-;AqAP?I zLjlk+$^TxjPj~aD-8iB&7w1*?@&h}F&w~Ge?e0wr%;%>L2HNNNwQIFMV!t!P_;lVs z9N(T_9zO7_C(77LgA{ELWnt;e})u9c+yOMs+sANe}PM_SUi><-J!)ye zR4w5}e1Gn2R$gQCcb#*A=Q%|Sb9~+I{blX{zpU5OPcO6nKve=>!Cj_zvi)4QEjS&Q zoAb4-XMB0mh4s<#Ha2g*YY$cJ@?ZbUJ5Sv9o?NfYQ_<*v)BMfm#IgXDrzOJ-X3QYM zd{DlKMYBWKUg1K=uEKh)+oC6sk)z`69Sb1J-IH`by7HcTZ844`A_a1dTW^j{v&NEm z<^;nk{e#Wt*O$iw6KT*F;njex4x@{?UGy#sn9FOkL;RhW%p2OiROD3)_^V$kFII*D z3{|Fgj|G| z$~Gz`ZBV+vj+)EtSXtk!9#fO6#^wg5TG+9>#pakEk97na*>V3OmOm&WuN1d=Vkqd+}uxzGLZcmOejL$UrHzNUj>0M5cr z8-fDVzx(U=%=Vt5c*Qo%pGJ^}_rd9gDFlibxtEs{m-jdYunb4$2)sT$KGGv2t~p-k zxU>@`-d>pQGQYV2j$tt!L{G4=jP4y{(e-8r;>Q~tH&x|#J#lmxH?RK-p7$D6%#}sT z+G-(7y!%qMy7R<{#spepC1NWVv&qJ=itWZr{m^lABv%f^wni1Qa@$s14kKIVvXAyN z%wI=1d)yzYSk0iNW`wiWK%{F>XqAiP)I4~)IOf^$89rAHIj$3pdQ;!?dA+_rarpeb;R4Wf1ZglM9Iz)W}kLqr8EN0U)7=kW>fK0nT_})KPPyB!U zi|C01hV#xUVK1VeI$o~KEIgf^AKZb*d1gVo^GOeXFM336;HSpp}!`?=K*uJO$XA%Ls4)Zdxsom&S!eSvS1is42Xahqk-9Z2a7Gn!BLmsxD{EkpRT7 zS^uQ9v>x(HyliQL=T5gNi~g18myOP~1@;;ELuj|6GEua!V`h#I=hz#6G4jio^*m-? zx0#OzU4p!Ra#;WqoC~R~{cgDC0O|=V*ECRFULgk7OcgxdTHDp;`Tw|k*QVRDt2}J3 z``+*6oYPIK0=V)eRr%nb5j#l{3xw1NAp}BTfz-O73y}ka1Y-wd;<6KAzzAd^6eC4( zrTD-PN>K?Pf-Zf|c`y62t{G!IbBsCGTr8U@9ptaHZ^S+I)1u8Fud;OmX1sR<63k~R%m6TX+e&^ z4Rb|FUF=C4v(mTF(iFVYF~cgpyD2BEuF7?I3rd}V6z3!ekC#~g(vb0QYCL2$oF&k| z1o34t|1=La|9HyY*FS4N_;SuaZ#ap<^>5y3f8yj5|LQ+_9W|7_V~`l+6&9YQWd1p` zGPL_<=lkaNZFJrnC0oEPwOj!bfDYxrOLKt^7(?U&j4o!OLURP8EVysP(;AfJG49VL zV-#;>34oM-d(Q?ey_~sXQ>T28Qjp*X>fkPot{wniDKx!pC!Ex2rsWPkQV2VUvj~DH zGs_TL{ag?w(rLd;6uIwq7gELBZ0dsvTsh8025G)MDTEf%Kj(RI|G{(#IL zXPyO7lSI>sEGby&np(yCFm!?IfJq$Cw!cf{+yy^j@F=U-%$4&CwzjPnR5!i-@gy2;e!OjNh=f^vKL^%i8dg2HaDKy-M%#ag zwDmp)lPeUZ*UrJt7iX4JY(@jqE+U`Ry!+=YW;0)$5BbC|(8O=wC$>EFpoMVJw=PnK z*keqrQ)JlE#Mlw7)^`;V!W}`2z_(irpi>T}i~ZHYXKHp3`r=FND)~|7n1gb?)H?Vv zHnf|}Cu7wstp2DOGm2lVB957hpKT#otLudvE41`ubR1_hqd`|ondhT}0peFM()*N= zNLU&R!n4AWw_g8_1M7P^K6CxoA%9}OcDXe}aW6o`F(x77b$?~UikHG8gkS{6YHZ)1 z_`m(kk1jN^8E)(C5$hN8*kQx|nxXL_U4(X(!SWJzx*;nV#Yf_)ZwIOGj93y=Z$4ls zH%Yc+kLC)pm{_Qd0|aSQ0O_Z}u;*GD8;i=qp;<`S!5DGH3ml|%$M?J zTnnR;BxG7#p>U4@YQ}lPxx2{R#3Cl#*YNp!nY9cVW`*F3HDjyD-cvwD%j96gd3DuK zUAl{D*6+4bc2bLn`!oP)K$gD{Zh3pWF1h9Sd~)+M8*gLm9d~4ySTk$p#%u87Sy>h{ zjyVfO+GENU{Un!DcphN$3G8WRE*LBGGpiT37u<+-6xxu|NfQ@ITS#DLkyoxZ&l40K zVwyPm&5p&>uQA)9_8{OvblkOb@IJR?;w!BSf9C4K$?K&7P!Ew4>i&d+ALJ@9!x}+QqyRjoMkaF$u_1_UIexhhTdnFt18uA+GH-U@wTqcv7fZ$JBKux z#?xTFpveIvpE>vET>FdLd+r#A{{OE3@8)=mZP-#V6V{*8-Y3U$>d%jJEFii5CInOnp`$6tE%18;->i=r;sSDS#ufp%`A2PeCgOa$k&_>Td0Br`Qp; zEwiM?U?uqGu~|Y=WU{1Uz@)OCJZfhz#HbvL6%*orXQ&v46WPg=aTauWYbyz#|p95ni#WGW|3yW;0CpF zU@axc>bq-sxA+qz%jVbP$b31UbrH9&$Knc3CvMJGjT;s>{gAQG8Y_wEUI2F*QI+fPbTGD0?+llX1N?4dOg&I=B z9&z>Ag^6s4>Bjn}YBNM;^6J`M-JDv^e0M{S&lkJ>{qb;p$t3vuW(Q3vJC|c2Qa^o< zx@USf#1`Ix>&E!YfaVH1rcyetCgd#K<# zuIR`k`vDKgQl)cXm0a+~t1H9+@n~`LBck6Sb$f+a(PERN|8m_4vI)@XFUemh(V531 z!KHByG*9Ch$@AC;EsOc-7`jOe6_Yetpoh)foX*vbS)k?K zx5dg@1)8>)^o3!$Yq7AX!V1ddym-vPH4<3A?6}zhAq4Lh_>lgz>cJLORG1a!+pkMQ zy;U2vh+$3&UO&_G6Q&5MfdOwrykB8A$c2#+7+nrk6rt?~^b(G&&i1=AmIZ&az@4Qs zl|gOcpz_pTZ6PbLS88~8Zx$9Z=#%{}htMU2_4x7QZ@tMqnmmDGw3?^h?}A)`7g+z0 z>=v+cz9s;->B$bt8eeF&Xs=L5JEvh>GZ$LSUGuKRYSCSg==y>a@f*G`*2552KJ64? zbjioA$2(J#p3dBbrtLxz7Z`_Cr4KYI9;=6LcGdme@$r-EXHRb)J-#AekYgmqeWm~+ z?-)QXS$>X9gi};+H1p(ZawEn28;b{=P6y*j)&T4T=nYaN#-D6?aU5S@UpwuW%-7S$ zP-MQzoh0l@-Un4R&$DX$!;we5U;Vu!9`9N0v2`=Jj)_cj{*CqA`d z)-~0XVn12K(B!Q`J_pB5k)qJ~Y+q!~`}cAwNwE3v`dx4G#7qG`mGHMAqkK2-x4pSO zOYQ83<&F6<#PTA!5F~c;(0ISjeLmjyPOqJnu@Y>g<-Bd{;ZHDC&CH#&!!2sb9f+ z<)4dXzuxjk{havws$HLHvSBy9XLugvyiSf`J2^1toEw%fS}O%?r!3|&Vy6V0tzaD- z^`dPaL)%&(YZ5>)HXt)($K!L!<2Km5S>cNeJ`|QY0tz2Hi7*P~!A|GbO^c{Z^mUGR zyXJ!P+3xsWaS~mZT5Ym9d$qT`Q3O2+SR?wWWn){tn$>Xvt2|TEy`xF-$L+Z%A+GmT zX@A!B^YVhm(CMYN$LP9F>%UW7cwI(}v7fg|^PTJQOpdRGRW{ppghsyk=9}O5ecwm# z^qD=djDHvPwFuZ^A1&g&m`PY{=Cwp0bXVE@UtaFfPa5DO5#NP9FNas?&HFJmX~%J2 z2p#i%?XPTAtmiW;GxNGU=A1l!m9Y`d7ODUA^%L*`#DYd)^;cgx z=7Y&6KAl=LHUP+uKJ)xc!Bmc4C%rZowlNff`_3|~*w?v|Yo_O}`)hN&-=`iYVZQ!)U-9EetAfa=VfRU_R=gzSj78_ z=5%a1gDBbJnBKBFzk6hJ!3~t^p?TX2+Yy%CshwfMEB?bn=&(iS0M#6G_C8zsaVKQyyZVL6 zLg=mQ8@-q}_s<#bWOA=^-mf<87);nc40ru(nEa0`HZUgD2l9#Do79N|=<;>nW7LxAEKr8%Y`*E?J zRfwRbwly)Tb(|?rTu3>%)qrJEPua}5b<7Z+q#coWFDyhK=k45E{t3VCg;XXq>+5<= zQ%HV4nwqzem-U`9ak)9(FzV~$3(V)_>LX9C-|DDX(8YMNFu`u4ZK4JArPf+MUAE;}$PL)kiS?L*cnswXTSl*yyv5 zr9pJRWRCFtKEGopC&ip#ip9trGqmQ}(DlGD+w=9tM5leD`APMuou&6#!NTUvnuR*F z7Ji1kf5_O~Tvz6RHS>P(Lzu-pFeZuuS2N<}Smyd4Lp5?F$)#hxMvpO=w;CT8&p6uk zW5qVwkJ&w?GXWOFZYBetuySY=$SGffsI&k$mpHg=>~z33NV zBJg!yT%FE`N<4L%C_cWE``uq2nA;1WGX^{C>*oGseVS_v{YmgMaj!7+*j2@Ny*RI9 zPAYkDb*^3$$1iSa;z6nDuJ*~6-`q3!uG>*DLGps~>DJ`8+MfBJ?+y~kIvmhDg=V0Ws$%j=_q)sE>E0~v zg`|Kc&SPDBZCGxYgCQ^d{aPPxVVPj|H}j3)D_}b@{N&~-3)81hNfffNr5>&MA|}q_ z_~*}GdG+zLXU{A^>U}bvXUPy_UtC;VS??MrWTV>l^_o~?RsvyxN_K->|5U@$o1`n6#U36#dW3*~r+vYjRlRapxed16*5jcU2CZ-QJ~#I}S1M5705Ml= zv*%stT@`?pfLgvb?XOo}vHgW$dc&KRM6bRbFW>tE@@J*;W6#>C$KNUz z+TA?klqWl;MLgerjtyUZJ26L6f8Vh^U-JgLMe;)I{To`uF>8{Ii~a2T=LAjbqKG^z zD)RE{J!fG#CUIf;KxQQI1(7o0m-pJq+- zX6sIdEQJv%XN$fvqt=`!VQRp9P(JgqH5(aVVvi*zpIC%);Q;G~Th71hl z_l2DYKZh$sVA*@#Dt}J4zpxbFay%kB{(enQS-NMw-_!Z+xf{*^%G>0jtIsY>u6jL) zC9yHy*Asv8Ge3ezp>2;r89ULZ7C&rUQPn)x2tgLbwhIxo%6f_gjU$&k)WgZPlsHU$ z)RSuTYz*^6X_ikZzne+7wrn)~^V)~jb+c}Dpnn}F!@TYHY-Q7?f*Ok!*-3=pnYpgW zC#&+J8)NZ%)9jDr6Vv9=iQ;8%qSW&&G_hT$g@9z<;`1G8J>=P$x7ohenn+o!_mvWME-AWV zJ#K~`J6wY{Msf_9|J@OrHEMdT)ZB2|hJ67llZ@pJFV@+BQ_C%uo?$ zAuR9vBH+2G%PdyhSd}YKsplL(a{VdPW&wZ06|eKDHa`~7wta2+QB&%JQ~@Cujv^fJ z2N?4jBddqj-lvd?@-v4O!e^5nrZ`8zK`k(=h6y+ISvp3MLIa^bL+SV6mjQ1x-wrAc5OU!NUUKo5E}cud93mX1Y$^aGO0p6S9TFRDNgzp_2G1k&$o_= zp+#&Xt}Co(QG3Y8zvCV6pm#F$@K>mrHJ6t8h-UPdCEqd)U*?uv#TDTG~Tu-Td?1Fjf@i?wOuE-{mWT~!lX zq_K4MZG!!iP_`?mKzlfJ@e7khWvASMY{id@xmMB5F~2(wQ`E!RA5E>HKImky6^AFhP}SMxw$0U^Kd8y z87@B>7Qb%M^0`u+aask{#44!gDol<{L#j_zo4Q9}d@8O-q)> z`vAMI3kO7~V3pINe{Jo$IpxYLj*z3(wbx}ecDVkDp-F8I{s1X162fl9a~Otzl(ct1 zO~Z|j!w7Cbga{3MJqVRYO!X;xx^n%jgy{MoKYq-ju&U9i-dkE;Vpd9rmn@9Dq7Qe+ zL#p=`kvfPhog*A`pLgVw9L`=z@T_*DpMN}G6E)UQ)dB|S5YOg|`~;KLWlS-II%9-P zkN1aiUTodDKI;sFDGEy=S?s59wFALbb!V==*2@!TI?P1b=;g+2e?@()6sH^7e3F$0G45*?MYk0{e;>0=k1|q5{aq^I?Ph+sqIDDDc&;#5S-%{?6jNX!(;(<~)}=(O0LONIg55PD9a zkG;J!w*cdbX3+vDbLo2;I|S2b=)Zwk63g^1r9QYGSXhNT7={gGiKWX$7ZsgO;+R)N zWK0VhYy?-#l<1RG6KBlOGRSk&g^q?x+_4qyV)%&^2Df3gG0pLowlZx#-8_rs8Bz&> z`8ra)%D{TRIbkjURnPf;=_aJBJ#qA0US1szG8IPCgL!rCSCC-M>Wqa0l= ziuJ5CkJi82TD5hHUVUb}?3A}T_N8{&TyN%@8nf`Ytq1dNeTaAgUVCV~VW)fLS%c81 zw4`>>`r}&py0OOx?bdAge_PVFzXq*NR)&LVQd!D#E}whBD?sMc4AV?vw#TXY@gI95 zYT}Q5?7xEN$8KalftWWikCVC)gqZL~r*rT(Ro?gG?B$;qrFT>hVaxJpZ8N^m7^MZV`N<)!s zLs>I2&GuDVXLdUKa&orL&VA=?L-(v0JIW%#+*~nEP;e`8D?_qF>n@&T)DFo-SyL@+Q?54@cGs!P@bZr)1uI3zD z59|VZaK)IB_AP7;WD;8)+OgV|-KnQ{j!6{T;hA8$6`jL4|7^TvxvRT1B^0y}rE*04 zJSQE(Z>5owV@gqz4Ij~zJnXWYib$k!gB5(ZAdyHdG@ZLu6EA#pF zXOq^4%nIBdksoT;)|HlIjFB#4%2KT=9?~ExUSj~P7|<&zQ`Q^4-#V3on1ADe1LL^7 zJQIJ@Jeob5sCi&ua-2{P4SqWoOg!hbJy_}*>An!MrsqrZQ%Q`31Q|1ANo8bnKGQ~$ zzSkM|mqqLED%KH#ois)!+H=ChPUGOJ!jkc%B_GKr!$ze!2fr@)6Qru?oqP*KXy`nx z_D?lJKG?IJt7oP6{T0`t;)nPQU2B0R^tKuuWuW%JW57+$6GOYMzcPvY zF4f~c);ijjJRVkWyM(=rnAkAoE)^jC*sTM4p%8{8?cpL)Nj5m;zqOoA8ArpuF<%Eq-n^MEGazvn$4 zj+*!*Z~T4B>>}xnsfnisdPskTpD~G;oarwZ)Np2(|BNJjaHwE(?vtyH*f#BM!P&C* zR2s=Z=X(&b7+UxLi8rii&smn3-)DCy-qq}G;U}gUahiBjwJcTOG+Bc`_SgyyS(EKw zMVt5L_TC`!u-v;Ybpq+6J1N#vE7g<7bL!JcS7pc-tNQ4)W$*f`G6%|9Er_k^sW7Xa znoa4}?Q;Tm>y@wAtm1LGeu)a+U0z<(d(-Su6~<9~>B}T^eIbS(vs90Gba^$wg5dbx z*B6Q=jxcP0nJ!eDS!Og#bTo8HvHBT(?0O6%Y7~a0 z5To)+czy@q5}gNR7t;WWyClTBHlcaX=gv5ooW$=emTU55%u;^K=eg+tFlBMU$$qjF z=^ec(fr=u@ay;E%?61gGqR;%5V35XHeqGu&(4~^)bOJXEcNZ3#7t^@eJnrrFs{y=& zc6weod^Z2Pc@La?^0dGy(SX_wCa0!X7{E2fIUXtFu*=Li1k^7<$Pj6V+_1`TtBVGQtENhJf_yB3+6J>%-r1F z)=E6A>y59?GOvbv$ff_TmC$hH;B?Hij&wa9rX7#M>Q7LPoE`_Dg06G_Whov5Dvz-783Xx{yu2hEZHzSp6J$ ziOV_ftGDbH@3~W~FV@8I^R(>~KlI|j_2z4Z2*YSF=8F$Dfs+zUhx8}X3j5vV?cMY1 zE2bo*&vYcOQXL_B(RhqKW2beq?J8~dpze`NE3ggL_fn^Lxb^2J!AKftSMLv}`^){+ zy=kC1H}7JGb5}T!>l8!$-Jg!v7nk(Dt5TO)tAkAWr>15A*FM%&(~;P5rN$VNd z*Hc&yI9E7Nrij8(o6l#`d(i?X9?8XjntIct((NjKrgyUU&u0=hq{c`LN!?^ouJg6# zoRy9bIsSAJypMZI98$&R_-TmD8_kMQ#H-}w_l(hJ5-CwyY>fUO^IRDg7sf}(ORLw! zd}?H+@Cwr2Ed{WstFE-8&fu`tdngcm)YA#_zNru;sa5eEoI9*M{DJi~F4Bkj+-9tsgJ$9*~-OveF*t=5C5+rmCjqT|fLG%@hCP4`GF|H3!@OJnQeh z626m-KVXw|v2Iv|rDQ>TRcjuV)8+m`U@tP!RXr#d59c;wbLKMx@w+zD;;6ND$+oCJ zUVP`XYtPiSSk(xbwSk|DIb10jj<(pcwRfM4?gb6SUjBa zGI2{S>M7}2v-frz`FG4e8ztgu^}8Z;cvZw)M!y1=@rp}CQF!O;R71h5jVZIb-XJ0d zf@Xq`D@d-wd|&I~tzTKf!o8)Ul4wAeNjtvwkJtImVP0+GVfmH^O~S6946_}55g~8s zBky#gW{h>@Q&z6(R-^KEa6G?#498$xc!ev$TKdExB0u0uS$;QLb-TlZ=;VpOiR@iB zq(KW{ERP<|O7Rhmx-#}It7`~7l_#;#DEh?nzP6SjMkW;#OS3^| zrR=loS>@rFbBFs?tB=L2s7!@7EWuAQKP|1pW&ny<>&S)OWpsH5>Hf==Y&nq6Q{;r| z#J9djy}0D~V+^C-MPD2upzTh%!nlm<2R?M^>Lw$VX(@e?^Q?FEln~$SIn~?(kGyjf zji9EJ&sL?Db4quxvos<7)`It#ZnShXQibwRX8Lf$9B{;ysYN1|GKue3l$S4d@r%v} zYfDa)CCz{8d=B^Jh2v*MGG5b9n#Z;KjlOtRf(z-{vuCfq`YOF&KZ-&YJ~4ct=oJe(*MLjth6NgL4hk5_q zOYOfqY>l_rkHMWF$1>r}fy(F@xQzfAA1k zgaS|QuODZ)+@ileTPK%E?T9w`_J~;ZM%K z=r!>tKK&2!RM#bNZDn!^A!`s_C4*17G84v7L^Ii!SC?fG#%0~r)N@88 zNYT4i(KwiH9<{=@o4?W!i!qbF;)Ldy9o|>Hz*ykQOf1d0LlD}(XCu&ZrCDUK&Vq73 zMR9yMGr|zy5rKfBV~mjx6v|0t^K8o$45J>Yktx0S=8bH+rpeBjC%<_|g={@6_=V*T zGTy^Q3%m|Cg+9$Yr~|>_;U^|}i&QV$+Wm5~CB^yU>xla_ zB#du}8RwFb)r@vNxAZ=Cg0?-kkugo!&Pnw`9FHMK{Wr2}*lZdSkNLTqXURwLeOR$C zA{=Z=WI@{V4HcpCx&pmdyK z#!Y6vogul-uFE*?3w78AQiHOz=Sw2qD^VM-F}BHDHn!yj3J~+4i|fb!3gX1`HWB4*HbLk17I1te&Topz{|2iwPCb|ePN4A z!G#)HSNFWgZ=9MR{gI!In)nw#`@?qWV4ot0j{+7#KIH%=va#=|-f*DINWmq9wW zb3OO~#M=H^Z1fFGKJ>=g@HU;#GNj_*cmYs4f}P-c`xJYtwlBm`UOHQQ>RX+39wiVn+~*WAC+hY{@Xob2GT#cR)I(> z@bdQd`J+cqg!lMTa9c~hT!1<)#OE=?7AP)OJ$9_Hr`3MdQTU=4R+WTx>3T+?s={*~ zSwJ3w8w(Pd&dza2nGaNGGY`84e1=klkA;A6WN0da9lz9GTV`bz^FGIeBW-B4-?MpU zo$@VvPAd}&i~B9LNrnZe@w*`hd)Kn2+#5znpE1YZG}4YcNkJVq?!0~k9~ALUU--na z9I4u`n#i^Wk7?h9xW~&+D>NAf3{$dLBTPeNdZE<8 zus6q8Um-AuGD8p4$i@W#_L%BZJEo|td#+E7-B`iqgKVX+7iB>0iZ{c@$?uU0&Wu@a z>f&^4L9ou=kDTFjj)9Rev&mh$nDz{&Z0S>`rz^&T30%4N4OFwu&pO)dAMIu`FK9nn zOA27xCszewK2Vu0^K+9DO?Zrn8Jp;m7QtxZ8DLq1nsiX6`%*i4%GOGmNQq?>o=3^7 zB0Y{Nb=Xw&8P#d$XU!LrECxZtPdScDb7>6ar8RM4o9l0+3MY$&_7gg5MKYGj(86qW z$(jr{Z>Q5CL%(FTK4CR;k7P3|E%;ALoz7fFHDjS^U;=XC6ZRrfqRJ@;+$+;>sZGVb z70*`~O9#W)54LNtK0!}mQDt7eha>N)FcotyEmLDzst!ukGGl;G&-+5EV3XS8z$0CM z!=63u5qjrKMLv7p|JcrNhPA<(f~$uy_&5BI%w@z)DVozWF8a&%=k4)Dy*>Wr``2!d zuk!Ei`5zt+pSxCyn5f`;$uytN#wlj0cdSwi;SN$#B|dR(opm4?WPiDAqnBoiFq-t` zrBJq#_5vMP)QcxS)%Pp2(`Iv?a6cO}xjID%$m;yDkO{suA|DDTWOybRS1da-4Cx9- z$F=?b zYT}Q7>c8;_3$_cY-Kh1fnNF)cm_g6G^vWk=0m))$7X$Lx7dBxCi&;J?pF>#XuH#nZ z`rYnS=QT2m^xez-1#I@4n`ajnS8X3_!gkHY&F!=6tH<=d-(AwT@P4tsq9c#4pU^ww zTKhA4b>pdwO#2u6!otE(8)DnP$0LDc_qXqraW;j8Pk{5UH9B7YIW6YXe24`))UsmU zrnW%Y0wW4Wvtr&C(*(DTH(#85CgjOL8AzL71Cr8fMa4bF!+*6six^l~RGA4An~8-G zF`3cR;3lW+H76=N$U)cxlnatX!x$qQukMd6`uZrzyo1{)vDQ+Sys zPRr8r?yM{sEx(rre+WFn6Jo*#;am26$b2PPTK`^I1`WQoi73Cu6>>l3eEEE9L5;V<)UsLa+I+l3Ran!%Y<9W4Mhj#swHinzA7iFXzb@;R)h%%5m}kug2L%ZtV@<1FxYY^{xyL;y(WxR;It0%s z9!=-qStCWd+!j@#($Xg8pY|7Ahl*~;Q3+LaoP^`< zaG=FXzjEe0bRf@ze2B9hZ`-aGo-gES!?rtRCiKQ0pP0W}qrj7x>v6?A2E@*hb<`e5XZ~juT_gxI+3U9MyddPS( z5Djw*mJA#yw)&^~NKtT_xE~_c6!TW^B6d0ke%s!7jL)&p@nH4=a0C7+EV#S*>C>9e zGi!T*cRr8AgQhWYIbk2cC$X(lQ;iA-LJUf(K3ye3ACIpd`-W>~qdj^2YUGINP6j>-b4`qc{t1{SrW@OH`}gCO z!%SxGWwsbjD{b4k>kfInhjXkeg&53pT7NX@^lV~R9M*kdLSGlWgX@v8Eb^to>ouVXk1*$t)+&{Hh>!kQ)qZw0>`D8q0HWcO%v(3~O|?6m z?rHrTwLj<-VS{_0H-#a$YT{iA*+ek)D-*N1&^>Bm1FB-zw9?$6`A1x{CX&g zG!OnbIhARCT>oG&YFkLneC`m8ZLvI^7zm1P8K`R#Y+yW&zPUlLyO!TYHk5YUApLr! zbmRtwJ#w5O5V#(zpSJxwXg^xRLYrcSvInb_<%!Rm{bhI6`K9{N*87(m|FY+Q$$qzg zUE_m7qAcuR0-!E+KsX_ANl~@;v2zBmiozi!!-iM7)V}^zBKJMHcJ@ zns{<`+lC=un+SUT$5(yY>qT_wSUP8*74tA&7 zt|l^LXjy-p#eAV*I}LeQY6*m|Ht8I|bum77y--TU0E7P_`hTO85X68mFDAN@M~|W! z#v()3f4zIxFZ*knpZR)#A?)iu>oSj=IOleMd2u=%g$0)h|2&79W~C=!?l=G|^~8t6 z$$HUXGpsSO{#nc)Z9BxKM`Luk$X+XWg3}*hgr`>|MQZvzxL#mEtH1fPin*rZuAElQIRxe()}B#EU;kGWRp&U5j;`ON z_Z?5lJ1UnqSYUx!X|%DOT~E|2aJjX=@8V7$(!|pg#Tj3@_79ea9iv7IrS4a--vHtQ zSwCP`2U$fhf|XL>exWJm`Drv)NQ(`6tj)cp}b;q;2 z@Xy^eae78B7Q%~EeMH-YBSJ7NMUq&IsRTKHtyG1$3;fF9>RfGKFh`jB&^vAafb-kJ z%TiuYrPl+z!9G-;E3dMeO^5;TG7FB{9ZrdvR^+4ij)dW)eP`|Z&5Y2jd_auNx&W10 zd_25Nf7$GzezbY@a^uVFyLy?y>XLdV&Z6SEJ)(HRbJh)}Y|lP(*z}>pAX%dJmanF-XJM8_r-?)yMXHx!cn_ z`rI=(X&URIJasK;F$N14Wj{0@_{mRXlW5{kf98jZMcrq#5rkW+O%?s7u7XAF;(L@q zK@m@5NJq%R0cgnTx2#0R3qe>(qjcNmCqb4VXMfLV0-Bcv9jTg{yv(adv41MpgVq&^ zD68l5^@w=()^8Q{n%v8b5r#28>ZO%liyVn7gR@do$fvpPeDF0%Be0PAeUc3;_nX>U zVBY+x9WD)vxW$O*>;$$yF>{s~zp%CqPUY)*!w@a(feGNan7hzsXqeJ|m^ljLyoZwc%BEB- zTMTmtonS%;maRXp`!~N#f7#`D#RR?G@rp=#o8v9I`!>g0NbBvMKieJ;vpeR4U41#( z*oF^y_U2Q1r_XdGRwu4Gq1NbSw;i(?E)`eU2X%`d+QMNbvJ$f+w7C9h+1+mOql@db zVJ08+dLA5~xh?6gQv$bnVPF?bI3ye7t*K{*xdx$45Kg`*vtrsnB2`5;C7azFAdp9}uLXB6YiLZi z3Fe3c51N^N&--eA@(YE?9NX2htLRF?0?d3e->BxGYKs;hf z&O)_?7ax65~>ysromOgO%Xd8-LjO41Trz7(8mltR(sbi4bQQ6jpg|lr83w;h?%YsLz8|7 z{bgt4i~8lpYYgdajxWlWJ3o47y~O#e?eT@uB`wyKqlK{5v-QX{yVHjfxL7&jct0hb_ zxJHdxU&mnlgbC!AV}*@K`m%Q0q$-(9NSKYYv@xBA za7mGrrSthhf8{HiF7~~Fd&az;YK4K<6PZr%VpvBh?yMr6j9I};mz6Ngs>qU_3mY%e zB@Y2BsYfYJpqZRvKVaH^-G0Bjy}h$Qu@pOT zs}e+FDq$}Yi#UN6O_*BV9qotJFycb_F!r`P9&$L05hasu-tm6R!mar!)@SFw>x+O4 z*w)%G4Ii=>#~#@w@oZ*NTNdy*Ex#ysa27o4H@{**&d{21){08DXNrVKt=+CH#)!Zy zW{my#<6YsHuyThgcjFH_et)<>y^Znd{P)MhON}SR`Eujm*7c|Hw3arw*1>seD@b#~G%9k(Jhn>H6 zeT$jlWQ)M^p`?&B>Y0%Nb*hsP_P0QH^pf*ngY9^-#5JUrq7GT|_JSgcb0wcDS9P@P zTf0`)qtvYk!A*kWVBkN>4(_d*lpw0M`Cr{9~ z7zH_I!&=P1;vDPifqX=4&@?e045N4pGf%~B_Y~`k2l(_Ou29dPj1SHK+1bXI)x?mx zzB)_eyrEZ_!J;pUwUHrz z-4LpxjK^Hh04@#G#l@Tv!irK-WUiXm3n`^LSc`}aN1^8jt+j?r~2A10>Kk)`tAK4 zFvDyjOtI92eIWI;#MQ_w{Al9UEXS}2`s*U_;coMUEJW$ilJ;G*Nf)2ZK*Pz4D!QJw zyKK?qbDrB+hdQP_y`9GvoIR~{{dojunbk(0AvX(GcWZTWw9YIea&|pfa-q|LdH{?r z=3j?s2?BFy2N-!`xW`9^b3*Tu+VyC3zlH3Gk}9hz6!$w!-vL6bSGNSU(Scq|LvVIZ^;Ed%oB#kl{;SYzjqSuSUHl8<03}MEs zJ%(Y|gZ9`#p$JNP3aJIirQpZld#%=6Z;uy(xR)6JAKLk4VXVjJ0;@i`e!$U_?v04i z`sqe;o67YM1_rz21a)ZKyJrw&=!8c@ffl`#a$fap)d3W zKlkkNr+)I2Q4{~hulyKtlWd(!h7zBBuVZ`X3CWN}R#?#CD4pR&IZZRs5VPf3NcC9i zQ%aUAa@i~}&!Nbsm3cK;p14`|>11pzFr4Sa+YERM#Pr>q_mzC&lePdu|4S?Qfh}+K zwXo$&tuw=Ms{$+>Hrv;O1`VVSj(LA{*)_k;WSWY}^?UG(%reOLw)5Mv=^cH<~`O3${y=CBqOtH;YmL81{^$~mRI8-V;XK;N$)AQxy5i3+P*A3VhpQ%KTvl3Jzn(C=Q_@r>(_<8c~)IvoYaz}=bpMZNWIhNb5# zzesi1wKiFky3gnnf)Ib^*_bA_*FqC7{^U1HFik1* zUuhlrN&5lMw!tAm!fM!c!ZQla?-~!&saEaLTeP2(E=fl#uH5Qyi7VE zxLuIB|J>(NxN125Muw|8QoGpFPX<|PNx%0Iq z_Qq>)qHr3Cl${6IqQ;OQza|^~>)KADxET zWLXWFf5Y5znRX`irq-1R_lWp`uOGF{aVZ4!z^+>ZHLF-PiarZ;S5LX8B33t>&^B239FbMKW$`rGz#th{xu_8PL^Rd$Y>PDl5A+yrzxyS8L zqiNz)%rgIbz8sF6$m;c=rXSN^y)*id=H7yj&9Zy`HO>33dQI#-pUK&s$Yxp86 zCZ1ff6?bFuRylv>RfR$WVwwd?7csMOOgs=8D>{ViGF37C=C8dsg{Je$z%t9bPR)}_ z`>}l;i32&fIxcN|bd%+}n9=G-r3XtL>C2;y(4K{gvNfd`@79%^Pg>Hm@O?!ohI5}V zim@5BxP8I+*7G>c(I-ylk{8lb+P7j+9veJy}GqW2u+-8 zo%^9d_?oTNcWk2jbe5#nb5)jk2W`3-Y2Dc z>wu)@j@kIeO=EB>1M=WHhZQfY?J++OwXzxe^PlIOcJ^HCz7Tkbn`C|-hSzr7)P*!F zGhK8e0JlMc(!%D(!B~VYvoS|(0F{MSU%OcRDqkd=3pCcYs9NTaneA`v{B;V~O1FWX z%)l?YEdgyAtk;A7?zq;(vnA?cEu*s$HB#M~ip>=%WBK@)+&zxdAYPn0H}d zlrMdY%wkZPK700zKGT(qE}r4t(*YgjAIJ)C?xBLs-{DMrM!S{FT>P-sP3^?uE~DG22Sw0USy%y)V4C;l2LMz9PFg6p>T` zb)vmMmwW9_!Re4jpXOZ-gTkgq2M*`Y&IVljJqDYqtPa@WUA?r8 z3v}F&zh*X?;GpT@H_BNas8LnQ^n7@2Ie-xan3H5%qi6Gu+VlYk>qDA&L^M0bxbzrDum-yfFT8T?3YS(L z=ZnWyi>8bt>~uZ=G*>Ho)HCswld-NQwVx~ab|_-D=amVr+l|j`JO_nV&v#+6`}0rv z%Z-oM^Y+IJ|G`U)f8cr+>&Gm0^cmb-|9D=7<7P0k)na?7OE!>cSSjO$5xLNF>s2a6 zZJR6kEs$9YeZ2Ws;EG-_%$||Wa8@L;k;P_QI6v`-YSYF0`iEj=0Y|?B*aTqpnhNLe zUY>k$vqa5lM3j`)cBurY8mvA<_bk8qiT5ho0(ZWl%oARNX!8L~R*YAJbtdmT=bBnI~Nc*TY-=iz>8XZb@aTj)N zi}Cg+?=de7m(Ae4;Ls>`RESQ5kk*q9ioh!nQrCaZtK852Z8C zVvc^kpJlFeM=Z=E{C{yg?s+~x-u3+XmM+g|J#-t#ACfOzj!`%i4aSJ<8@KaerisnN zAY(-g=-MV3p)8U(>AO);4xH=b|0Rrq2(EgQt!8xPANMGcACAyW>Oga^oMk9xL}+$eAq63jET#Rk>%<24|}rt30Sx%^M3_ z>Ts=zlapYpENSA=cUOGN*Gi*5sDteTxa2kmd;OZOUwqKDPdusfw)|q4Rms}R|6-*G!tfzq&jhBHuM#C>_tMDCSJo z$BQge2b&lc(E2N{vtcTtd#fLht{pbslmS*M9_r%!o8t`;;Kv(y#}HE9hQKz%4<&QB zm{rhkzP#&a-PSsT<&cksi8@N0>F%Cc*vR*N^5hA^ z(L*22xJi-cxuEX*-Uw4?{d&#b$}|NK7xRP;$CCtXPj%JsLmUAe7!3$kIIiYwp0pb^ zbr&3sj2|DijJeE}p376HVWRa8j5)d38~9l4zOcKY{1)b5JbxZlufP7xv8;IG)$2t& zTd)$c`Ef6r%)vk@CT1JSCiL2(cO;(B@(+1sB=`^uln&MvGMyG9WSQ1RvJ~TzGn3t4 zK=K?UW?=bpz|Bn91~tkjwP-#6mwi}hblbU-quFTdWL9ICtKoo#7puLtkX`m$d^LID zO%qY&NqH9`v%Rd^2YO+}IF^lJDP~8~#6R}#51S@_&lvDuL}oF^b3$q5?meLMrG57A zbi5w{&801hR(H|L>m46*+e_&YcVNx9XO5JV7#3IZ9FfA;9Q?+583CfAzJEkUxcyT( zqOv$a*>XI(c4Q8D=*O?mKTQvg$DcOG^u*;Uti?!wpECc_QVd({$RkxvIUhqTSbA7=tuFtoU2LZ<`~hWzj4#p^#W;Xlzm z9Zv^3_~_A9-?vk=8YdC!36G5{r@OEoR){~9vZ|Y1<#~5mT}=rAV7`K>hi0o^Z&Dsj z;t0!vJdwP-xw(7t_!atAw0(IaMv6_FPb}}zMaWXUxTMDHdd#HG9S51m80W69upvCc zJjLS?5@10uv|qTdzaQ82?sSGyNg>>N@CHh^s#D)QUO2*0?~^TRJzW1?7E{KTfJ72| z%o)!lsBK9-qYzQRn9+y!F)Fs~^U!GzH|u4D4EJU%5WG}jWlWg$U=JmNho+R`_4_(s zA+WTnD%(`X>wm`QsJ-tNA~(-x9+3%5hGXQ(ZU`Y53#3UBv)lBlf{~>pL9~JWo@?S? z`SiP(gOS5l=wKuPW#wGd`lZ})Gxn0Z$T8l!#nBP+V&!2})}5`;MPqfJ^^OHZRu)W$ zT(PK<9#FSekF@`B7wZ(c_l~wVpFC5bSfHl)2Br14VkA6KGhI!I8k*NoZFc_Ps_DP8 z@e6O*Xh3Yd>1=ZXqT{lqiEW`QGzu&-zaq^*8C-$?{CVfu^df~F=04)|K;GIeY4Kh2 z&%CNLW8a^_-_gQi@EgMhFHO;{t9odBSgGX2{o43b$L3(iIPLNSANXl{USIjjzstlk z{@BMpN>7j+n6G^0D@7Su=jfkekf9PikT81l+fUzk;|++a-}}Aad+oK?ZtreHg!PgZ zL4lkWP-*sE=W6*N=y2b5&F+G}`}8Sy4*tkT-av>FU-{!N|J#<`+3qu+`HU1VTzu(E zU!o6m4U?3s(O16wjjqGFEdgt!co!d`-^5g&ZOJ5W8UZB45*GwZ@YX>f9REg!o`C#?6 zif-kve)?0N5vW@B`Op6^c`*r=zFo|xSN5~Ia~Bm`%zxqPJ3Y2PbNz$O_^|OF+iW<7 zPV2uL*S~i2dQgA7sDsayIm=&#zy6^Rv`rrb_r8OoonQAbiF7mNw`JCAa z-ak?>hTE{H#;9~mkhj*4pcOJ4GluLuL7NJrTN$LzgSI+5FO05Q_@mL(0%VJKE@_u+|y!k+He|+W=oc?<3 zpAbfNJwAYA3q>AfdhqLovRD?up$5_zNvQk0&U`sWjTq}%9niy0Yt_jhq}_DT*O#=Z z)E6sn^O9bC@=d?_1?O2?2J5r=`N@Wu){( z%+>VaLm&F!7ryX?%c~3W#z42rTxY_*`}*sz{~urf_d%&YpkwN$l3s+3fMw86dT#{` ziuq53bbczhY$fLc!oI_5Bk9_p!v9w65{?Q-(5qlnCU{2=VUo;l= zx!he^!%%qJli(10&CUcVwVLK&Ipiy{eSa$?gH!T#Z8{{S}$(L0n+T}_2m|08(jbIqwDhxAJLb< zjS2&-S6q8R>*g27H?ODHUTOff&3s3l2Rja*l_ne4d7Sqn_vbfyoL=|_rg=!*hto|> zcFO-;Xg%)2cPC$;Q8l8@Nqt(cHbf4BMD;SsiD1*gGlqn;e&=k8IqFj%X`tVtFE&a6 zWD=g9`{sV1Z*!9^qwlZ0mJFNDg9)y9JevU$7w&jJObfsY*dbN&FNIY;cYEyfrY0Vz z{p;`kaAfxQN1u6jic1Uc@mA!ySjVF68j#I4KeD-qb;F8)opSC`)9&{B6D==#JQD7+ zJD*fP;rhtRG3@2N+crTl4w7unESSR%ge+gHf3@)*)#jI`o&T?8{Gb&|=H~kHZ4aEb z{SefHcS^Lp!1p|<6!g|Oc$>+yM6EKct0e4`h&9lmtU@SN3*O<#) zeBxz~ERAI?rY@KCuIQ~cWCdLq`L$pB+SjcN22RP(|NKAv{V)6hgd@AWWA^Cr)i?g? zTfg={{Oa#~{&&gNIG?)fN0-l@-jH!T4uO;$Y3M)r!ta0RXMdK?lNWr2emZ*IeMSRXtuJr zAEHD2+0XpaZ~fM9KY8-%^JlmJ-7o*r=YRKKl1+PF^=}?sef)f$GcxNv=a-LNL3tpw zZeCiZSOF_^gxV-J>-)3Fi||k{ti9`pZR4S6?fS79%X!@}#s>kYF6!eUKMU8V9M{iJ zCuC;v+cwW#w*&JTAjj|sI&H<_%#j$|gBpf$VC&X0;wH)QG;xMb$zHGlZ5~iz(Q9!g z%m_L^=yVWSDYMeVg_jJjk-2W7M)PKr42w6rC<4KAbb_WfIVna7+*5*pSVLP0}8B^iWAT zkv*mJv?|8he_(=m(79jG)`!)doG)=tFOorE3Xfo2ollrpYukj0R!7aDc=&r`ej(AIu zjofiY=M)~$vgupuPrse(H_`C+@7JOZetf2|nhi}~vgKJ+s`i%0p@uYQ$&<@wFC z*Is*-PJTKaCheSB*SmFnGnVjTddm_kE~3rSp90OJ9_nZ~L)N zeu7NiKlzhC@xBxZHNeg2{pRL|1l(so`&l|jm-mN%_=gOTyn1px-SbvznA()oaMK7g zTIK3lFS+z(FX-iFCmHVD4%DRF&l}a`O(b08&$}j-qD|~kStu0-#Hfh$YSpjT_9?5S zi^gi%p^5Xn?ArcwpZgWwWqI|#e*RyT4S8cHt0QlLwQ)_8+oriP*yXrY4>Y@w&yToheIy2q{uMx=s?A^Dflx ze+wLLls{e*f8yisBo~wEhSlF?FGo5l@{te=vo%tkbKQh^&tB+{nY1M+^0Dhnfn9L# znvOePhHzYbqxSET5Aw%wojp%+Oyd%)bRX`WXe9e!%DQnR_0hbWdG zj5RdO5ffeo+CMY*nud+F`+}E+h8JtpN0q&b-Hf`wVEizy%!qNhA&WGA%u42!lXON- z`uKdNB~)c0idXs;WF?(NWc2;%d|;gL-H`@dTwEQG=ceAl0%Og0bwTRt8{hbUUwP$~ z8|mxJ9Q!OZ<0@L!gDyF?>O6}H#lUYT3 zAAj?k-~7QJ{K3Ec%fEcbJKh13&ToC|TO{nj@x;jI>nG2iN0QFGm?W%PAMfu#Hf|4B z&>{socn+iRx=X+|qA|_~^RABPll3o;K4>2bt!g#zGt(}62CU6pe`4EuZFe%Cj5P6X zN9Sy%5QBl=?YZX`GUG8Xr+%xB+(PBE`g`tlmil>{`sp1BOdDC%q?5e%@G#@sKeb+q zR%5XccefsL$H7-CgZi+lkB`@xMW$jKZ`hH1RcFj4L({S@U-P?Z-Ue%8s{k(aYX`>` z_hpy$V;JdKzxgq8rGX=l34L!5wIf;b{&Xg&6#5pwt-oM=VNh-C1)Pb(Y(@1&; zW$3`|q$-khrbrCrJk5Pa)Y!!dAEPdrR@lNxyyUe<=$BnuVKF+*Pd%FhrbazKA|IKw zi>SEfn=>SXM0Yv=td_@etxI$TJ$Jc)Rr;EVrB|SsQqH}Mx&st5rDA~O(_>G9TS~8& z)MULme$<)ArndnR!?_$k^`o%FoXOI4fJiu+SV`X!RLtOIN?(dJgW=~(gKc05Yg~@A3`F?1Hxt)C0 z;_mK-Rem<1Oa-`B`mPMFu(KpEcy&6qWxc<>CBLL5Eka+XQ(ZER=$!=H$=4BIvk|`W zvK~e#wo~2g?+>@vSC8r4%2(JMyS#k*^eOVb0OM3Jou!jq;Y!BK2m1Az^{?u=M=uId z8!cHmBogS^wQbLK&-pMFT?nb*#}r0TwK2`>Zms5l7 ztFX%EvMZi*LZA7;h7GRyrY&H9JyWbYD@28tdJX;JGv0G!E=&z!J7IL_Ww~-^RYsC? z1D?Uypv>1tY=G84+fNtu)v;xR49|<+udbLCxymz(CL%Ve-`#f|xf2((x@aW5@AsF2 z_^SlFUQ0BE+@~YQEo7uLsO8my@1k}F+!t2WVxZc}(csT8=q7u-@}T-IK(8GJ(X z4o z-}BR1s96)|kHS~K`bFWrV(XyURR}mjz68fb1?x{3f6{U{OGg$i^r9@vf+4%~-nX6a zusa|B(0R6x&pP$W`ElHW$*{{ZbVE~aEPpn3A_Ln8v_80XaZz?7_w}PA_D)Ag)6-vR zjQ{I**NI z4P9>;J5D;1*_%hM6{$BX&?%WoNV>k>HK)T7F%Q{DgU?05qhcxFalr;7FpI!7rh?1Q znGmPP)y5(&`HYR~pQ8yfY*840{V>rvq1Wl097YRK8OJcm$g~gapB>JR9zTBi=9^aM zdOool=(WiQE2mReHZ^0Lr874w9VIu`<_S&O(w)-%f(g$2JlHpba7~~15k)@Vo7I`4TZ_5@P$D@j+2Gi4Oc%XSu8!@ zT>C6(w4e|U$O-K099H230lOtPH+R?9mt=P2Tr9*9i=mDFF%-b%)y3WIJ-xTQO1VuW zD;L(s+$%-ap~^Z2*|BMrO}pRuoiDb>ydRWSLURAKvzaZ9*F!MLV8TQU+8_={CbN`B z-NDjn!dmj5$t2wxKa)J(OmU{t;&;(yT=hj+ApRO-v=awM{pWsOx9!jK9sKU*@%jCR zpzusTKIe?SnuB5XTR4NQRbB(a6gvt<*T49!e@5e36Nk(2m9Ku07Dqpvd5KIds{Uco z&^A_aaQ1nfLV@+Zj_q&cxCP2AbWY+xh3r(*AuQb;zd9#dwOPcHOi-iDrk z*S)Yl5)SdCp}*QOMSGBoKMoHG$4eLbi}zdAKIBNcI+L0lvfqu4ps6LVFZXzP!4;5? zA3v5H>Xl#)3WUhmC%Cw@2u;lNU+xkX^y-q$!7-Wx_(M%|_Ad`Sa(3yvq)P+XAK<*4`Q?6~&BIU>Y0_{M_oxyZu#@zD>@!Liz($r330WN*>IEy|C;HwWFPU{AH)_39 zS10>(QU8~f?CP0DEL|y-*OU)w=IYZ~plf#Fw=Ou&~ zoOU5`f1dZK8MTkPJxAaMf`WD9@l%IDYY1qmkomey`gNMiG7m}pw*!7xBsx5X2*1aB zki0lDov39Od3ukl!u9Z-o~>Fvm%OQ6&%sLOaLcDt#64K)+7!?ms&m-a1oXoUNN_kd zdytlktPTwmOW&2!kw_jQS3+t}wt5XCY-F0)ntOHUv1YxLBuptYkV=W9q>5Rr1@+B{ zGd96{<^n_KEAqqO`;r`xZdavx^V-u)?#nO}hCMd86BeG8+;H!#Q%Bym$-$^ZIpZM^ ziVPmD_1lP=ICCf%tHcv$)bmkKUMmL|6*L_T7YdMBFg3FI5{8Dh+tA*hq!#wr?su2_ zMx4>2Ku=Xp0rWlH!jmUYxEywWK~@fGcyRkcig3sbLgp2CB?xpZ0CuMPs9Z;BxWa;X zioD`hug4u*EZ-i);a=h)@1DYF0hH-AGl@uTqX{`8BxeSJLMH9HcH_qv^sXQiJ( z+vYYMced!bxV8{43WZzO zzCIGqYf;cuu2ohvSAOhsL$Pr zK1;ry-9hprPwkQ3?+&;0ZpngZW#$FCYoM92=|~CR4e)n4%@keRI6squ7(&Xf`A$~z zb`-8OE_uMdrUh8~frFXgCM1WLu9GBV+n=YL;=*Ica^8H9+Rt-QD5IlSczP6TC_oh|qF|qADA*b#9*DBtuCTio(_BE1W)E>JZg|{^j-_W*M6ZePRnAJL&P&k0H^EN~rdfTFa3_ z;@>*4Uk)p$6IEw`9pOlqWC75v8f>TQygS^%^(kF@N94A1MOO*kYOEAMhd3dWpIYrQ ztK%cSq3@D<)?8_3=jVX-)gFW)V#JW|E6hh^BsFz+mJ|m0{bcmCRAHhal4(Zd#{pH2s?wgL()3(% zB4BO?jaS3=J_7BCWb+8MEhQim(-M#te02SUy!Nkt_3Lkb^ZBl7?vAI+i|bBe%ah`b zua#;PPqxT%wICw{D1D~&iGVzfm$eiNrc2kmj8{kwSYJUVEdBb`)rI&xXJ8V6z!Ic= z0sCW;Wgx+ofgJbeH&03Lf{cPDK&s=8^exiO7Z+C_`N)U&S2Qx}ax$cfyqbpn@BQm9 zfBVg@$oC>=s>7M#SLY**Nj|Z!d-lHL;<%T$z8?Ca@eAMaEzkeA<9D_GJEo}QJe|bM zVqH6G5b8YqtKa_3q=~=swLjRAt<*A&ZQC8Ajh~?|kQ*AaqkWF8%>Wx&)a_ZE{cq&B z**?vxKWL@(c2=L4S2NbxhoaMKU-`Rq+^(}bNzhOG5U0Rktj|81_ix{_5(pphULMc3 z=K=F+GiLKS3B5kJa=>v$p9dxMN4+4zxkylnAJAKf*yi7ygT-+YgI#}a>U}@7+ZQbNkpzGk>n ztz;~m<0#>m$2mdvkvV5Y(ioF#|fND2fXWkWOvq#52OaUy`!XI zNFN-JjFfJ>6O&Z)QNXVnU*D|HarDRCI!SA|SK{_BZ z1XFBH#-ztxD&@?CNJR27xmh9dL!vk(zY`v}rCz9Y9PkWNT z?6*|(J4eQ%lkUv!Zf`HIu6P?>UEbf^*83e<$+w4l;6`^<-41;i#@*$`&~`v~0y&M< zUMiD@1X{R$01RSBF(qjLo%w(K^xPOad!IP;Qcbr^Th#57!DRJXfJY4A{7 zG0ckDif4V+t%PZC_0azKsEqpFe9z|f(>6ZKmi5rKt{yu7-=g15(LSKBDkVbZ^VG%I zp8mx@`zNZ2ufo^<{TE4NH@kuX=$s$wfTtG^KL6)X<2qR}XeZrDy6Un$9k+b^5Ru@QZlB+PQTgin;_l|w zs1jI7Utd4Fc`nV~N%?Ue*IJv9cfK%;&=(e9t4QqEBNTrUxYiwhmwnup)fkx_$iF^* z{8(UOIa4|As?)KRdeB=zdOxS}G%f4_^KS)QTNDRfGcP*Q6p|?_CFVRz zGxDBHkxHujl17a+>jLlB-eO)8XY)!GJC0B=xQVz-0Nqp26-OGxk=;WsXb~J%>!dPS_xm!d&=m@M3nt>nqfgkwRH@*qmg(kK;x6OW6=G8a9^{vN`9tj73 zNjmr)uf5iG-SPf}_&?nN8)_GOROZl5zkd9vC0n~|cXe}db$PhEKb}uN`29aX8~^#! zXTk&=?F^a!(>K2HjlcVM|L*_w7k_bev19iBJiooWqs_uQE(`zoH~#w{{7+vUr?cSC zB_0sSCvJZCcm5bYvFw-74pOAo7BN6jEaiZuPF`@_!m}_dGuPL7G2Y~iy=O|E^|$YL zr)gO1BNfFRVk!{SI8Q$H|MH*z6PG9c>K9nL1__bnh8ANBotG{54?&D*fR#NuCc;rm zVi4K;-XE`(v1roLf}kZj=1CV0)0A)JQ~w4vF?!_|3Vfdw1fMA@HNw<<@3}+;iVcn1 zYk~jz_(SthD96ZR-fT`Wkr?0pBk9aXjd z^f~p`^xg?5NHYe6&>x5(ARt9)7C?w3p@fh^AdNsm8Ug8{sep7u-xGa;NPUQk2%$+x zNW1;sQ>M@SSDBeJw?VFdc?KWn2Pbp)*=L_Ad+%?xZ!IY_^b%mJWPX#GeaP}3vl3~` z#_5YR2HuUM_-bBYs3MTbk)IvkIuymSXvImVvu$l{Sd1ac?32+^6Q$fqM$DUZqMAjT zqQ)jfT?-@0-N?YMMI|y><7B2H-t9#8B^DE7gLymxTnoK(taZiJq9?L3Ba_~lXqm|tOBvurjC1IGf9OW$vhzpQJUq6bS?yeJyVR00nb}^AqT%kcp ztEPxQ*Adcs+A`c}7fx3KELtOpYFv(&Cjd;I2OoTJ^ytwrdElOG*|O#0i!Xlfz4t(3 zn=xa?vBw-;S62t8v2NYEHLJ1y$Nl%;KVZOs!w)|kQ1h_E4!i2As}49|3Jf)I;>61@ zzx;qH2g0|Wd+s@SWYDr;!GhoY?sqF!t~}s?0~Rk{eC)Bu!sGt!Z-2`f&ET2V*Vpd3 z=bpSdy!P6k;r0FRe_!TIFO-S^&Cq1=hMi>A6_<<}H-M2CS!yVRsG#xQu==hxgmslb z*91unZ>9%3rw=nf5GrNDy+rM)I8LHVd%PZ#$MM?i-aonjB>VK%|1mnS|GdU%#LylUB%)DbaYIfJNk1#?oF{oFIUh_d zNd+@uuZi1bvC?0VD(%pdt<9XivB&X~X7+FrkToIRe7j83p7dQWo?h{LtaHR-K{Rn? zP;uF?Oae_F#D2g`v|H68}LT6TAcpq>Ns-%W+*lZAHP9=*doj;2j3`I@|W?@#1Xvv9Q zVqu4dEKyJsb*WLTvE2B#f++8%kVvq{DJoMb-83y-S12nxl7InC+uAzbdFLG}KbNJv z(BhOS2T<-D0rv66#^xbIhBY>{rqdbF+hF@P$`<^xX@Dq@Hx0P|T4M3@r3j`Kn(;l% z*o8I{K0Ovh`1Dweh+sJ2=qg6y_!tvzpnx9YbbQP>&5tF|U%`B6-D#WZ|a z>{%Z*X5^G92O3s6lS#Fg+TeQG{O-6&;{gCsDIXIW>K(sFZ8(0u$#znFU96DHQzfYM z2c;7?#6ZDh5w0?A>U7yxBn&1)vMbTyPs@VM1SeRc|9O8noI;P{T6UC0ZmIqv8;xcsLI(T#`QDQu1GuA`Ct}L z&dVLO>uRFvYDG=9$30`c$4T&g2_!;|w#WWTSNlf{Aj8klY}6zD3MhbVa*CLPYq4V~UOQ0wm9oEbCX=LwU}} ziVT9MPP%Tyqg*iWB#E7GgI%?UnWuPC!AV2xZPe5Y^m3sX6@h}wh88&R# z%{Si+=d)a;it1HH}I!TzhKK-wDYzjnPF!-pFsR)o_`m9FiMLu@|BZ3Y^LalQAVv) zqE2cY`{yL;p*nG{s6;(iJxbzF3*HZ7zbTqGit)ypTCJ_^fE-1F2f!UXNimE-VX2U> zB8cjPdXcs&N2M}g5Ky=|Tq0&0sW%*BJXU8_r0gBaCHCwkd!e;x<+wbObRnRhG#IW^m|1A(4_{tu8>;Y$9 zU0sXSi>0(IrGEd+a}PfFAdE~Gh}mm2E#o?Zs-&ncaypLr{$D+CvJ=?o{>Cy7 zN_$5u=$Dki1Q}K?*60XB9Q@8{R#{l=tz8llHPFQH0K~`ua6JIEU7LR4^uR?1oG59$ zv%^CHb(sDApc6C31AM~!6<1vG?6c4Q_P4)XyLRnE58e+~4e)u!8E4Fxamg{q90MOg zpLgi>t6%*J^xA`_90J!1?QgyH769r~Pdznr=FAsgd=VZc=(`6Vc;LeiKRkEt-23mp zfAr|l0|pELpoPvGH*N$qI+w+14|+Dh_C9;Rslp4?xn_=x_aUXB@iUhW`P^=W4;|Loja_nH!rmcT_B%RbeCM5a-hKDo-}%mWj{C+5FcV&W`QmA0J!_ppZ*kJ6+j)7-LuX*>xd(cfHQ<2I{N6N8Lcs~tK&ZN%rh{> zX3v@fKeTMw^?UBQC;UW9YpbR!xvH#^&#M~vzRNK76dIo64Py!O7P22%j- zzcUiUdkXD9VMgf0y7ppg*=M)ijq)gPJ_9u>)aZ83Khb@hxI|+YTjq|m!^Ga<{)%s# z%a>f0v`%Bh78ZRG+*l{(tV-k!;w>r6wIn7AEyS_PpSSww!h{K)i$qdM)L(hwwMT#c zi?-H|{`Ivb(C7;tfh3j-#p=3xtK_6WfpbJXlPwoYdOGddo~!|?VUVC}+38%?D3%mm zgJUh7@@z*`WNwF%;&#V$R2@HsV;C9Usot9An3kj}&<_2fon0q*w{4ScCuw-Hevs#G%D2My|X?D1dQYws_1l-h_1kD3aOBSk(u zzYo^wq(wSzr@$|GjF|O82tWdo1XrGR;dBWj9%RgXg7T~CM|Binh655eHa4Dm>ZwJe z48qVo_uO;MHP^JXv|M-Hb!%6zx#NyIKz97iZ+^32!J?O5dg;+e9|f6Xzy0EL0=Fq;QukUC?hpCPrc` zZ766y=)^bN+un{5Ti8(qeHqDts3HS06X%=fXUy-{DpiUkB! zdBa{*tt%F??an27yR?HqOzrND^w*@|+J$pJ28jd8ccZYM544kfK2H}Dr+0T*r-|BA zpSSM}?OxCPxlZ+BV_vTiMV=>fW_jKCcHP@!L$?<4?R-Dtq3XKIi-Gn`rGzPg>KYrH z2M-$B-d>PpCHhL3*HBCZQu$HB%lNm*)Cni)unx+G9nxj7$`GbcCNh9ksn4prK3e4* z#n{)|6Hh!5?jDQ@Fnr{ZM=n{iWRE@e zfFA`E2az<8f~{M({_+>USa#j@{p$L|k50W{>Xa!{F1_rMrsihLv3=1;(}IRc^)H%n z{)CCc7>UtgPdYIpadWdx(Cc+UVh!`6hellnC-es;Y#X1^_MkK0J>IW)o@<@+QpC2v zBtM>QW^77{=RdDg9;e54j|lPX68gmcf@@v3XkJf99C)G>26i$})F)0oOlOiNJlZbh zN?dM4e&B8N^Y(vXyF{-z457lG3wq$a$#L*@XZ|RT9Q0gQRp^axhZ~*Db%bImlI_x< z6IbQywr<^)(sOln{hAt^K}AL_B%)fy!4z^7Zsx`%rQ;$H0&z;X@l6 zx62CAe_d0MP=qQKZMb!o>6ePu`|rOG+H*Rsj~q1&_J~Y6D~jrd4>tY$!N(gmHz{sf zSM|g)-R{&rn9C`xWbI`E){@{H;KU5F=(IAnu+==S!QsP8e zQ7W28ES51`c~S6P#8C)&t&AnUY(9&|T+Qci{Q z%8&T7+b%>A%dx%9?I|w>D>hP8Q7!JTM)j(LL}~eWo_|ccFL>SB{oeWm1}Bgh{lvE< zkXT?pG3!!_tdi`{o<$}&tGozVI(90&N%`~ke@(j_M(X+r&UBEV_xK^N7oQ!oP+|^f zTnUxy!X}gY`km^wCTg-qx-5^cs_Do)9%kHR-e)GAxsTu{Lh33d@Gx01MOKGUL`f5|=pifdT$F;YPGwZ!BqvE? zSP+qyKz9UP92AtfbFa`-$e+eEhn}UPbJo+OtZDlxJzFXnkviv9VInZAt*srtcm47; zF6i??Mia6iK;-gzbIW!glsnn4ukR0AJZ$boU|r|1U5*Mf#G76GT`8)aOnc(hLY%8aQO!_5<1s)_4`R5Z?sO*RR1AK+FiOS}NRC}ROMViY=6 z5gj&UXt7+v+$55i%VMm9MOib+N)+BJDar{5Al=f^LVGM)6kxPCx+jQuHR)`|@i7Z& zO4A#*Ht4FB$zn>~Hh*nu3eMV=QJNA(=^6SuTDVvvGm zgz*)~ViFjMQ>y0JCNFv3VS=c@rA^V}pV4;SPxzrT4KkkFL4r5$MOE(@s@Z6yL~M(= ze^S&F5`5zB?XdK_wM)JA2c3BNlKDO8#JHVFLKHjAq{;4l;!xa3s#f04#~bdwUFcJP zS?t^Oit;};eh{~da#&>#X9GPIS*oC{NEKCM36B1iSucq-*ZAjHsHcrpW{r?DX>ipY zW{s18s*WQ`Cz7Z~WR-3xkbm)O+AjlPGQBW$5mBNk?h zJ!kHvj$4)$G;C;^Y&%8NJ8dQMcBeQGbD>bmrm?beI-R-khMPY4`$yH80iuvGi$YaZ zRZHvks_In9ETHQvRRvpjOH*rIeN9J4OKo+PQ3gmbWD#k~j4n(8_uPOJeaI32G8WzF z7&j>gHEBiY#+2x=zy&2-w(9UE!(%jb@i(suy*a*hHYDZeB(`k#BI%O zhUMLM+iib&{ZFLI|HZ?y?S49s?vihwbll|qCs}qOn^zQFY;AAIX49U9WwnGv)d!xU zUc?!V9|s=?TxWt?0-jDjQ{yDAwk~Rb!55x;p(o5s`7YG0pDZ=@K}xtJ92OaJfp_uCir5xSOVB?Y-|KwnGvF`4WlAhtAlnp zPN%a>J9f!8Bdcn^y1KTuRyg-GXnv+8$Wj?ZG>`#7(7^z37XZMrjrj}b4jWk?NN%*f zII;wiUFL?>ceOOamFhm0Fag*`4+7;#Men{OSMC_kZPpiK!1%m<$J@C&R&oXkiE^U6 ze|k|)0!<38SvaR>>$DKXPDjq_m``kRHHnC4ytD9e``#}0sXypRed%u{W9RxZz7n@H zOO?RSQ&YN8=9oY$G-yzcq1d!SJ+)ZcN``UCQLQJI@}ebH#lG(+6_+7)2(NzcUPrkg=?uEM?ZL{;_39wgtLlhIAC~V{r9<|CNN&jmua- z?>p#Quf6u?hadbo?5dhnW0d_|wzj>!y}Bml3vQ|0UR7Hs_!Mww%oF5fsn+an-Wz!<`ecKmUHw@H3|c^e5hUK0~-ut6F0vLxObq9&apk- zEA&iy^r$g%N^5CuqsqDJfd?M=^sj!oZr!^2s+x1oIY-ZAVW@JsIC}KR4?g$+=1l*A z1Ga40lFDS7S{p8!cEO(e?B+{WsoWwejtcULpfeJ8d02jD@=_2c*X$XI@ej=4LfKUn zO>pJ&&%02iOcx@$ihGz3*=%iorzj(&C&-~M0 z{`|;84`*`OK?4R49y;Wlv(Db$*l_!;cYL&YGp3-|w4uXBUN-A;2TM()?!5huKRowb zO} z-6TeCuOQ0a6Pvz1Z{P8D&vBDhnRsP!A2mwJ%!nX*_H|3H?7=$SMJJXkd}7|R8SOvY zd}21D?s)&c@{frhto~!;J6@ulUM|*%)i5qs4*hd-#7nF2K`mG6#-B^_*rZuyYCt#Fe75xI5Gyh%&~1Ievg|Qjj&w$)ry$u5#eZ5t zK3`QXW33(#(XeKYrx|5u>5^+28XATT8Pe9=QIi|s*r>tl8Qn131R3Q#kaHTE3XUyS zWvXjxYFb;j=kw`z*Z)n|)l#8|+AUd7+=!5d4i2hb6$5jEN6uk@LEO$^SurH@I}^It zQ9{0RoPjJ~VxnbL89Zo+9e8!M{rq!G(Xc;REPjm#;3D%~S?d!1Sh%K7{)X ziX#kSnD&4H11uM#klH(1cG+#z_s>7eb~|eO<(e9{*W_zBeYDU`3=(2Jm|kIfCnV;q zb6occg-EIfof2L3{PQnVeDuOffzsoAfU9}_`RCzT{N*oynLT?poad#NUV7Yd#{qV} z_uhN?eE!KNpM3l6x3_NJcGQ0y3AlUIQAYtbKk&cveD`3dOLcdxrEl}W$-);nV>S?FF_wKv5-?47;{$G9d z)mK4A2A%k@Lk<*Ihk$SUvL2qN<3!A+aBT@TcNB zg@=SOUmkDxK~(CE@8sw0eQn1|piw}N7*`$(LPKV}KZjwqg4Y#^F<82@pI8b@*X0tt zRo-Mj+k9d&%zldeV_EIn{Yj3WuTHeXriLXcvHEwux|Z@M=Ww%=ok9`^D}uika%x?Cnz=xBw#0hOn&fkbZ?MW`*>labmX?Hy;u}A#E?P+Z95MBDAazG#F0_b|eQHW@6h>l9 zDJ!VG&4<@tf4zfVha7SUO!B2mmrkBM`Latc1x5LkQ%<>J&g?z**aNyf_uO-ETaG>U z*r7v*u3WkDp@$xN<<(c4o0|cTfANc7q;)luNsS#le#MFvu#TR3>Zw($)&PiZ+_>?> z4?jF;$|1R2?hk+X!;~pg;12!ncfS)A^?Tp@-iLqxAfL}Z_UNPVybd~W3fyWvg*!%F zzk0(qkV)V>YFfQy=8wjV9SS<}Cn7QH#0om1q!@|WKiVB>K5y?sd(bIn(2t6BN>P|t zvQE5j8_TZg$xqBk9Px?S1C%s)vSU0fd9D2a@n8RS?ZLDXhEmzJ_gubgJqzrxVA>+C}B+L%Sexl|b13I5j+_ z+tWioE8Kp!xN!08veBB$1N0*J6^$anq+4BGT_|8S4A*kgshZg{7ryuI#z6!7>#F$J zqxaX>R)L^nTE(h-N=u8bXMtqy`66hNfB&H2_-~wc^V&P6PrLZ)tFF58%Gr(Ex6wJ_ zo9BjQJYx8ybUk5W%a{s6^T&*J;v~P^PSgeO(k^4T7Dha9)_U|YtID{s<3&v=6%9#| zbv+H!rqtdBGenmZO-tEsK>iU$imNzaAd*@#3`LdO3oQeO)R(NbSy#-c>z|hZGaM^M z;`m7k5eu%nT*ZYEdB%yMbVRY!0TDIPI<5Pb1W2q2nEkOgofsYpAnrTwywk5=zq{|g z`-U5CSh#Q@!0j1lobka2AAmv(;_tk9^NQs%{0SHdcjlH`ZUJmwuwcQ7C!Y8}|MNeq z)~qH@JeDMR;e{9Ox#ynq&p#jDue)|RTstVfusff4;>nXHO}h5lYxmr9Pq;-7Km2eu zn+FNt-h1zU?X_1e!$7xmdq;hJ|7}|v&DuKBhYYRXaU_=?*_jZk773&D)^VP7C=^3o>BT;p%i0P|x1hpT%Vg_)soi#9Sk9nfW z_SjI_r9Ig{i1>LiuQ$otqp}TVI-|#Mu2GF3Mb55Td82Eqrs2Ucjk0s;#7X_B`$udX zN+NC$y>_TwkbGL1qU16X6QeaH(aZ6QdP)GD7~V-I#y~lTssZ9G@^Ht*cmgRU3fjW? zD>~W?!L#9M{N>LtY}xj~@WDfT!L-~$Mo|kcCIGP=5hl*&P3@YRyMN1QetkV{97 z9)oZwDJ^ZS0KHiBx~+A{kRk0&ExBA(v24N2FBCdPjvN_Kw5n;_aG+=@TzY{G$Pq~9 zvXx6^z)jZ-FhORJMBG?A5h5`t`4Pn^h4m1VNK6F>6|Be!>botSf9?fvpJh=Myj~~6 zi!Z(iitMy$)8GP6KmGJ`&pr3(qmKq{81C)kk3SCY!$*#6XlMYmUbbx6_U+qmzx{T& zOx}p$(~B;;=#4ktfP3}jN&8%X{q>6$ExPi`D{r~^wnrX$1a9fcC!hS??|!$ju^Bdj z-~ayimtJ})92|V`!PBPAsI9Gr+49~y>p{bQ_uY4~ilXJ{TDnjuRM*zP$pn}j%++-1 z;+fM%j~m<@5@VJRj2?FxiP<{Me&Q~OqC}~ZKX31AyKA$PUgAcU&RNp+F(gw<*7FuU zd+DMcGkbJmF|i{$oQ3kg51%;b)-Lw3|HqCmD3$h*huy8eFI3vG{;1G>97+HrvdN7r zvvPP8)^kH4DGsZt)WwvdLdBiid#KYKx9@m=-jBQ}<4mlDv(7}Nbri=9iB$wbcw-$~ zy8X7hTbc|-PCJ+uTK=r)#6mYD4iY}#9c>rj>5}+NNKEY_W!`5U)pWhm{Htf$P9c?6 zs3?VMIW8wa&E?ZZxeW<~1{(Hf&s@^cTCA(dE2{bXXMb_uPj5N?_@i=p{j9T3yZ7F^ zwl-|J@80__zT}Dx8=7UI{?u>%!1ptA=Pa0c$z=lv4*cWGFICsoNxlpkCFnx3C?uaR z(ZIs|x^9wZ>~Rhcm~1V1&eegv1m~7g?tR0=UfO^E z{p;)NnK}%b@iE67^WE=#53UzfWSIXaopchM(nAkD1bXu>yXHf z{kUOmX8soQgE{|m1pgs-R*0&U;A|l7ERF!}f#mt9vtlv!s2$6;`eOI?xWB6C+z#s& z!^h~DCY(xBjRF>;m{tUAHHGQ=1O3Lex0VXN=K=)l0{iNACM52@ee)}pbEPO2Iw79! za68~|%Zb1-@E9P9Rs2;68l;Z+{qdy!)g+HhiG3aeVcJ|Cgz7u$^ zmB|Hv_`?%-+_m~g-~T~#dE4B1vj-0Bf9Ba|{NyJ;n?B=;v(KD*$&5v3eEWj$eSca_ z)u8o%d-JKMo@#GvgW2Uf9+sn!(7_?l+>j%7VvumS`cb`Aeww~eDWEBJu4mj!yXg9! zuBPDFFl|8Mkt0WSluMGLnYJ}y!o;`UdTYjyrh-m+$wkv&e))e=nH)^fL4yW8^~;Bw zn+t$LvZ9H!ovD}*+clkno)MQ^Gasg;ZFQ)MNbI{%9f`%DE{`(0BA-hXcR^w{SqJDv z!YtpCrveg7KES-Fz|HQ7#RP*t{q)lpUU=c#Z@?LPbL11jmLQKODM_Sg?MZhZFH zXW=IN$AA0>+-J~e;ciTtG^w_>mdi`m)YO2=JAL}}b?erhdfK;CDi#DE<#W}1o@btU zCII%YfBkE~=8YRSZrj!XkbK*1w}Dn&EEa!s;Z#M%dftH6BS((Bdj5j{{LlYPXYx`0 zCURye$ZVc<<)y>M^y`Aeo}UJtxV=T}(K@ZkNT_2eicgHaV;nW|d3#^mF|WRD^X4o^ z)N_H*+D)V-=KUdX%tXZ2|7kw48n?@d!1S2E>j$0NyX9yUBZhc9PAs8Ejl3!Ntk-&B z@wjj!qY(mDXZ=JmVEQ64UPA3T)QlyuVijQx25=FyPgQD|cl<4W&b zU)Hu+OOv@j*LYV|8QSBFRB?aKHpRzWMVQ1j`Z8803=7bL7R48Za-RcJFz`JU`NVAw z>;j&PQ}bVf#A4+1jsHx3>i2~=ob1qpSF%fjCm(K;43GvoaX214SW#y!Q;;l4w&q@W z324TWOeCU|ZrPYP(|2r5mtCi%Vw!jWhxF{3*EoikNvo1#zWCCUGcNf-CMTYM{<)7o z`UL1tgX#yq^ru&T^`Fm77`N9U2OodLVaF|6y!!g(tH+HV^OwK;Y#xn5;0xmto4?S`u*6k#i$StN?s%FLX?uIu*|OmRoMwZMWUN^rbJs4FBUF{|IYg z%$PBE-g#&L{{3gpoY~RQF@OGi(2rNHTzUEBm-Eg55DO!~*|apbEnBv1`SRtz`qi&4 zyX-O$N`CgUpWSiC9S=YJF#IAsxWf)T6xP>=AAWfM{XgAfk3FVNy$GIZ;D?FoEDmu; z8ialI;<-b{VC=LPW{7iHCtkbe?xyXq{L=KKZ9w7x)5T(5ZxG91e!5X=ASntg@}uC* z&uF{nRcwTj_0CH|LvmaAC-R9Ms}KECinwIK?9chc(4MRCdg+02>~SVti9Ke`Ra14t zEMvP_MvWG9TuA}B5{^sdVm6aAEd%;EZY7w73=w?CDtZP-8e>9?NUJ9K270CpqXg%J zS%|fi7uFK-Ie!)gwvg`)#VE{};WO+hF|U_i^t;jeq;}q60F$tZOt=)_(4#FB{lqCagvaS|zo&IHpgJ(C|Lb=mmS z-r7I@*JI1AKu8=2bhkxJr-gA$7{`nLbqs&=imK+$ob@B(6JwYg)@HyO%Ysb0F#IL> zo)l<;mzs0gHLimJdwSY`?zzV^Y2OhF@DyB2q_`&oCXXUzT|sHsW*mOVH_pFc#*J%# z{F8g{KK}UQ+S{7oxm4%#uuaIK1_Gwg$)y?so8P5ADp-&!I-;)moh~yWe|Uly zBQZ_@MHxGOJRot|w6&C;PG=u@;DHOzI~NAIYRD=vu2GF5yqxWnX+inqML8N`R70XIjpG{ zUwFBxx#7=$dVTD;(I7A#e#D`0=g&I(j2Y7|-m>MR>gwup841cTN%q@szsAO9xJ&tb z9)8X+&0IbMdx+(j3zp35H>}zhZHd!*pnXn~mFhLC)-^Z4VoU{SGqah+1UfNFnII}E zVtkoWlrcAs(ERMScSqu+tSRmoKe(^$f!BxrniMR)`ijr_#AKU_`MZ(M8b3MC7s?(z z@`iF`wZz&X`O5{mKO*NPW=)Y*XUk@{JcnNy(4tV{Dz4Fi0T%%CpfP}ciCU82V+<$m zT=32eU48^aWJ;SRcrz8E3|vw91TBnt z_QP$6`^SkVyN?q_Sz8$9X4}X}HZ3gpg@#aA5|}$IjGg}9Wv-;`*5aEY^kfRQ^kC#R1QQ;tJ2icmdVz2v^g6-+`iwW z{bBci@rCF9=hYXsZQ1C$rbpB=Sj18wCC@X~iRI4qsvQ^SgX@Rwaaf<7s6*Vvia>wj zeuqCHhe$kT9O}f`e04)p*6qIgmvZ@Pm{g`?rZbwPdeG zqAZ(9uEb}zy+@sxCx-W_@rgNhdI$TfqJQn;d7tx%p}nTU-&Hg_Q6HDm3TF8MQ+u{p z#QudsJGB$b)5Z3Vjy4*nKwL>qeL&S|%rfQ1V#1FF>x!3mu~^3XyM+?-gGE{f89fER z$aQ(KFdqd;ImpvZNBmtA>%t=Sg||gD=Jjfw>uVAi=Rks{+CeV)7ob1J&B7UC!B^0# zC?_-3V1e-gKJ%=LyKx<24bya_Q(40-!LjE%vV>YVXu3#MqITTYqb$>){llHi=F%MO zgK^X;xEqe9=C5DACdnuMSLN91O_vq>$Q$lW$&Qgb*$6tZB$FjWu&MMy1&J{}*=~nN zddX!Mq%)H37?{(FvM_=ot;m||SSd{cEmo1zz6(0>wT`9eYN}Xjsjk%v#YRw?L7y`U z=(g8%(ejLRCez+ts;M1pnZ9fJC>|+6zDj@V%|Brnu)%jv5d?b+= zQ+OyCJ6$f@^;Pv}oq3Mz!<7nYISqof-mShhtW8*J@Ni&#_3PKKL@&5Mb^ZH6dwqR< zV`HNtO1WGPG-J2{aKO6|jL^TnUsFqSKAR)yU4$iUl(0&(29gD3$IMmbn;V;;Wz>j~ z9mN8iXDX9!YiX^jsV)~wvZ_>9<%*?}?O5=mg9Z+6X=zbaou?eEWz#Y;`3ykyWwS0B zI%*&wF$qstp3<=aXsZEs5#g2(3Zj`J8>*f}58wG6@>kGLk^TKf^ zn<|&gxSgvNS*DXpYgkJ-gSomA#%G7l--LG%z0tjkb&lb8ZEnwGh@=$h$^hq_V~aCz zq0mS9dqEGrYu!(nPi&Mih<_)H*oqN1*6_sMdBfeU+{stcI?XzF@t<%gy2(8m- zr-I$mXK^I^2BiMSZ zVmVt?J$TU2=GK;%UVI+5oyn6Yz3{>d@QasRa@mTNt8uLbt|>IM-< zQA&k^mP+Nb+4e#~S2PnOdqsk)fGM$g^JdtAYieqYvPGVF%sx$Jt;=Pjuzclp1BdkI zvX2z!L0Pql#niCX?olTe@EQFd(usqpG>-7;@QK+vy@UO+KJnsSt0MlN;uBZL?V1`^ zxD5HbVNwfM?$n--lU>B)V-BoneAHHzum~5y5^k^L({*4sV3;fvN;Nfg9qmQRChx-H zbYL$?>saq4mt`G2)=kNn?51_DYpc@sEjX^Fb*>*A`;VFL3-U7Q;%Tn&03wu%^>+cb zGpzf)q?f)j9_~VhXx32_!;SGQMXbFVlI9)CY(iMqOY;p^F$_Jg8_{69aqrbqj zK~zyBHE=P_GHxQ0?z`H&%dayH0W?~8+_K_#bhOpg^)t%07%0SzGA*Z6U6XIv-aKH? z2mow=Fr4a6SrF~5AAN|LQyEJvbIy(Asm9i6uPZ;83&tVnYEd2Qm^Zv5NbI2HQyDX6 zY|%6%MV)%lMW=t~j44y5+_-wx^5x6le&fv{!$%x^&|!c4(`ysPjT=2?TO0cMEZib$YinT~&vDD9(XX!F zv@MV`bgC5(_lFk?KsAT+P+C)*Y)HALwAC;s?8Jcd@VJ@ln9gPB-Xp7pgmqZ;o*%&Y zrJAbz!X;Pd@_Ep4Ib;NbHlo<+)~29Gomj*wGyjJowt7TF<)6nVhTFR1{dHMbbk(fS z`NSMi9Jb386YhsG&tkL}i&()^s1yf`_voam6iYn;)k=~={-x}CHkXB`2yD)BBBTK0md>=LMJE@;~o;HNMji_bsy*m+@rwlI*JKpNU5Dz+l?_UJeO>X=p# zTHrKQRWS@x!D1D#$%5$M@q2t-aeZIVp5YzVDx4J7r*p749r8p|D!e22Dd4gYcqX=E zvMEpK#wS*ljBTM==6|10oK$m@Es5LS32|e+wzu}~gD1!Dg2aKK#MWtQl>idG> z`NgXiTy8rBO$Skiyzf5I>MR$n3r0JNcP0kD&A;MW-_v0yN5_X~ePMr-512TU;XMoRUL~(iYgLsu3NU)7cCNK`s63ZcjPSumF&~8 z^BC@JOLNAwfl<%7(42 zt#CuK=?tR+eiv!haO1^72_BpdU*xaz9AV>jb8|BwF1!PHGpMswESJk~+qSJ=zk1hq z*!RrU($LRCNNiEI%XAiIO9`%%<16{G;?CwtfskFZY8@ak=)}xo5+&!~9*G$Odh-+e zpBkT-_qHAE4?6MA%qNcdwa%x{Cr-!hiX0kd$qSoyqUdW;)~Q{y@qE%04@~uoWHgaF~CWpNMq6~&2don3Ts_nqmS(-g} zhOF8_;PT^>&}0Z}lk&X;E=&Ut!zi_xm(Ewk41B${t+{{yS`hMJUxvvBN?10RDwjJv zA7KL|o??e%TcGXLe&x%PUw-AqLR)L0qphW-xjLKUO@U5QB)E+4k{1W}h0mJYhhB7n zER=`vK+L%=!f42hlEVHJmQ1mYiac`E=#o*+R8@n2T_v}nph z`syd{8Hq7373TNG)qr&%WDR}>6k;NfbgJzgA9H*O>>G$)ssdUs+;3KG0f6CCk5W2h z$Z`;10V|{?!-~$NvZifdtrx7;ECHf}Vhw;z+BPyNC?9}UD705sS94XgD0I$N6^=8& zkyB)I;!j~0!UM--K@ko(K`Gaj*R&|s-4YbFX4Um~v^G0f3=K{lbDLwmAlR!u**a}| ziYoQczB5^&`(&MF6m&jKKJkwCmjk!w99ug9pV&$8edEjn%Eyeupup{tqV_Vrm~0QC zO3}h0Oc$ zyNo#D#3O8{9C-S}4?WS?&}JB*z@StfD&ADJn>IDr!_eRCyMdn07-b?0$)4kwqec%o z;hV=O8b#j;`l^*TfeHi)7M_P2z=9FNZ3hdua!p@MBn0EZ-YI&7uW&|^Wfw2G^dea` zHC;k$nJ3?{`cBV<{U}JMvsA**kB5q1KE=?IC`ZqTObfg3vCG$vJ~Wla+vwuU=1a!9 zr${CS*i~=6WnFu_BMRC-$|nxRf^O|y!j6)s+6R6xhr37Za!)@L?daiQ&`l4neA?M| z5;}}Ylwm!RrDItVH4v!+(Uuf*&b*7fpn%m60}1UM4sNwR6{`;eByAtGnYpvC_CV@_ zfjsk(M}AsUm459{FAW(o*z$sWO?6vy6FiuFx;me$YicZP!sf&3gQ}yq_8{4VysBv`MaHrmxWADRsTAm+?ecGroW4!<)LIqJCFnG`=JV4JE$(DLj0iPUXIa8I$f-{qNr+NaN%aA-aH(X8*1HpCaWt~Sn= z9#2)`LAstpr{C?eR9#W#si=VXD+u}3D{pUUGO0eXPci(slLx+Bv9vLgk=j62F~Vwc z9zI7(_=A=Nh7F2ZRECwg6>QRvt;8bbmP%%}=iik=2WTbIg=u3ww!?SD zFkeC^Re^tnuG(iyMtoLre=kb&z^s`r^0XM$T<@f8Bx*lixI~ zWfU3W;Ksq$sk^qka>Y%S8OWk4QiW8u&9W~xTA}=6XF!pi zyC3LiH;V-e(=FkhCM%ynmGW@!z=Z4~C;kK^?(#}no0DJcy*)^@OFjLNAOvE(@pVCB8WxY0PCW9;j15yAA&(qp8uPPL z$nr#6g)J(jIrF9mVnLJ~Xe7!w+WZ;L0n*U4fz|rNIWyeYYuMgal^t}-x6YnEefENd%Vu6Sd+E}pTRz(0c?NQo zy+96hiOMShN)S>4c4Asq{zY~!#@i)r2%)5+hzesHDt?j}DI6I6pi`6pJbiS|5F3zv zH1GqGERPyH&Ou30_e9LXy=>XCuY7sm5hF&7A2(+B@S*+s4>Yav`|rN9;lmFWF1&iw zs4>?ry>9d7?WTn(-n6t92(F$H=U+X`4-7P`iXOvKZxEPxYJEZC=+(Vg;dn+J^#%IMYXP9rKAhI`& z__zU4Hf&BC;74(zr0^&K+v-_YkwnGy(C!7#4vul7gFPv5(XocyZH065ao!;;S&a;N zKW@j}1Jn!3)0gc3@$Hy?RZ`(oT}y+&%9#W)*^!U=2Qhj^O(FFz(a!y$-LehNBv`q( z(K|YfKm?)l>^@Go+knCzUTB%KUj*AYK85tA4@b*7UeLbGC7rD>k%1=SFgGi zkXQ;rGYCG35Uyya4#It$ZFC~$@!^6B(u7?`o_y*NqU07j?0fEdVAIBiT($7gf z?l$flCmf#6Xk51krh6PNm#oFqw5`G?CL8;wh{RH#>Ic)V6dRs}?mJ!3b-xS3ldt5p zh`%KvKig%UfbRp$F=*sidR+${*CfpV<7k9H#sW%8Y3`LX1gVI{5Zy3!C?Xu+S>*Vu6_1*Pb|51cDcBH`o%xIV$Q51k38~&_c#3QjrHIA z?hj{QarM3TJaY2M=ZqS)`=(9JLk5rh@WV}S{Q1?Yx+>2>|A-(dvOshI8}=_0yj1kI zP<})e^kZ93rOKA6rO;iXOSlYRdx4g!>e@oNr0TF$xdQFZD5_ed<&fS?kc{4I88#6= zN?ao>(K`%%gZXNg*YRSFL@J~8_ft-wF%oCItiBTu+3ljT&Xe?A!iZ+rwQnJw& z22a*7tW*l0HK=EBOh$TK+Mqtc(}WgKe&84cH5Tqo)6QnorIG>d+@E}EJ@hAzNzd(Y zPhcEoZ4iyqhLI_9%_WXWn%Eo?7GtIHp+9p#$k7R_k86ah7zRk$1Nj^{c9s2F$^JY( z^v6VR$g)vjd{Rd_QKLkGQ7=mNKhX-Bc`KY>lpE$>b7{0ZNWC5BMP% zQyLIWr%J#XRn`1lUYj}VqO#G3!#c|K%h%c_Jb#7tY2G2aBe74~Fo?8p?73*&3D>RNuq^*8voRxWv}k|DXIuYTg5k+}N~7@laK>IX-=Qdnc7dj^l75|kJH zK-U;0{*%pU-EAsjl=hu?+Zi%grCdi)l~k+~i*kt~(*;U#%1NgM*a0+I0U|jD^jOyu(z*QR z?G3dxbtsECNXcC=|H_dgM-CobQz-abHh(yE>eTJqw^JhJAe+gT36(N4oi%(^e^ zM_sJbxNniYS5e4iBZe9HRW`lK3e1q|T)t?OF+K*jA<1-*IRfvwG|nG5=I9yAbwHIc zY%7~eLpvNhK9101e{SjC&LhA(2!;7fmd9};>LznZVBM84CQge3?$|^e=Us?Bo5_2~ z$NXvBAJ%Uivd5G*zzZr=T3{Rr9gCe~M|dB=j1H-Ed!eJY8uOt724V3^kYy&q-r7n($9YK$c7KLq*GOvh0bYN z!EYfFhxN=6iP?FHVxWk-q^irdTd1x{Uo`Cpwo^il+0#~De-j9@q!UL-ERZiMnZJPQ zu*xWz67>Ony`tlqmtS#_q8W}`PU$%z&=)Vb0hUZk&%z=k*}_lk3cTxuwR#Zf#V{UC zl7l_=+GWaNldw!ZIWL%|RW27%5k$pHF%AE&JAc*~@`+tdO~I1x6A~w*7CN_AVwJlb z#E2XFgT>zY!5`C}yp5FyElXW~I*2GhsQa2u%)4b?HF_8%iTUNGX^>;ZMs5k(CtOJ_ z&z}3EKrDf%L^~tqt<`k7Y!>oWnfCVfT(;UM`>I@Z#muW!CG9$vs@T8z?Zb}UBx|LY zU;f?tx86Mb@WX%llb_9)aoNTV+kf-hKb(Em)WZ%xZt2oBm(N-t2U;$ZU;no^L2XED zYQ8qxRA{$-i~|B?Q-|HKY@qjEK&z<|)h$LaPN$Jy4%==S11HO_t!A`h8O<|3PCMLJ z;8WO$>#OUVJKC!1YFkSsxH_&Mj8;vNqkq-WW5(IOP&OHPL$V?LkZ(k7qYi;=jyHrj(M z7#c^C6(bTNLRfo|4im0s=Gk{2GwF@)G}om-=vfl&)jHjqPRvLwbk>Q<6WoJN3=@~V zt$@VjZNLzaQn5pmWu!`)rbh32D#gbF1=%|=e=->pU<@JZ^T!<)PkzHL5=QH%DJ{&3~bfzit!ndQ*xPNTZ z;t`>RBS9AfKQk52@|Tt!pkcX$#i+)s+#LDdL$S%57hEBZ?oTnQT3PRS=GqjaU+ zDD}`kR~7e{G=%Mp-env^mE-d)h3%-NS&9~xyHD_dE9oJldcb*RERdVsLnmN_!~iX_ zpmJzWjDMt2k>nVJkuMa`Byb=GJo;TGjynB}qaC*-`01N&yse|%woDhm37?tolJ`_$ z&oV7wWc#7hPF5WkAB3z0hS@%7NbR}jorMA@_LrAmcLPXTLZH!l6GM}D&{dJ8TJ`u$ zL6E|jYvfiLmt8(phh5z*!;UP8nT1!a5`r}5a$>j^{mx)a7a3KppwVDm*orFcweJ@W zIbuIhRy0+GJDJU7uS>QkCDWiU{NNtj z!xbw?@yOwCNpkmf7(|poxSv*{jxWX;L+SSo13zk`eMm} zM|tFtC+xfTSDTxPLkA6i=C{wZH8%LRDZ(QR9ABbXLzx3oLJFLWZY>Pn#&~|yVyPeb z=pZfxBxI!2q6I(;+PnpumL`ZArfn%_)eHz$Qd(;%mDH-dC&C_tvHbz<@A$5$W5$km zJj^U5Do9Ae*ke)DQyNUELZO7JwCDBj-`}V3G0;5Vtl)ORdTefM$>-B&PmVteW%MX&BT;=s2(!d@0oUG;IOxUC-B%>;Xmexh zG<(fr>vWGgv1wYo9B_63G`a?SaqE^%X0ZSpfT~j3qI8yWYNpsu>o_oTvW5Y02>WM8 z82(Ao2aZk0guSR_mf)Cu*`P~-p5PIsoNdJzR6~Df^i0_*Lr-{zZ=pTe_btcC zq*5ir$b-%eLNXUHRk zNiZZaov==;ky|k?Vk7gS5u!bsLSQ%=2$6XFgc097`A|(4K()B<-UmL~)FexqZQ*wn zRqlesuw8OwG7RW?gaNo-tYIVSzxVy`Sat{gmZz<_{zli4ML~!4R*A0klZDO+MP$5< zG?mdjg;}yaW7h0xs*ZUQpnFQMxpK}jMb5+O5J>Uu5s78GZ{#te-v^wKg+2G#?a-sX zs%0dPQWKzgM_0HS2}UIN7^rpoZTGe|m61?UG!6=o{RYC|LVSW!rVz|svqsIag zTehobvK@tDI-5!BDc5t_TU${5b3D=757H z`2lE1v{<^_|31cK{c~SYJV7PAIf1%8IaWk9J`8t{g!J4)bePoDD%0tAdwQ|Gid+Nm zv{i|9;ucF1HTI?na>Y6=cs(OA`;W0$hQt9qCY-?E-+Mc7trU4o$;2IS^)}d5*s;Ym z-#8AOmk~vHxuh@)ag=!69=Z8KPwmIF^O&)}mUA6)T{sN#b$nE@EYLwgmc`(Gbb`TU z!nMGpCke0wP5i=CJ2mfmi?}mK0M3CD=g)6yrT$Ir|p# z!H~k|BB@pibfauvartb7t6a)3%ekxy^8>a)5gq_$_QBBWa>>+`baQh{eNDfUPx$78 z_x&_2NsU`RGTK|yinRB{U4zE9YEWD}ugxkqmhq{#*+#o%Na?hPaEz-!7C6{S49KG5 zl7Q=bw&+?lx~`PXgZG`(`1g&0>D1QN*9;!?=Ee^;wYRpTf14hyEOEYw0ISf;BS(*O zJYP%Y%7&?6UN#q|KGrc)HPC=DxF43hgNdEtD@{#J{rdH5ZEfv8Xh2ibHbHjl>T{RR zo{<6VJFB*|HYjo`F*i6oVkbc2#4FqpBKL9U`4b{>Cs_3>GrT(zcMBQ(6)n--7#s7y(d)b_AbCrcx`YEubrt zj$!@6w;1s-R|M#C)Sutk%Z3?_B`%l-vt9OyNsj8Dq;O9^G7s~jj<>j^)Gj0(TdWY$ zUG=H9smp7DLMH?lc4``z8TlAz?YmDt@fdt}C*%`{{0;gj#yO1m_1u6YHMRt5AWDZB zab46xe8*NXsx2hcTehJoQN}>ii#`<9J29KarmpQzr&;wdGjxI zytY6h5*+5XY|=@8RVlGeH#g{mPg2KX@M{g^ocXwlPrLEJ&Of z3@l}CSaY*&z%iUhijb+I6ZaRL!WYw58`$v&=TA^GD2G-+3xlF2*AjI?*2;nI` z_w%1W^2~3atEs6s3WlD^JDy@VAgMZlWNmG20|yQ=ilvmM7YiLHeB;=sfBBSE=m?Bb zp`~%ZefCxiOKr2%Kr}sHt;&Abw9VDzcej2NfczeybctEeWz-%7varIuhc`t>M~@1s zbGZOWEELPL_x$4LQl_dE_NiPNoxp($7>xPPJFqOuh*6_q zx|p^v$%>??oRQ74-aSY5wFFKMqR38S+*+9FHq=!$*P;7BLfOFBT&LD_i4b zs>X&v>3Udkl{RmItGU3p0xYAVxwaW!7wZNbPM>@w0~+F2X9Eu+F&>KwsxV^BnpL-f zPAmip`>_0wuR$`U%W4UQH5r(K7gQIVbySItEM&YG@eaTD&Rd>YkV*GVaG<3y?6gzV z_ow?F|6+U&pVE7LpFhS3k?aueT|&q>kKg$NKIXIM;U0bT;U189C*Tu1WF_`Pbu%{j zP;y76c@&G~+M2r7*7mBZ8cet-q31~!1B#L_C@RfT0drKjalPS8&M31c?aGvNLXIjI z#o92RPuPyNbsg4;yCAV?_`M-92TsS!fX|;)TVyevbjsl&65o1vb5jS}4--htXd1^( zS2zqJl~_=b%h7*8{@nA<@&yB*s;h!d3>vl&z<;3zmWZ8}DrY6L-^img5lBUI2#H$* z0akko0P>o}H-ON|`H<;HyTne1Vd1gnO>mAmzxJ85$Dv0ZD5{=DI}Vy&9aF_rQpg5$ z9ZaydX7w#*DTtA{i=X)8VX|_6dU$>E4%@|*+vBHxXL7LEnIFvafo(QC^O5gZ;SE>j zPf~DB&hUz=%}7jnLy5qqC#}rBZFpZE%4s>o5xuDXmhEli^cDVkOEXOl46_ zI#4)50?rMjib4S^HNgR&YN1eolc#e+8UqXgdVft#4crQXYTQuZAeYH-%3IhKYidxm z(zHyMIUMi!Jx*^D5Mh_&>z85I0-gAV)wcr@lki8;g{&E4DOK2Nv=_=kaB%dj4I+{mOA4e>Z`|I~kvtCnah6 zE~%t!6h#aGB$gx%jR}EVQ;lE@cLPupru(LkHVhgxz`!g*lIvMmsjxa1E8GO(Tt67b zQ{w`KN#3UrEw;|>A``^`i9x#T<|h^^t341y8Hzl_{1N+I5Q!%a|JG^$AuGOPDYxBv zPg7$%A+ekoK?!qD;r}i(+0g)i{Bd8=L_p$x{qsLK?@U3oa2_BMuZ7VNi3Q9<AK` ziO7Cpi3BWKJYis$2S{u=&4OshNDMkLhGFwXC6PFhVIWcgJ#y(`hkYjPKIO2lq_e6^ zK}r9Qy*GigqpZ@#Yp=Td?c3eyq_YP|f*_0ROIQ^|Lh>FXIfD9ro zXaJFq9Yj{y6=ao7mar2DSs`Rkdb?}g+N-{^R8`+jIt+Y2nbH5pRj-}u+jXnndf)S$ zbKd7Xhg(3h!2%})H9Q3EqWPCutx+V#daCz>#Nt*{+3#jy$41rT5FN*S0pTQ1_%zGJ zsBGIVYXkADKnq1p6uA9m=W&T%eD6tLYN{uW5+M;75s7wB35gZi2tr4YTK{q8ze7w2 zNQ^^-S#iz~Mv8(OSem9{5+@HooF{J^H6zP>(i zIsvG`4=^pP#H-ha#VE*S^;OH4=5#G|9hgQ+AceRRP|u5?QE6JXq+lovZi4N(8nqkI zGX^#bLNyO0qrnOFtPuoGA!D>^_3dZPeCMr|8BvDdcgmC*?`+&?2@z)QbPcSup=oy8 zDim^dyIshax_Y`bJ>#RYfn;$-wQWJ*>rsyc50%w3xDN-I@SrH4!yvM=hZrvQ@sUm@jbt`mJ^l|L1Wr)BHW61 zdC}Q|h{ZHb#$dQAB=KhQJdwJ)yPFM@x5G3;k3womE`&*&XPg`DHU^`bu5c3ww!m02 zgjr&xb4qVHy~n0=Ff|K9K@}Ou*uo71u>>)3ZNvp64k5+oMTQRj6{2_DK?%jEql zw2Oy%5gri{34L!aT4+e4q6J$+qyNs=2d-f+j&rl`W>2YD0ulw$|&$4B2=JE#Ig|5pG zm4e?ew%@Qxx~#sc7}UgYwEt+QfY}zuT}%~XJ@NRAtz<|?W6&t6UrJ+QxZ3UJOgZlJ zpTL;-Js`2jDnh6eB5sDnU;Ww%k%0LtK;mCscu5=+GZJ$My#*3ucA8>hfwI#itl^z? z&Kb5llp^s3=W}>1$BC1zAaRrkBBn^Z>+U;z;!_8Jhd~_mM$*5Qldl0D01Q+Vgf8~*4grk2Dg{*& zPx;rA`zKFmnspVrmNG1kZJ;B~SdHL9;8 zWJ;pKii}_(BU-v4%0TM8qsO@u&qa=LrKg*E8+-7FfWejSGLgpXuyEjqW~&ZP)$s73 zL?X#iGzMrp=kvIUQ(TtgA#rus*%}hl>Ju1=sr-zTi|9C(w~6fK<96WUH(ysmH&#*@ z8;Jk^7Kw#1M1=RAtlsi9ZWf^fiU0QMiPP+~NLfzSt_lLt&@;^jK)9}{SwP}e%Z5!sJ3h*+<9<6vh!E3rNy%v4C##3cabMvv z$2lfObp>DTMB)T)g#`JexCdJlq%m=d#Ixs2AKfS3N_Lt#-gwti$UJwtecIuUv(x#n zo%+vy(C)}i%j3nw>5DE&q8c`V6H3Hj6fq{Y-9dn4zyr9opPYAT;A?SBv$UnM#}-J8 zXbmAjuL=ZAE8pnl!A5jiAbJ6_YSWSqD6+~i=aksvD#*1ag|M1q3 zc*_|tY+<>^{7M)nun_10C~=?WF@0(S?9)7^e=R3+xrst53lPi5Ah%6ScHd(pMmg>< zk|mvHsSQXRiKy%m;TI~t*XH~URu)kQE#lFHX1jq!MEHkBz3S$&l@-g@U3>NQ@OLPc zg->3@e$x4z3-er6IQj&O58&kYJ%$ql_tE&s<29s!T<5uhRYdc^6H%J`MjSgd*(giTnmJoBW)?dOX zIZO)Jd_TzL3UD0R@?d!^Y@S%HVn&@RRx!C_of6(410)6$k;cRTy^++xaZ8Yxv(q>;iLu3YmkkMREQj%? zQWz~+{Dz8T<8a(1_P)mX@8q@BqT#KLfV7qT^!Vc=hFjey{vWR==HhF@#h3sU#XT7G zX45Jby1}z+Hta^deZvjEgLgy8;;yhFPMO+w_~D0^%Gq*Pu2vt?43+BJGG@D#D-_dy z!`v|`?x#y|n>O@d-*&U(X?7aCOIEuS5kaK{A$U?IF=zzAtDlh3VrPOFTY$s|qi~Wd zU3vL$hliRZ#~~BVkIpbwV=F=8n6U*;D!3QS*z!X&V#d}lFNG+A7+dP7rzVWjx#Jj} z+vZ4oCAzw?fJA9>)>cH1pxixj%ZDD|fq zSjVg?t#-3eD4{72sRs|!BLbY{5q87WFxaIXaai@X&HxyWNzP;EP{6{=kFwU%%lU!_eU}a=F}n4?MWX9((8pIz52B zix)4RJ$v@#$&=at<2cpxosLP{`TDCNG0!eEjAWpQw1q*YqL6w+6v1qP!E80#t5&Uf zvn6NGsS)*LEN`Z$8bEB)PEGhDoDgB2YdT`&wUic?WXNZq`dMhw)5Nl8! zt-%_9se9U)vq_OS8Y}a}fSSg{DH7MK-ndA-Nc=ZhPt5Fg0p-UK7+?l-F_rIu?{7dr z5cm?n;T2b04KVDvp(^U&B4FW1VCC}K|N8Pj_D<}wZBvjDL<6b~;1I4o0|Zp{b5qB ztcW_an;myM3jy%BpU8TM3hfh*L1G9$QY40$_=jhIQ;^!2{R@y@8-)%Pi3!v+BJE~_ z8Le z?uzNORYQmP7&l^Ehervkm;rQE3@&waMj?7rLKLZ%J%MxPkt)fK1>lN_cNV?L6-w1= zwNNVZ$kdxA5~HceEh3F#*Fv|<4ba61iJ^ewqsb_Ft%}%>Pm@j4>hA4nwQ81);@ig^ z{}21m+cOAlDt!n9^gsMZAA6!ytVoIqk!5XYaBy(oBOm$5^y$-MK~l0CN!8F_6N%#) z!rTd(8y>mr41u)!5U3L7@Of9OZQ83>uYK&%$CfXDE1!c<7^2^XEW^F3s6G}%tSN;1 z?q(C#YN=eXZOae6!w>(&@t;2~z>Q%vv*73m<=z!)=*z8^q9g|vEBE1LEM2ll5`5IU-2#cX zLYn)aUg=lM|3g{v_nQMqcg@D0A-emn6p8WP#3GY9ZWkYLJ+#3zK=rD;a9VfA$P z4Gz?D)wxlaAzZPO* zgwKFv&?T;75|T4e?^o*PfvyA9oP+TPKcl;+@RhIr6Zqe_{(SkD7hd9Vb{e_U!sbZK z51V*Ml<`i}Yj9=mnLqrtA2tLe2PwqZ`ZWwZb&?Q~St+tC=$Pmr^+4nFJ9c03civ_0 z(Z?JLF)?~V=y)MO9MRO$(I~}HZ`?8jnZPRdUGc&or55ts-~>|K_m@7yDLz&t zK+i+uQDyElX8yrfqedeTG24=Y`3ZQ((oIhUQz%db%uGqR62^NT2TXvg3h4@Y@h)kk z=Cb`a-*o36@4c_5+>8AR^(-tLw8)5aDk^3WjzU-_qk0kU6~l2(J_Te_c|CGZPn3Zn zw;2Ci5-{Pcsy0A^jA1m~p{}Sbdxz}_selkpf+fOKvJYp*_9TG^AH&=Uk7q<#B@GE^ zT;GYV1{Oe5je{a@+O(-q$bz4G$e{-wcib_x`XJUYgR`lMmSe-(fBDsg8`clxas~92 z9SdLsLgYNYvLhoSa19Y{!>225vl;O&vt?^9)?P?Xh*Op|mB@T)JiLaHbzQHN?-?E* zS-X1O&9~h0_FHci@}*6i2H}z(xWz5?XxV2=PG0#KAoQk37+-^BVV)!R!r{yR`;{UsTwiDfZP)nbUCj2;(QODmxGLlhYB1nP>8V%dPAUI6Gj zdGb`Vh3&70hiW(6aI@KL%cv@aau#5+u(uCYywQslFu0dduCr;{xIRqiH zs)^hT1Wtve$)u6Vd%bLb`TslWj1vbFcUm>il~g%@;ZHAyz|OJJLE-LKG`6E^&v^SZ z6dX2@m;;z*Z|?T9j{WQraBYDvTz>i0wW%5!n7CvyM3O00p7~ z&qeMl(tMPFAQ`blQfqbdg%@5P9IQiJmof544HZewjMc))AaK_g{0VDc@IUZ?m>(d; zZC1(3NLc>1JvIO3O;!CV_M?e7s1-PkNfBTMs-%(z(jBlxKL@K^fzjAdGV))dm{% z1V(q|MKsN+&kzGcM4DN#N_m*H7YwOClZ53)m6GRK#~uH^#_75jP-y< zCn&z+N(VtsM+rF{V#Ja!n~gs<(F3rTSrnF1YmvaB+p##&0%Td+o93v(G-; z-{1ee?|tt_KR&;1HsN~@*>CR$|MZ7R(EbsOBE!mK zn*^si5S=0ooj&o0$9Xbs_A6Nw?z;2#@w3x^^?G7O;^PYS5AOUt`-#L>(DbAcp_kS4 zR;v|+LjR;`rfCBh7Ykj@ruEzFe>XHRlFQ_)BTcYZ*-TLq6xxhMrf3?5QC=65v6kJO zHm(2jU;JD)r)RQqt5q*|<-vo_7zM}iklkv7Yp-$74N3!|4@fi_l%D4t0M0N~vD#iP zTY(VvXFt9OU^ts8+qRQd++(~lx;s0X%i?C1lvHfbnLG3Ne>_H#(H*(s@~fK-I}Efa zK;c7GRam8#u%yF(7emrnRZx`%JN|}~r%d|77mn9+#Nmphpa1NafW)?qY;aY{;BFi5 zcGF*Br)LGVH6%raQ)`N1StguEHx#oya@N`3bKMp!#(cgAq1aD;JipzFG^K zKejGbK@Wn~a9r&z#TkVicAWhWM;|Ik*m>7M^&An)dx$&DBF2iE85ypL5^9FPT*6&s z%uWZ2$_!+cgzLbs!f=vvFla$ytu%!uEBC=2Q~w>&%12Enj4aXIb4d&)DkMX z3Kd)ix|uFC?`}$Qw_Po@Dg0OX5EBkTynzz=5pPb!r{z!LZd!-hK)SaivvNg}dM5^k zEV7>m<_{J{|Ky1<;Q@OjjBL=KNDKKo+{CT@4E{~AQEx9_zT%ZvUID;^`ONCA^rd2g zH)FJGHbbd+S0x;0%OIZKIK^zkYq8P$-wnGiS~O=+jkX-FS-nc3R#`cC zh_&V+2OaduPajz*vOF5s>$#}-uuV`N2L@zy(UzPY5kSTU=0urjDYuPKLq z;^VR^!kJyKT`F~1CRoS(rI%bcJY-6u5hX~>bCqUN+=vtV^2)K62tGa$Sq@;0+if#z zWWbyPPQS6}H85ACBW*B40^XUl$lfhy>601?J@tA&JT4?zG-i_|6p-Mq-`_S)cKU;; zCuZlD#(b<>l>$kz1bSd z<+HZsTzv6w+NP(eS(JD7B16l76)A`LC<$Y-q%M~0ssW6tGdyLUsaq#{81N`Ry3^cGefm)Ba*y0g0Sphi z+GM*)AyzZnc2`$-quDMM!JRT`H1KS6{!H7k4H7N|H%K7(r0b7KPq8==`S0nGn3F8V zQ0RH^yoff%PJ^P*9MibO2oMh5QxX}RCoNIqI#kSd1`#hCFr)Q)oymhKMGK-aIMQe| z;GGMW7=cJkdNiTUl9p*qOdR+a2Eu5x-y+wS<1?W#WZ#0zZ<3C!*fyBA{Sv4f6BBQF zTtJ0=?4VBDw;A|l#>l0$J)IFDt2(5j&70xtW}LOrzuHRnuM@>P|1c8ceULO%V$t}H z&x9R)VI$U;g)h(MV5ZsFyM;(|1fU-&GlIt#GCk&$2r4g|`PtTdYDBac2=DNQh& z?L`Y0O_@BYQZ697KJpJa^gys%swU!!Q*wcu`QN{}0g#xo)0~=4^DB`bGDQX_BohTx z_CBdog@{59I47~n&hwWpdy~?d0Y5l)XQO2IXG;%kGbi}}<>MUOV!PNxuY&BAbjPi? zj6vcLuAW$x`M81Rtkn5=JdaLsl9tIbcN)xuE^A;`Myd_dbim(#=)p&qE_n+U8i^PP zPTPftjy*SA4{!mH7^$hru1*|}# z=xJIIcN%m(=*56hAhU}@$;1U&%0Ntf;ZNsd`dm^|$wSUVa_%l(vZ#a}Q77#zDL;Uz zb*Inh|I(K}uc#u}`aAEu`<<2RAjnkYY`RIA?nI+0lf5mPdNLm^P&)|s&w5Dq|grl*fMFoEUR;KCj)ZpIBlqa^_jKJv}2C_6bY(e zyMjtr30wz=iQ%tc4!{|FVql6A^3~!0u-r!Q(q1KWo#={D+vBv4FDgbc_ZUH1j~lJ_~yCa(bWBD`ZxV;lKUaIAPTvKsFJ!< zFty-&$w)bTS_&^R>}s%G6OwY?&h&spgyC_ob8D~kO2*y}bwwNvg-4MXR#~&rhKSwJ zbB{dq7}%wufnnDTGitWGyBi!Jux#Kf!=!rTkw;dpTsbr}^yM#qxu<)=(MKPB@4ffJ zEdWTjEStBTR1us@I~4s1)4H#^s;VHr{>1CTP$1WpF1ZCKz{0|-X)ZC1&_>tRa*D}T8+wZJh`Sx0;88~+E*kh0Hw98IYruTzoGgReMpZYjB z$FcxDa*{WuB zW8v$s7#L1qg?+Qx1j`wBB`0wkw*PQE>F=K98nX|NbIy3nSQ%{cJ$Gy+JN;L$CrwrF??%2WcnL^=41?I#Cx#&60F9#!Y>z`dkFkN5?P0>nZWW5zMsp;WGqA{^ z)dGCa=gO`V(8svDaEE;)@ONCRr>6%l9{aYUGOaT*GBSPo)Rx)66mcYx_n^UIt5xgR zz>b*CPsmb}q~PvnUEz z$Fdj@wc1wrMlmZ$wc4noW9+3CO!T%U;N^i{(Sdi8(&}B)RWKs<*Db)mYd0z>$O%s zTLOaxAc5=*33V0BW)m)tbzEI+G(;;LcXiS&JQ4i{Vrgo+WZM?N>a1;MyteSglTSTi zyV*04zSOQml+PuJw1jl5Gp6$VOjf6u63cR6((^cg@2Md1B!KvXeH`j_NiKOzQRbQL z((H^#pg1B8VHX|*Ol1hb9M{G+BVLfnTH0E#JSb&EPz+TG-kf_9NzU03Rj;bJL=%rDG7;ntTVK_CV9s>ArP ze~_kvW6}-AZFp^-7dI}2P>kZRSlym5Ai(SvY7(I13?F8%Ig`U#0cZ0uG{)XOFoq~q zXk^lvL%ad>8R4$^`Z42&eO{1zo8FO48yWb$v97p5;2mpS(KZ8^iikbXl%>zn6*rLCj~GKe2yF5F&G1B!RRJI*?dO89ki_Jt74%IaXl{x2D?!U&PyN z*k)VeX0ZZSbG~;Zh6{#(62eM$R`5ivj-Cm{h&;Kfde7zwqfdS1fzu zr8k^GbA~=~*(*y1)(*RMYf9Io&wS#@y?5COeEMA37-?1)y|Hv~Nw&S)-m@~5>CjQlhS5&L^cu0(5Y(j#>5H_GqmNBOyi|CH$ zj12XI&zY@8R@WdV)>PzzV0#bK#HJAmD~Mx3c51o5J37r|CqFz++j(N@zVMPKd*#1d zO#IiaC+3)#T27*WogR-XG+gp?!-!*InCnHO^32mOJp9n(LZm@>md|xH>TS53d^YF# z4$*UDA2*ix#uP71eQha<^-a){a(OG)FwWQXVZopn0 z(}+6iM6s0>EHm(V!$8OxIT3e*a4U;xz0s(y3aS`VRR)*7U@?q>x*Va5z3>8vL;=a* z>$tMeG%fD04DoJfcA9Av{F96XCh%inECD2+UTz zdy1iq)#9HivF|dl(G+AjM7C#$JRQV|L{3ukU5`f$4Y!B&rfzcmRGB);Jm9Pey9J5A z6>`7Q6m$W)B?8(`-?K9vEhpX0gqYb7AK|^>c>hL@w=nUzp+ejY?;MQ@oy?|=*pdD< zic*-R!C8TVL`kMPZL`R1RlFEDC&t+cxr}a58aE5Qwd{0AJb~OA_KB-7KIB5 zFpmex9d#*U*m++a{=<7J2NIJ_;xsHE55w=s3dFhPG&hhw7kr?B7j^W9=37f$0pe8Z zJQ@hqvXI)7&2FdTdd83Ax3(|dsV*nRPZnv?s*?S~AMU^7wm*2TnA3}ut_jTs=7Es0 zFGL2B58(2!id zJ4gG&PQ zL)QbaYIgTju#j3;UC*Y>q%Tm!p-8bV4+iD9wT9%lR;#V4I*&7i=FAKSOoii>a-~*n zP<#nMXha=c{G={6;D!f^%zDci_VwUMHk*eaj1$@{b(v5VBuY!L8j-?v#y%=q>1bmG zId#{#?uRc-qEbaU?&FJVo@$iY9z(9JO zFKMO6the_Q6UV7AHuSi4lD1-u(s?yD$d)=Q-8+>TIxR`^+{G~gap&i8M_fpmO{2eJ zS~xo~WORb~$x5*#1>-CGzWjVSVqmun&cI0vzDL|}NuCrx1)`(JK#p}2$^CX-+m=YY zWdtmZtu0C3!;W#_xPkUwHkm-x~dF~i~uULKH&73 zGvMSct37-6>}Q^N=9E)Tx#*IMVfpah2beEU2zw{@eezRB+c|9XJ>RT_a@YXrrT66d9cRlswujLDRsk~2W3FY!`AKO`0(Dl#fN>&?umomh}&APWmOiYC|q>By@GiGf0 z5of1WqO9u*wlmQ&lhjsZanYL#HAV2<(Rvx?aHP(9nr#|w==tICc>a%Ru^J}b^E$HA zMd7Aft^}ac4KzB`qdrO<@DHw@n87mcKc7?ti-M{N`R5nB^5;jN3Ihcdp23u%^@D4p z4n<6jmPY#%@M$GfEyr9dni`7QJ1;3n*qf5-?=x?Q{pRiNc>o(!>LZKX?3(Y3^I!=G z;dl8_9IxP4#L-wpq<@$91u-!Tu{S0aWlW#C7JCM?rxhDbjN_@in9RMHNJfZUZOpPc z4EEVfPKj#=L#9eGBy-yzj4hDN9T5a(950qshu zB(nz~8rx?H#}Fbv(`<2`AeYO56N8La8{VhsLAH>uk5u!eVx!uC zcQ^w07kZ(B>b@4dV^Um#>t~7?b}_PX*WBQD(`@H*S@>B|z?pCgg}i0a-W~x4j|n&# zJ-yw{W-}?qi&^Mnt~1~W9&-%w&T$xTrpEY3*%}@n1(u9sYv^;bG8Z%bq~%D=$Wxv^0We3-TMrB5{nKLIiULo@ScF;!71{23aEMCCHou0ILnx zqh*YM^jer+m*N)x6-`b|xPc!A6DFgn$pl8dT|{P`FHsa~APm5d5e!op2M z;SQE{(0RXOaaTx(OD29_=dOg1__doI=ks%b!buUPgT?;0D1(z)uObbw)o8C?wf?u) z-#ju>_uAsLX)^~0YF*`CNmOg~s;*(8i+zij-{5=OZ@>LpD_8Ef-+qri_UH4?JMX*S z{VuN&h=FX^)H0f&N++Lu^7YqTyVtI}tDd~)?t7ho!B4c3QJ2lCT37q!ZT6V%>6Rxt zwZVGU&o2A(5@9&%*C$po#q)lAj-F9B4sTe!Zq3l9LCbP<)lg)uX}92ced3TqWhv4~ zdlW)l+)9cH7yat0M$Hu>jcq2SXyTlQ$STv)sN951HR7;>FinLGQbMXq$9<3`Z$eBA zzM`9sEu&8A(Msdh(SCS*tH*_Kob0q9BBR)$!X7W_y840E6XW8J>6~$jDGKF`TzdL1 z&p-LZv*68T^&-k>$VTEpP{}4~caUxrg?%xPnLP9`@!z8u+T%{Es?1geo3Le46hHcGv#3Rg(; z4z!vA6-T0Ry|RoIEMe%v^HAw;Q6GoW$Sm`ukQ^94HilI?D8{0aXi^QEwqr5rp=fXr z;2dIHi8@Gv(L_3r9CD36zz@Z{Sm?~5KUqDQ3%6X{CQylpYm@o}et>uTV%J0v(^#i- ze9~H!&V)9Gzdp*80+``8b^*1JN~Kc0(ak^#X^ zb41Q67O}$*Pvt_s#Plm>Bm&rX6}vqzu7P2SR%)im#j;E~i?b=N9~vq)9ih5sPm@qRi+ei3(?Mw0vr!@)jNN;r zh-OGk=olAwQ&iqM9*e2_D8%gIQ5=d-NYBtmjTe=j0MwpyXHT(2`J8j!JvnsvC5H)GS)vH!%l4dq>*EXNe!N^!$`u> z6-$?1a^1*KJ4RwOli_AaOolV;MB0E64s^tf(V{DA9;Im^vD<0%qD+?!R(5EK9Dj}I$yHb5PF!*@bn z*eu?QwuOUZ_T#9-0naK);GSgyuVtm9(P124YQek%ciI1--P>)mSjxf@0)N)0`;xJq zSmAnH+!xe!7RVIHMsPIXQwJMrnL-;aBFCm#$8rFANu)v#i1HJ2kFC)JMVfPCf;%sM z3WGvcs7U&dW8XT!QQS2r(hWUDnH_fGtjQ6ja1onjROhxF?*C(wIg{BX65^dj!S`&g zRfRvrNH<%kH(M&|1PN5~is<772D2N>GKeVr|; z!{%kl7aYgdwK|Lj$2vA?9U}oPSL8wn?j_ejTI*=YNXgz*j)Uob9$Myr_d($bxu62x z(N)s3R?Ep}b6mK^4GnqMnO#8cuO%fUf4KOx!kCF*@N?p{`V2F?f6U|*e5Rfajud<& zz&|(#7|}M{4Am0VJ?oh)b~?(&b8czAeNrx$z$oWE_`8#Zj1HEWhlHT^IdxO=grh_Fs!m1PV= ziNr>&S;!U)HE)?Vd}*$bubIO^CK!oEvi;c&*2YhL>4>+67Q=&>QJ7Kki}zjk2icPQ zyZf)Z=IX(b4FcSafC4_6q^N=txdNtwvY9~eXsgkOFC?x@@sf+Ksg2mkykQlZ&g^|s zkQpO%JWsG8E#)EvM&d~D!AW1T_;p1Ngm9dCV&QMBe)sR=xFmFBr}M&ZZ@P@ur$zOq zCMV^TxIXxUswd_KVa&@2#e@v$OF5$(xzkTP*J{~?Tm`F&)hws=STb-FiA8Y~iD?2! zah7}ZwmW?gWEh3*0}lDvp8M_uUU+~qdnzVT>AqCDFHIx!oh2Cuoz`vKcNSxsd?wFP zk>?}ziFS+0OdGj&8wGOF*Ooa|sBj4o*JHqy6bhw!y{;q;^$@!BtnI|Lq_mHVsW1wU zz>?PGDJ+-EgM$N=O1TZl67s%fV1;hlvb~5_WZ$8}(|XP-<11l}gWs4Vx-m-MF!(V#%BrxO!d<^l;c2a&+G-__OED)C$T0 zdmgxP>G}t5zOS~X+O2nA@Si{Ko6u8l4GOSi1vi(;*)6N5&;w2(&LJs~kvEDQczD{J zoo?2>4kQ-RlD3%lPX|*Z#>pwFDH3B{TY|(86FXKrmCfNy73YNhDs{L2ZyopDj+i(v z+;-=+U`BI!9b0i_^dO-xN*`oBam;Y(*eAx5pi5eO>G{|HbpJ!DnsM8KuH`&8q%@jK z+lK=0YKV#aZ#b$YB*ofBQM|Bm;kj`vMc`-4y0Gs7JIy<2FSFe!cY)oZLMGmsL+-9@ z+df7}Z7Se#u|FMV=P2IASlLYKp3!k}m~4WH%9cqw9+>EJu@8@of^f)fZu6ci3vP%M z5C9~j=q47Nh@3{|t+CY1ZQ3*l_H^meOfGA;E#BbZYgQnt!y*>3*=XeQdAKVsj)IV# zw+$QtQXQE!wwt!?H%|Sx?dHrJZVr}u^3~c1 zfU)0>az;MDSQuuMi^LicVq!%WOAr%RYYt_nJCT_3h_T8#<)7l+VmzYBR0D}SL;)Ta z@u^`xqSgP5rl1zx#J^ToyZG;*xOlEmxt*a8ZoV#<+^BY4M{UTs?7I z_)D`P5Rxs!NLQu&vwwN&4~wM{T>SujsvG3jB`3YNqKa66G0PZV{~O7VL! zA!#M`TZ$Li2OhfHp8M>ADPF;&F2$BkV5tyS5MpACWixs1a{wzXB$^dzPPrL;N5OiW ziC~_EfMTGwp>f_Ht2vPzC58ZjEL2HMU8-f0v1E%1kUaQ`wrPWBgdvBhqkL+8D$_n6VM$wi(>vM^!DWO*^#^g}_&XRgzM~?- zrDBgX6o0@79)d6`KE{ZabU78cW~L*>DucL{g*&*q!qbHyUyV6I@NQ_#_l^bIct04& zCqrfahMLwfw_5G4a(A=Y&gY7+ytEJ^iDgTclLAS|DeHC{KgoeIhJ%8bbblJt{2Ye4 zTqri0HMn(6Q6Pqf_Xa8Zzznj?HheW;Bn)aHhXq|c*Etal4-tYDt#b zw+y}!Of7iC=|V`dMCk3o#G`SLC}m=mig0(We69ef1iyOiwS}+0zG%bxO_bx&AaaIT zE*5EFAWOqa@`yhKhC7ex8=v4H8K%)QvGo{Eu}!|3;m#3^Hoe~V6#hE)c+ zY^hc?Givc)zxMC&RN)pU_fLcMc-UcwtzW+$u7C2B{N~QAXqmLeQ z%rVzqd+qSZ5YI8*H-T{@|4c6xP;eJkB|2@ntmQbARl>Re?5ZS);MT*R4AzE9z1_BA z4~l~aA3g7@-#RfA{QLfR_mlTMzU0ZpGs;tE^i4nIo(3w3iQ(UyAu-0pQG_wE9J=;6^~CJc{O#25{(T(x-Fxrs z=!$szo!4Vzqv0NgqQ-T@?9F{}^~5owB$g&hYX1Z92um+4c;&$d9>s=BC<$qBhx6DH z(Hcax=0r}R(@06NXFXa_5yUhiH;(C*VBW#I?svc*wqxcC2HY>|PIGx2tN!|2c}GE$?wA~H5@%VFOi)6@Zys@O>J@P>iQ>}zI6j~0xDm?VT}geq6G z7u7ql_ak$+-DT$;!N;mpN)U(D>s5%D0hj?u>Wv21&T`rW%%~k_T&c5tz{x|ZppAm` znPPN^JR@q`fE)tJ4M_Yw^wN9)ol^myV`#9}HXRt!GrsvM9lv#$UjgCU(ZZ5kjqCyoN6trpMO-39|5)FQJb9ca$gu!B=fnKRLO3iv zAXOc9q;NGgn$_KQ-}whW_#QkUn4(>k5_}`er*xw4yCSjFXqr7eJ#cGqUvSRe-d=D7 z;b-2M7duu2tz6!R#`3m&zSuS`@OS@k?|sXbEzjr50OG2GrSq7cC8rZv>j9D?xi^MJ z{qhv-co-5JKuSf7!IO)G5WE4`F=2hX9y*${X3YSm2J1#4kigWaPSTj ztkJ9kTBE)!5!&HfusI6l>I2tPNWvXEo~RN;)jGDYj35qI;HE{zZKDPpJjCJZ@bcAf zPuXV5h+BJj!GoVU`IECgI{DPEfAxy_mpysQ6V@tca&f}1e|52x7j4mQc@X53?WSKU zl&w}%Kr@Ohhv9L<7)L>F{x7erH@tC?SP^-KjK;(~VydJi#yp^2b1)AuCRU{&!f0De zHXULu^mLX=e;f6?e;>!kR56u=-`{>6ZNa(p9&plCj_ZRzsCr`FC*F*)6?t;bs66x3 zi;q6?gzG>gngfSeB%FqY$V{x!8b(1P{6xAkT)2=_>vPn?DLXm#h!fxx-FXM^w$J{% z1|jOVu{L#_RLA>D!7r)(il{CYtrs83?q@?l^}BjP3dO%=9|OJM z2(CfwD)+*P-&wil%{P~ZVkLzIK;V8u$M(S1=d$H* zfAc$UzqK}(ElMzcqT)Lq3zr5#tX3we3P;k3eI&XW?r>u5V@5GrjoOrHGuEwJLvse% zKnEXu@KHw{wZlhutkUjYp7u)_`q9dr;}{BFDL0yo(*om@^|y>26X_`(Y> zT)1#yh{f(UOs7IF&o~F;Q!bb5^*Wq{YRzNIg|j`e_1IDn9I`Or7=i^yNox!x^)0Ij z6aVrnF4Z(So73v`8t*9x9Tct3B=dMLNz=2-mabT{W({14k2gnrp5F|1aYLdyKpNjKYkil=M z4%JqzS~WaWg(H*$62v0V&AwY)wnUS)X^VPOYk28;#7tLtBOaFm`Gk?6fAjj5yZs4>!g}3=|&_2 z%zuBK?%(xsAq?)kBSB)RBK+=mS5o;3?&Tn+#gs^ir#{Y6B`&U|`Kk)+7Dws?ggd}>c+T66Ude7bW+ZHU&tRN{tUY%AxA@a|eR z06&f;j!!_c7jzrgB{V?kP0mk;j)Faj6;V*Z*kkA;fKkO3Nq{ROgClLLRVoxoCKIsF zZZ@m4X3sq6;C;8;LK>$ycx_m zTqMkmd?9PLtZ#hd8;2fx=x)1x3@;;!1~zPbd(}Ie)^E7w_qVy0`}&)UhBggABqs}E zwve^VW`?LG@HqPWr}XyrJ@wR6+ig4hv&VgIyY03+_0&_aP!gOfMXA;6{r&v_Mf>i% zZ?)c-IB_C;QKQwIJ9lnh--NXrHk^I-Spx%uD_6Yb+Rnhnjgux#0%T2#xp9+%qM2sX zWI=o!2I|%Bf_JH5%aDLxyj6kNql&QNBEh}(x+_&pz}-E;+gxOEoS(S`l`~!h@7HES80&l_4dal3j<|T`lPMta(kQmMYF)qZxa652Q zUh=~HBt45L@DrUinK|UlHh29|{SCMwrW%m%h|9UvXoA}fCRhna!pO1S!(Y^>OUhS>-cM%A^1-%iy5 zmdim7{HoI3Juoov+2cR^zpuRPymQYzcm9vEb8=yCWEQM^)+n^pHy&Q7Y?4m;(n5St-g~2@03`8o*<^{u>+Hf zrbs|)$|j|-zn+%;3b?6Tj$gS4F%vZG0T ziDOpe%5pt1=^k?>C0O70Sx-!ry1oq&Jiq{48}_j&B+rd4Ga(IhT(?+Gvt%1=+V02ly1Pg$Z*6Z(Fa}8Qy&>d zk0UT7ZH3C|-}p|WZUGXD0zOSeiba%ox0R(s6PTzylAy z_~MJRnd~EvK62AdH$C^AEQfAZ4{)~{cG+G+o0TUJijEVI?!J7ML@mEDzIWd4`SG-Gwj6)Q#-sSgJn ze9)0c9(mlcpN07Q!9P6=f%4L&OM?LIra;A7hNe@yi0*2&N`>7z*j(^bOwS2XTUjGk zIm!)EdoJI0Z2+M{F?-3cf04`UL1+g7R-{B}P5gU6VwjxOk=C;dUNDSItyTkPqSiap@d5S<>;cjJZuxNI0enC)nMDLVoI zE4L7J+HJNSyq(YR40mc|@y1gfU3f2-i|`d0BQHcsO6Ngr3$c>Maob&8g_hj}NZxP% zz4zLCH}tpy8$vHwtniSZdg__gtJY7SJ|maOE?c&=yQky_&YrvP0;lE06~?@?&DFt1 zM`P^#uEd27K`AS9+Bnu`_M#})4Bkf-Z!HK0EA1T0ec=@7VT~V(( zjKu7>km!PxdNMH*cc`YQv>gd^I1+sDi7~eq_{)|q5y3I()J9ES;uiZULPtjD!{b{y z9*!dM%w79_@r$41j;T&%Iaspd(9)yG(u&R~(8B!>+I7DJ_iVQt#Zt~Pt6;4tbu5w!lH%AT>u6&W2$ESqX^AwYz@<>Um{~Lq z+YTZ(8@JzsxEm{hRw%>L0tA{gX|ma}-+5>CGktZue#2;R9e zhsP7pj*=N-I?f&X%rdwQgqrwy&vw#!Vp*h((n$ICx4z$~qN)HOF+LIO`izk@mrn8L z;croatGgR85BHu?;RLrl!Itf@=Wa(G`Kf>X*MD2GWXauk-+k$&mvZn&;wL^pFJBKg zg3K8i(`;jjE=0Q$x2*R7hG);7{l)+91h}XLFTMl_x_I&8TW`JfsH2X;RYAR~d@rOz zEUGO=Iw3kJC?;&TIdbv>6e@v8`dg=e`;(viWUJn|@4oxaJo8LUNREt9Hy-SrRU4_o zy}&~Os~S=p5CCCO!5&}4kV4Sn-q`K7naRqQ-MZ!0>-`9WV@kC6$trzMBF`{6S1e!k z+8c|&styhgVtK17O`kq}uf6sNT%7q5HcH8cfebV7cQ@ROEycLWFV)OwT86ys4Er1s zN@BtC^vHk51Q=W-JX2Vw!^6X+QiMJ|2%=zlos=p(hP7zs{&q~6y% z!Nz=5l*Yt>#F9|Dc>a|f6DPAPWS#uZm>4Z>MOV&HRu5_&zK{h>4LMjly*dIp_js45|+< z71DZQj$+??Ju&Y($92ht5+0{|Wl<5wMdG}kPmx%NNGKJIha9_L<07%2)VXr%Ol1)d zQnTtjjxlRw9dO8Qd+f6d?qP*)Mi(I-MN@8b+qDpUbF3TA<}90IEJvgqz!uslUb4J3 z&K7iP&0u&hsMuXlGG2Ri(d)0jxo+(SoYhGE*NN@o!4S3TCT<2BnFzy5FjH;2?L@xd zdXi;(n2HyDL3D9}AeT)9c##Fw$2@10(U7wZBWYPpFl}z&YKD$|hy<-vtPBrVx8Ht_ z>p8aFg1_;|`i3OXI8+_!?d@r`;jg5LeLaU9wEvvBv&>da)ufDpx=S1r!_((d9K2tR zoeafK`UG&L#lo9Bv!Lj(}>EEr7n50Bc>f*??4w$FSW5|&cOpi*X z;y74z#3}vHfBy5|`qsAq>YjMwiLab=68r#Pv}x0(sZ*yCV9T9-qT;-w47dl!?M#l` zvW$kxz^afL_!oa2u_{b=4PyFf^*REeZp|9uOd+&xL*iuuH>vgQTgx4+~-3cBd?jgY7XsJwWlmdp(5n-fR zmUO*SJ+!!)eMoXwX&roATY*kefGM|D(^|J`;GDD17Xqz+(sVIW3_at!&e2C7{rc;# z9eeDtFTM2A%9SfW@rlFXS)cQt=l1va|I0u9^NblY&N$-?vYFb34IAJ_BrI9P%@Op5 zseLEd6Qp;jG3AZt7!6)t;AR+DmnYX6E%RwQ(dN$t{AM9KEtdaVUVusvFU?}Iqq{uS$0!ZP#+t>L)A6jS>zp778vp4Zb&}m0MdG5h|zNd`ksj5Q<_30UTumdhdE{6!L9STrYSioKaQHq} z$D-m#mP%|DN~&WMS&o^Io^4_suw|JDPOW-xUmrY5xZsG~8i;W}^O?_l;R|0l_}~NY zx$~ZX`ImozkFf+MQ)l6yPQU^qJ~fDJbJ`Z`N~0iO(3-8<&9__!PB8eBxa%PV;TFvk zI~9>OM`9FN*B^Z7QPg?%VpZ{;uFA(hewf*64-5?5cFP^rkybw2-D*1JVt1`x7bI|t z0e;Y>hTBK-k?q2RhChU5(yG-;-CY@c+kE(@4Ta|L@&Oy0M3IuETLfA{-tNi~M;!6dkM3~(PtMzQ z*If@e_~U1tbq;un4?X%2JnpxbuQ>6<6K}iiwl!0TdZ;-nmcTu zsRCyZIf2DIft;2yC*ONLG4DFZb;)^RnZ~j8R*`tYv#&A|1FqmqAtdIUQiP-;l|+&e ziHQ^)G0lPZrLYp3>RBUdtH8>Ctb~P5Kx7^C@jW0W#t>2PbrnKUjO|>`Y)j;zKE=>^1=!@X`@KH-vbg*BmhiGq*3KA?o z%W0?@7E@_PzE*7(^4+Rp)M|~M3B5!n@@nmq{`!@I`fW%=S`>v-UyDseL6YOxk4bs*q%mw57m9KmSBF8bKI0gaDra2C!Vla%7mR@VC>ZPg%Zvc_vqYi)YF-%o)9Zi*1dkK@qzJIS1PBQd`t&Fa zcY-m`D^5hS^olsPFYLI-W90*uqmjXvRd2oV&S#%_ant(R%o(#45ynleSBGJuO`kq> z$({LdNj4Scj7k9sZk>28_W{$k z-+)`iO8I9$`&nsX36^>2w{w}S>qSBm6N57l`l=8X7>Pwu-3*Cw?@ba@Bo0|OiI6y^ zWs!)7CX-^h>n&dN1{R=T0V%eH4g*rl6l95+t+Mdp@%MEc;OnkCZj%^^=k7i2?6c3J znqHJkByv`pn7~vh7H}FOt}dmFqWZq-i8&^Y>ykt2CrTK}k^`LUmXuM(R!+-3`}E5X zKlGP$pO~}Lyy?v`G3`1d@0Vj@X{>gM%bF%aT&R$exp4U@{=9=fw(kLZ*mf&l$T(J= zbhZODX{0+H_+nfitZ^eefpwK>S4na^`sVT-A$Zd=)~I13tYo;fwQDw9d*uz4u0F>W z3i-<5rlCT<|+70k^v+h8E%RK7HDF@x9_P`GRxHrn`=icA%`~G;_xpj-v)u+zc zXYci_wf0)ixEP7O zypSl3j0@aGY~DW5$MoBrN7!;LD3<9y`RH>imam6s{I*-~wz5_UES^Z|;K2t!@W6c+ zUvlAVuf2A|4L3~x;6r%g=bZbO_3PJ<`QsT6J@nA<;ln#SJHPq*Yk2x>jtrGYw*X;S zM5Z&2kpzY+wBm*egRUoKBlibF;3&|vP?S^~z{ACUM{n`KfFmY5CPhPk|RU?XzD|dGYd53P8*-dyyq;_n>%mGf&~i&M#*Ndm7e27KuI!^5Vxg* ze&6cVD*=k=NxHkcD=KPW@xYxz{Nys=2!Q4A2**a5YxzAJ^-x)i2`m;b2~~KBSiNg| zSW*smugb{M<63%mcT=cD`eDYur+@VR)Tyt7cYM=LH(ztr)&2VQgK<_=EtNED>w95- zLQnhs8eusEZ^pIEj3}{@Na?^q2OM|e(Uygp=jaP#+>AaD#MZQ=C8xp6=ejQ($L1xZ z_hLP6XOQaA=tRa?-{EeZI4PaNUPe?9c9Fe{CDhGGBSUzSMM3L_~C~i zKKaB`V9_X>8`;EiG+9e!QmUk8vgxw2GWab`0>cxDMx&(q-BcBbty$By#2kO8MkfIL zfDNs!t%kp?tE;>7&f9Okc|tOghG2K$lBEKVMQXSukxVj#-U-lGRbVB|1lDmM9Ls076sL|SdmwKTKJO>Kbt*!e$XF;d-SP(8?~Wi z@ZJcinV3j+3bN4D)Y7(NhvW~!<$d|ZzrX+f`>((Ln&wL2c;ye)*Y$$O0!~0lxGWa$@`n`5$zrXsl_{?%88_~4fXWQ(WG$4zh9x7R zaufs4j=JMS`FpRM=!JHgoeg*-#Za&S#m!Fc&YpNae;h($6(;JvlkSgpB)g;OyC&Vg zaoxtBewy{|*Z+>iy05(Q^3lg0y=KiCa2Y4vc{ljJH&2}K*kh0N?bRFR19*+|=FLmQ z%U2UsS_NT#w>T8dA>&@a_l_gYj`Jf%SsV zJoO6lPXAVRnkhzN%!-K;*|sD6;SQF92LmXzA`wZ=Vo!*Ep054E@j@ln|2zI0$6;MO zdjCBf>mU;MA6|dYJ$DnCKV)cPiOLX}mjbmQ|HFP_$`MW7SdQd9$XBpbu{hsJOzL+y z8KsaU?bij%X?B|Nu=tb4#56n2;$-4bEQQ7V36U$XiKoI6Hhtj)KgCcGYVE4bz_jM!y#$s3^iD!?8PAQhYNp|F%6?ztk~h)4FD9M>>25MqM=*V@_|2x9X2j5E%7ZOY4Uyz%z+*Iy4I2#GZn(u`)R zs-mZKs>k5-X*7G8NG5X6m&_(goq-kXo*OPJm9T-En=oO*Raaek;DH0jkH7J5!+{>}YjfQJpxNu=Ag(}zU*Q}@ZI#N~v z3oQ~Uht()55c#=qwzl@xP$-Z!Gq5U;K4!%6Cmh}0(G&`+Su5iYU~huBQ!dG4i==S( z_P$^f7^mm)!YA3HCKHO{a6^PsM;?E}1U>B-x_8gr51JWs)21ymzyJ2V_uhT$t*L+d z)1RJv>T#H*e}DePpMRcx%{A8m`i>qw8iu8#qYVbIrKJVNjg)7K5ZS1T1~a)=pWZZ> z(bI_?I~w3&OCsi_h%117eE`)olLXJDxwRE3;TUiWuxrt;$P6q1CD~P%x$K_HYY!;@ zV%opjf8M%z&PFk-y#MyJte4?oQaieWji$sJ^R#N&jdI< z{@LSakLTap@!$U5-GBD@tG!(h@7a$$FbO=JTy}boNQ?r1$ZsbX`iW_x^7r-=Gr4lS zU67a|YNI5TMEF^XkXRPg0up;JR)^6pCi(*r3?bIXRx4S|Rin{KpG!>>q7O2DF0(5P zGX#lg?KA|JVEa&C)h1emn1m-qTcn>D^`mUcDuug{_~x7MnwvT}#+Qs|D=I3Ii4@h`NF@`dnKksxdFTIS+Pm*WA{DJot%n?P$hY5q zwf_MJ^Mcgb?QmYL=Ih%TWkX?Du@K(`RI!$E{VXFhC{G5D1l(d3z}Rva9vlWP?Qt2> z++}!noMSpvwMFwc&G_+gEnp59SO>;^#K@zAfyh^%eHHMB-hBHXBS(&?ukQtG3E_b( zd(H0yTkMfm(R7*st!KJy_Rt}Nz_Nfh1sG|XI&N~<7VVj)5`@8Em}rUkAYNpJT+V|g z`Y`h$AWj$tZo5KE3`m?zWN8-@%rc1=lks@pzI~gT8^8}3bkINus>X~tdb0$3r-Gg!`^`sOPh&PGhM11xzo;M)y}DK!L( zN?f$gm7{E|yu@d8!|yBEuztroQ~wDwB%qbWVhQm7V65O#ATxO;-PYDjYI@uJf#3xf zTy)LVe?8}%b0`&!ll$pz`j0B*|1?lU0n_MbE3pwbp8d6jg8Z%e+Vbf>c)Qi z9}oxx;Sb|Un2lkWDlmp{JHCLLF=B@f8F10Xe~u^Hd5JMCoh20j5P3@^spjVUgA1$P z&9j>o+W~r@glV8#ia0{^- zJap0sB~oQJk+42+C~M10vO~bK7_0V%OnXD1|LgG{`1jk$`oH-3-+P|lI63_(xEj=P z>G1=W_0jw8gup6Sv9(7eris1(g??f_$2^6XL*_r1Cq6A8G0$OS4E7dGu%`F{i3`jg zEZHZf*=gK(GaOPJgepU}nWYt5bZ3Y*FktaiuHSbTA%WtU_=uy2>UskCee{^DP*;E_ zQJr8KL?=9xl@&q~f^`e{)%kuzozh2Oa#cqY2G=79aGl&oAAR!cFN*>BJR26UpXimM z4nZoNbS*QU=!Dq&#+$}{|NZx~ex6-ZS;KMChV?6bfofg~Mal;1@!pQzM^^T=&7kY4 zg6Jn0B%o3^mFacBy--~wp3+#jIWg@qxQT!?#&+5^8x(nC)>s&gy&g-N!-gG@&Zh6b z|M5p3c~Vc{UR`&0M@xIhpg{-v2myUOft9YDAOSX;hE4PU&>aDcmsBQ`O%52)|H><` z=&0~+CAF`1jk-FJ(c7fd)l?vUVX*y;Uqzc4v{(mfEIA(WD3i#aPPyi ze12pWED45rzypTav}OI&x88Z=@yD#JT~Sq+O=o`mdG<*s9Op2$BrreC{#hn%LSPf; z&6|JA&9_0wvS8uQ#~yonb8{=v^+TPRHER~0eb$AmSFZ*G1Yj16cbRFO#K#5)GnM>^ zqFA6vWXMwKPQ(GdJVFo#Kns?4=FFL=pMLtPq;=9%YxnpJHt%%dplP zZ@uEW79z2S`^UN3>D`c+dO0xn$k!`W9fTA}CValYrj0v(oH=jnmezp3G~SuPttH!m zXwt}}U|nzBx(V)X#b;|v&+jT<+fefHV#tJSO5V7U`n7x2_ZjT!~_{?kuCkq$%b=q|5_ zke0LBSPVjB_vvSzoHS`tXFK41EES8%S^&J&s;U~pvV+0WbSlFUZBWa~0(<~Ajl1cp zP*^e?o$$nv5<<(y9z_%`*}2{e{rxlnXcg&^7eKd1KQV1J+}-%1y<>%J)|Msz&EqC! zGoG1YdiUBd)|sH)4S|3kK2lp-4WmRhu)#NVz$HEKzyo2uuUfSdCJSkiGRw-!uo^>_ zSze$>Tvb&CPgWB7WTKnyvLkU=B1u9Q++=~tgS!J{pPM0$rXV4&Kq75us^}NJINuqo zPL~WSGeo0Q3MCe|b*yUDT;F?dy`8nwf{daPn4MxsK@3OxRs?7yTc{&+my+R`z9-onkBw|OoP z0evU#+U?d(tWAXv%>y zdt@SBZyFF8*Bhq8@-pX=T>vE1^l;}4)zSfp1qjlSh(y#q50)*`*otrynf0Y*o7+3S zJ!*6)k=oGIxCyS$Ft8e1mE~)%zViC(uN!^r(e0fb*asr8*I$1<*y1CPJi5CpUQu0L zQ{4-qD0D{z7%N*hQgEl`6(wWGUINz7ACMEtE>%^?m3YK)$&myht`K2e1$BsXdd!N1 z^>+?dhl;Mn7LXV@wj4$#5*kFB*EB7oPoG{37R-C+-GBV;Z+}D1ZI4T(^zuj*&IB^% zB_Y4Svw+-%{YZ`%{h=VlovCCR)dtH-!B7&-rPS+hzCL8gp+_Ba41f(-e7{z5#T8eq zT(NBS+*zJ$&HU**k>|kh0gBvk{dmvzWS{Sw@4h+x%(LLCFeYQ!zg}}qb93{TpMQp% z&>Zr50@T6rKE3LeFJIo()(Sx2*j50kMO-ki6bvvt6)-;^jiLfiIE=ZFUcGuPS-fcJ z;-zPvc_vR7xM0E~rRyPIFv$KM(4NTw53X-O3e>snSJpy=w34j(>j;J^VeR^WNR z^2)35MK8Vd5(LCBRxm%)=@ejab8{oHZ!)R6Le~wVTTDKomm8M>{3W$FWX(%hs%x3=b_k@uHI|dsR(&=B4HZjfu_i5;64B z^M4NorD%5tFEMy)7O98jY~pIt_^Z7@%M%2`b1M|`3Za5-3$fIpm!r$kr~Iq@iW!-fr! zNU1Cdl8mLKKA-yhGtVA$(BR?2M+E$#efH`9`4?YZeCaLA7N;!z2+uqytylT{HE|uI z9NR=;1s4C$hRBI*Eeb9+B#W+Rc~Tl{r)=;>1VCcLSe4FxU0vP6aH})f2C%2C?a@H6 z3$0k)0to(9Ep^Jt+DV6!MNMOZ~z<~ z@NfkzqM#xFiH_$|s+G2)A+Fb$^BU39J~vq^9{Zx&_ZdPiL?!i&(dX=w8rN}rIC^f2vxuO_R9+{8M}V%+RDmGxV87*dH0-i&XGyN8FeJd zzBWvNA7*^Ne*OBA|&u$%DWyo=lMSf_zf6kq=-7Cp*v0o;|y|y7Ktr zkKeFi6Fd}_6KM;n4Y;BzHqA~05;F$TNwGXy5w<5Jrk=5B*n~2Zb!?AH3kS54H{STi z!e5uv*X^@q^Nw(+Oym_BsYj!&UELih_#tx7Jp0rKA581)?1otcE+b`@rp1*s2!pu| zF)_GkaQzQH_)v9q^_VeZX3d(lWYHpwEE(_h*I$RAZCafIggm6V2m{PD;B{rf}c439OdXJ8PBPLV-bv|v1^O`CS=NhfEL>0oJD zS!sDyZCxsf&DOT-NHV8tl5WH}-n{kBTf!y2lpePogM{yzg><~Rn7F9FUnp#j?ArH_ zn&<`lK>NH4{lv^}JA$Y{%EA(pAA9KOty>zCF{`e&AJ1Uhq-!A!z@R|`!RI^m)KhP} z?Y670zQ!`088c?UfWXau`R~ucy8@R{*He^%4lETo&=iTm$)L)Qj!h&=vk*ey-j*zj zDWZx7*MNMY#C3pRrna`Wv%BkvBS*!P=~yz_+`P#S>b`@6{@#J=`nt7?R}$Aj;-Bmr;B4^j?&$b@yw<%$f1gJU?gDn zqM{myik1%J(D&H!TF+p2w6+tw|yM=kRD+=Q)$C!@*5;H{=TZG>j8$(ISajtW;xSzP7 zPyBoPiAkxiTR>ubAxJC>{2nW|XiU6266g9^B`g;r32I$aB-C;uJ@SPX<`@j~XJvx?mlFvuR9B^v{VduaxutP+u0+fgDolYE#Z_y7+Mi9lP{lQSqx* zuAejemvjoSS;f*Wh=+oKWGoJA3G8xHQxh!6v(Gwn%9IyA{^YZ_Em$4yuptM1_2m~;wKbKM<*>9G z8XBfdneyb5k8j=D0ROD2sU}2OdC6w^9i+81kzS`}o4$-Eq`WCtO$E(J0S@^COxltISo`)wvAU(6F(wx%0%6 zPvSWdFb{As7yx)dhrSL)qwROxK4Ig=jbD8JEkrgvFB@6&kb@3x*uDi^RRE5wt{!{x z$tRyR=Fgtvg@WZNJ$=}S!)MKz1IDzovr|))A7^}W)aXA_DNniqY-aWI&O7g%bN)1O z!i2S}S8Z9lmd7$6+9AAkID z$7N~1yX}~wEIKYh;X_U+r(wH>-A3h1(8#R>?TAS?O8 zxSu%3vBmDR4+U;Ghf?kA+609saar^!)zBv&e*WVR^Ez6Sz3TUs1}O~D5?FW{nC|a7?%51ICp|*2j4OO5k8WJyJv~mpy>J{p z4}ZHi6yD?c_jY`5-@E(Sa<6&sqz6tH(7pJTWv%<~zHOI^t=*A0r$hWd?kDy*uLlx) zgg{&%D+JC~Kw^Qzz86*9^FA?MGq&Yn~i2Wzx3kkWu;Z7f&H3Dtl{%_ zbu?4`&WkR(!Lb&$FGyc%nxE-+Ygkz6evu0f&5X>4(Yis)WC0rI(2gWe`HxOcJ7zR5}hr0kHb)vwzoQEtAHSvJ%iTWb+%Gr;11=M0ns6 z#Jf95aR6HR@i&b-;e->;KmYt_Te}M}hv!0w(AeArH=D_3NJ`VItE)?AbmX0m#c*y5 z82v<}QMjsbS@?-3o;dCFKMox_w4tF9#=o__T~Q?tCZ216Q}rf6VidmeP>YH4_MDx@ zu2YoR!2UA8fb#OnhK3ze-*_k5nu4$xqAPg5v2N_2fu*#gaeJb>bN>MYjyh`8+_`gM z#=^rYEh&Hg`RA{=^73KBhJiKz^2;ybp%+qFgz7oCW%E`TWGbowgD+vPU@qeYsC?2hRcA?#6r$HyFV3^+-5 z+;PW-4I7?$<{9`FjPwz z{bq8?p;*_3wbLF^Tx3@zYPf+=K11z&pKb z7t_vtR-U08i)6$MGM?D6!bma^nHW_!g^;D7x-hpR;~W$}^XZ!En3Pd;CG zh0pBq^Lsn~8{b=arPrT3QWO)@&;LeD3>f&(y?5lgm}te;?ns>L8_xF=+j+&I-`h`& znwu`&*=NFVqKYj63q3g5G$8uiMT?0g3J|E9MAUm2k0IK;%RYbq*ui$+e4f)Ea1RVu0oGa~I#hHrLr@{3$SWDO0X z%5&0=?X5q|oU>`uR*2YD#SdX|C=jx2GZt;JEK?H21@nIyGURZq%SdO+%1S=|_+MbT z4m*6vp@$BxuBhzazdsn|CCgSfHpYey8`Hca{K?1bL~-zn6-V^%zmj29-YxMg+09X- zpq2s{AJ1lGutSVxcxgalkt^}AA-K&K+7v3AxBsBjIra?7hiaF?Yg$=sz|I`SAD^ZZU8njEK-Dn zVJ;~v^ZSEfCXtLoRV>TC@ur&&JM6GqZoQ4}dJ=1k8kJd0wAPrWn@r=L0(kV>cWjN6 zg&?-}2egqRN3P$vrEy1dq`Vs7q^u&cY0Jib{rV+haky+sOvn?{j5OWRC_K1ONFF`< z6hMwxv@;S6n0mS`+R@n9h6`x!I8tM65{Vg1%~&$|Fy|4_6T zOGBJ|ayOk$N~(kuD2CD1h1yWaxI$QHlJUf>S+g#__+nUSFb_NNrvrQ!Sj5*|cinBb z-3piQ3kCqc!4CuI0^iQ|EM)xFyAL~j(3xkS%5tV<>!jV<<*AE|4vRo zz>Or^ruC*Cm`Jimb|c}ogG#U z=2_M$9XtHEN!Q<#S{n~&mHqqnx&N*^{2J5J z)L2qpl}KWlI?+CHNoOfVVm~5r%w#-5S?F;&KhNWey$~D$Zs(RcW%i(JnbuKbMJyu|+6nKPOB4q z-C0DJC&J4=H|vO_4?gPXVJQEgiP@}98-*!*6wTPsOQL@zka8`03$Q#o+dIl5)h3E? z3-?TVP!xQCLBT*NmG;w9X>g6(J6bTmWWnNOSFc`;dbizi!cm}iv^Sr3-i6o3W zpgtMVYP38T2F3@jD&w{4&aYYT+i+xu!!)T1(;YSZzA|tKWC-=*Nx!Di`JA={5Dnxdf1;;6?r!GAI zf_v_{b^rbP+;i`>BS!4c@~Dqn-|K++^VVH+%|qppvd*rwkNS=habLdZtlA5vdd&yM3%0AA65lKB)Vb5)4JojSihr4nj*sk7I}>D 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

mC#q14b!(5fVq7_^TDm!Ct`%2b%_N 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 &aG35fzAH?ZiLU1|xwp~r3yk9YgB2rOeVE!Wp8 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∾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 TC(8dZR1}> /DCTDecode filter def -20 20 translate -642.00 501.00 scale -/DeviceRGB setcolorspace -{ << /ImageType 1 - /Width 642 - /Height 501 - /ImageMatrix [ 642 0 0 -501 0 501 ] - /DataSource Data - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - >> image - Data closefile - RawData flushfile - showpage - restore -} exec -FFD8FFE000104A46494600010100000100010000FFDB00430003020203020203 -03030304030304050805050404050A070706080C0A0C0C0B0A0B0B0D0E12100D -0E110E0B0B1016101113141515150C0F171816141812141514FFDB0043010304 -0405040509050509140D0B0D1414141414141414141414141414141414141414 -141414141414141414141414141414141414141414141414141414141414FFC0 -00110801F5028203012200021101031101FFC4001F0000010501010101010100 -000000000000000102030405060708090A0BFFC400B510000201030302040305 -0504040000017D01020300041105122131410613516107227114328191A10823 -42B1C11552D1F02433627282090A161718191A25262728292A3435363738393A -434445464748494A535455565758595A636465666768696A737475767778797A -838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7 -B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1 -F2F3F4F5F6F7F8F9FAFFC4001F01000301010101010101010100000000000001 -02030405060708090A0BFFC400B5110002010204040304070504040001027700 -0102031104052131061241510761711322328108144291A1B1C109233352F015 -6272D10A162434E125F11718191A262728292A35363738393A43444546474849 -4A535455565758595A636465666768696A737475767778797A82838485868788 -898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4 -C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9 -FAFFDA000C03010002110311003F00E2FE257ED51E28F08FC45F11E887C616BA -647697B3A4105CC16CB8844D222619D3E6C6C23A93C73D46787BCFDB87C631DF -A59E9DAE5EF882E0BA465748D2ADA70ACE55635CEC0096660A0293CF1D78AF23 -FDABEF8DB7C72F19A116D22B9B81E55C9C06FF004E73C7CEA4F4071F37DD1C77 -1E73F0CB573378DF498EEEEF50B5D285FE9F35F9F0D5A2F9F15BC53AB3CB18F2 -C8DE809604820B919DD5F37472AC5D7A13C67B66A2949EB52C9F2A72B2EADB4A -CA2B572715D4FDFF0038E23C0E5F6CB709965075B9528BF611949BE57CB7BE96 -72E5E696AF9799A8DEC7DC3F0C3E377C5EF8C7AC69BA3F8575296F358D43CD58 -6C67B3B4B7903C4AED2A3191155597CB7CE4F55E33C67A44F147C76B9FED0FB1 -6BDA46ABFD9FA6DCEAF77FD95A8E8D7BE45A41B3CD91FC966C63CC5C29F99B9D -A0ED38E5BF61FF0015F87B47FDA3F43D767F13452F86FF00B575C963F106AEC9 -66B7113FDB047349B822C6D26E53B70B82D8C0E95BDF023C77E1F17FF156E26B -1D0BC1515DFC3AD574FB6B5B7BB9963BAB963194553753C8CD2B7408ADC84E17 -3927E66956AB25EFD69A6E5256E66AC924F66AFD6DADBD0FD328E1B0F5B07471 -1FD95876DE1F0F5656A1169CEAF329A4EE9D9593568B7AFBCD5D1CE6BBF1FBE2 -97877559F4EBBF145A4B710EDDCF60B617909CA861B65855D1B8233B58E0E41C -10456A6A7F16FE32685E13F0FF0089350D57C8D1B5FF00B47F66DD7D9ACDBCFF -0021C472FCAA85976B103E6033DB22BE89BED3FE176ADF14B50B1F03DB7802F2 -F6E7C77A2C3716D247A7496F2E86D6308952D167FDD331B8330616DFBE2C467F -86B4F51F12FC3A4D7FC05F0EF5C8FC183C323C41E31B7D5E1BE16C9269300BAB -AFB3448E48366AE5A32A576313147B580041EA74B11EF5F132DEC9F33B5F992D -FD1EBD8F3A78FC9DC68BA792D3BB5CF35ECA0A5CBECA751DA36D1F34528DDB52 -5A68DA6BE59D57E39FC5AD07EC5FDA7A8DDE9DF6DB64BCB5FB5E950C5E7C0F9D -92A6E886E46C1C30C8383835D8E9FAA7ED07AC69FA75CD9DD42F36A564DA958E -9CEFA647A85E5B2876F361B36C4F22911B95DB19DC172B918AC2FDA47C5961E2 -EF0DFC1F9749BFD3AFECAC3C1D69A6CE20317DAA0BC87293C532FF00AE551842 -9BC6C39668F3B9C9F66D0AC7E1C7C58F117C2DB8F155FF00832EFC1D63E06B0D -33529F59F10B69F7B69796E2756821852E237DC5DE325A4428510946C91BAA8C -AB4EA387B693DADEF35BFDFA1DF9850CB70B97D2C5BCAE8C5BF69CDFB98C9AE4 -BD925EE7BCEDB37D1A573E6EFF008697F893FF00431FFE48DB7FF1BA921FDA57 -E243B107C47918FF009F1B6FFE375EC7F07EF7E185A7C1AF097DAF47F08EAD7E -DFDB1FF0957F6FEAB6B632C7C7FA3E3CCB69AF5F316DF2FEC3B712039CB16C3F -C13A1FC3387E08EA1697DA8F8775979BC1377A8477F7773A5DA5E5B6B425674B -348444B7ECE85401234CD1C8B9010AB2814BEB328AB577AABEEFC9FEB6F27731 -ADFD874A538CB2985A33E5FE1D3D7DE945B5A68FDDE65176728CA325D6DE3A7F -692F88D9FF00918BFF00246DBFF8DD393F691F88C5B9F117FE48DB7FF1BAD2FD -AD2F7C3975F1DB5E8BC22BA1AF866DA3B68AC4F87A1B74B520C08F210D080AED -E63C80B124F1B738500790C7F7AB89E27114EB3A7ED64ECEDBBFF33E87039264 -B8DC252C53CBE9479E2A5674E175757B3F7775D7CCF4C9BF691F88C8A08F1160 -E7FE7C6DBFF8DD43FF000D2BF11FFE863FFC91B6FF00E375E7571F707D6ABD76 -AC4D7B7C6FEF62A9C3B93296982A5FF82E1FE47AA2FED21F114A83FF0009176F -F9F1B6FF00E374BFF0D21F117FE862FF00C92B6FFE375E669F717E94B51F59AF -FF003F1FDECE27C3F93FFD01D2FF00C171FF0023D307ED1FF114FF00CCC3FF00 -9256DFFC6E9927ED23F1195B8F117FE48DB7FF001BAF385E951CBF787D2B7A38 -8ACE76737F7B39EB64194285D60E9FFE011FF23D322FDA43E22B3107C459E3FE -7C6DBFF8DD4BFF000D1BF113FE861FFC92B7FF00E375E5F07DF3F4A9EBB5D6AB -7F89FDECF2E591E557FF0075A7FF008047FC8F49FF00868DF889FF00430FFE49 -5BFF00F1BA3FE1A37E227FD0C3FF009256FF00FC6EBCDA8A1D6ABFCCFEF643C9 -32AFFA05A7FF008047FC8F431FB48FC45F340FF848B8DD8FF8F1B6FF00E3756B -FE1A2BE21FFD0C1FF9256FFF00C6EBCA87FAF1FEF7F5ABB5D94EAD46B593FBCF -26A64F96A7A61A1FF8047FC8F473FB45FC431FF330FF00E495BFFF001BA51FB4 -5FC43FFA183FF24ADFFF008DD79B374A51D2B5F693EECC5E51977FD0343FF008 -FF0091E91FF0D15F10FF00E860FF00C92B7FFE374D4FDA33E219DD9F10F438FF -008F2B7FFE375E734C8FF8BFDE34FDA4FBB393119565F18AB61E1FF80C7FC8F4 -C1FB457C423FF3307FE495BFFF001BA70FDA27E2113FF2307FE495BFFF001BAF -365E94E5EB5DD0937157679AF2CC0FFCF887FE02BFC8F48FF8688F883FF4307F -E495BFFF001BA0FED11F107FE860FF00C92B7FFE375E7141E95A5D99CB2DC0D9 -FEE21FF80AFF0023D17FE1A27E217FD0C1FF009256FF00FC6E957F689F884587 -FC541FF9256FFF00C6EBCDE957EF0FAD34DDCF1FEA184FF9F51FFC057F91E967 -F686F8800FFC87FF00F24ADFFF008DD27FC343FC41FF00A183FF0024ADFF00F8 -DD79D375A4AF4B957633781C27FCFA8FFE02BFC8F4B93F683F1FAC4A46BFC9C7 -FCB9DBFF00F1BA8BFE1A1FE20FFD0C1FF9256FFF00C6EB8097FD427E1FCAA0A2 -3156D8F32AE130EA5A538FDC8F471FB437C403FF0031FF00FC92B7FF00E374AB -FB42FC402C7FE27FFF009256FF00FC6EBCE57A509F78D6908C5CD2B183C2E1FF -00E7DAFB91E9717ED05E3F6620EBD9E3FE7CEDFF00F8DD3A5FDA07C7CAA08D7B -1CFF00CF9DBFFF001BAF3983EF9FA53E7FB83EB5D9ECE17F851C9570F4527682 -FB91DF0FDA13C7F9FF0090FF00FE49DBFF00F1BA71FDA0FC7FFF0041FF00FC93 -B7FF00E375E723AD38F4AB74A9FF002AFB8F3BD8D3FE55F71E85FF000D09E3FF -00FA0FFF00E49DBFFF001BAB49F1F7C785149D77923FE7CE0FFE375E6157A3FF -0056BF415AD2A54DB778AFB8C274A9AFB2BEE3BE97F680F1EAB0035EC71FF3E7 -6FFF00C6E99FF0D03E3EFF00A0F7FE49DBFF00F1BAE027FBE3E951D762A14ADF -02FB91E6548C549D91E87FF0D03E3EFF00A0F7FE49DBFF00F1BA962F8FDE3D65 -24EBD9E7FE7CEDFF00F8DD79BD4D07DC3F5A1D0A56F817DC8C24958F464F8F7E -3B279D77FF0024E0FF00E37511F8FF00E3D0EC3FB7B807FE7CEDFF00F8DD7089 -D6A06FF58DF535D7430D41C7582FB91C15DB56B1E85FF0BFFC7BFF0041EFFC93 -B7FF00E374ABF1FBC7A580FEDEEFFF003E76FF00FC6EBCF2953EFAFD6BA7EAB8 -7FF9F6BEE471B9CADB9E93FF000BEBC77FF41DFF00C9483FF88A3FE17D78EFFE -83BFF92907FF00115C051597D5A87FCFB5F7239FDA4FF999DD7FC2FDF1E64FFC -4F7BFF00CF9C1FFC6E97FE17E78F3FE83BFF0092707FF1BAF3E1D5BEB457A94F -07867157A51FB91E64ABD5BBF7DFDECF458FE3D78ED979D77FF2520FFE22A41F -1DFC73FF0041CFFC9483FF0088AF3B8BEE9FAD4C3A50F0786BFF000A3F723965 -88AD7F8DFDECEF5BE3C78E8293FDB9DBFE7D20FF00E22A01F1F3C799FF0090EF -FE49C1FF00C6EB887FB8DF4AAC3AD54305856FF851FB97F91C75B15884D5AA3F -BD9E8B17C79F1D331075CCF1FF003E907FF1152FFC2F6F1CFF00D073FF002520 -FF00E22BCEE0FBE7E953D7A2F0184BFF00063FF80AFF00238258DC4DFF008B2F -BDFF0099DE8F8EDE39CFFC873FF2520FFE229B37C77F1CA28235CC1CFF00CFA4 -1FFC457083AD32E3EE0FAD2580C25FF831FF00C057F91854C6E2945DAACBFF00 -027FE6771FF0BEFC77FF0041DFFC9383FF0088AB317C75F1C320275BE7FEBD20 -FF00E22BCDAAEC3FEAC57453CBF06E5AD18FFE02BFC8F367986312FE34BFF027 -FE677FFF000BCFC6FF00F41BFF00C9483FF88A3FE179F8DFFE837FF92907FF00 -115C1D15D5FD9B82FF009F10FF00C057F91CFF00DA38DFF9FF003FFC09FF0099 -DD4DF1D7C70A808D6F073FF3E907FF00114C8BE3BF8E59883AE678FF009F483F -F88AE16E3FD58FAD4707DF3F4AB596E0797F810FFC057F91C35F33C7A7A579FF -00E052FF0033D0C7C73F1BE47FC4EFFF002520FF00E22BD17E0AEB9E30F8B7E2 -1D4F4EB8F19B6890D8E9CFA83DC269505C960B2C51EDDBF27FCF5CE73FC3D39A -F9FC7515EF9FB207FC8E3E2FFF00B16A7FFD29B6AE0CC30785C3E02B56A5460A -515A3E48BFCD1D594E3B198AC7D1A35ABCDC64ECD73C97E4CF58FF008577AAFF -00D15FB8FF00C2561FFE3B5CE2E8FAECFF00156D3C196FF132E6547F0F5E6BF3 -EA2DE1C81444B05CDA40B12C7E6658B7DA9989C8DBE580036E3B79EFF868DFF8 -AFBFE116FF008561F123FE427FD99FDB5FF08FFF00C4B7FD6F97F68F3BCCFF00 -51FC7BF1F779C5755A27FC9CF0FF00B273AB7FE9CB4CAFCA3FB46B7F2C3FF05D -3FFE44FD93FB3287F34FFF000654FF00E48F1AFF0086B1F83DFF00473371FF00 -86FAE7FF0089AE9353F1CEA937C46F863E1AF0DFC439F5FD3FC716A97D0EAF26 -810DAAC104935B471308989672C2E0B10DB31B40E4B1DB3FC1CF8A5A5F857E10 -F81F44D5346F185AEA7A6E8563677507FC21BABBF973476E88EBB96D48386523 -20907B1AF3CF03E9D75A47C63FD94AC6FADA6B2BEB5F0DE9F04F6D71198E4864 -5B8D38323A9C156041041E4115DD81C6D4AD888D3A90834EFF00F2EE9F67FDD3 -CFC7E0A9D1C34AA539CD356FF97953BAFEF1F454DE17683C48FE1E7F8E31AEBC -96E6EDB4BFF8476DBED2200FB0CBE5F9DBB66FF9776319E339AF3DF8B5E3197E -1F7816F35FD0BE2C278C6E6D759B6D0A6B2B3D1AD63582E649E38A44964123F9 -6F187DC50A96CED042EEDC25FDA7BE187893E3078AF48D134087FE11796C66B8 -BE1F10D2722EB4B277466DAD238A54959E604090B9588463F8DF684F32F8A3A3 -5FF85FF658F0FE81A8F84ACFC1B71A3F8874BB1FB16993ACD65384BD8FFD26DD -B719364A497C4D897716DFB8FCED861F1F5675A10946166D7FCBBA7DFF00C274 -6232FA50A339C653BA4FFE5E54EDFE23E9CF08DF4FAA785345BCB97F36E6E2CA -19A57C01B9DA3524E0703927A5150780BFE445F0E7FD836DBFF452D15E662528 -D79A5B5DFE67A9856E5429B6EEDA5F91E1DE35FD8CECFC6FE23D5F55BCF105BB -2EA17535C7D9E7D296508B249E614C9979190BD864A838E2B3ECFF0061E834EB -64B7B5F14C56B6E99DB143A40445C9C9C012E3A926BE9CBEBBFB0E9F3DC90596 -189A4DB9C670338FD2B9FF000FF8AF51F115A59DE43A1ECB2B9C1F35AED0955C -E09DBB73F8547FAB996548FBD4DEBAFC52DFEF3F4FA3E23713E1DA74B1293494 -6FECE95F955ACAFC976B45D4F083FB16E548FF0084C7A8FF00A067FF006EA8FF -00E1894FFD0E7FF94AFF00EDD5F45F89B599F49B066B38A0BABEE365B4D70B0E -E19C139622B2BC6BE27D4FC2D1ADE47676971A79923889699BCDDCC719DA1700 -74EE697FAB3952FF00974FFF000297F99D4FC50E2E96F8CFFCA74BFF00903CBB -C33FB3B78CBC1561258F87BE2FEB9A0D9492199EDB4C59ADA3690800B954B800 -B10AA33D7007A0AE753F6292831FF099679FFA05FF00F6EAFA62E6EA0B35533C -F1C01B85F31C2E7F3C54AA44803290CA790410722B4970D6592493A6ECBFBD2F -F339E1E23F13C2529C3149396ED53A49BF5F7353E641FB17F1FF00238FFE533F -FB750FFB159718FF0084C71CFF00D02FFF00B757D25AA5EFF666997576C85D6D -E1794A671BB6A938FD2B13C35E28BFF12C16978BA3FD9EC2E06E13B5D2B103FD -D033D47EB4FF00D5CCB169ECFF00197F994FC4AE2A968F19FF009253FF00E40F -03FF008628FF00A9CBFF00297FFDBAA48FF62A31B67FE131CF6FF905FF00F6EA -FA3B59D4D74AD32E6E32A648A092548D9B1BCAA16C554F0EF88A3D67C3B63AA5 -C08ECFED2809567180738C64FD0D53E1DCB76F67F8BFF3337E22F13BD3EB7FF9 -253FFE40F9FBFE18C33FF3387FE533FF00B75397F62F2A7FE470FF00CA5FFF00 -6EAF79B4F1335BF86DB54D6638EC0217CAC72AC8180CEDDA54E0923B66B4748D -6ECF5DB486E6CE6495258D650A181750C010180CE0D25C3B96A7754FF17FE64F -FC443E27FF00A0AFFC929FFF00207CE927EC65E62E3FE130C77FF9067FF6EA67 -FC3151FF00A1C7FF00297FFDBABE9BCF03FCF6AE6B4CF1CDBEA1E1AD47589203 -6CB62D2A4B0BB8277200719C753918FA8AD7FB0B2F5F63F17FE6652E3FE2493B -BC57FE494FFF00903C357F632C281FF098741FF40CFF00EDD4BFF0C647FE870F -FCA67FF6EAFA1ADF5712E8B6D7F2AADB19E1122C52481792B90B938E69343D46 -E2FB478EEEFE18ACE63B8C8892AC88A03100EE1907800F5EF47F60E5FF00C9F8 -BFF323FD7BE227FF00313FF9243FF913E7A1FB1A607FC8DFFF0094CFFEDD4D7F -D8C4B1CFFC25F8FF00B867FF006EAFA4E3BC82680CD1CF1BC201CC8AE0A8C0F5 -A7F9B198FCDDEBE56376FC8C63D73E9551C8F0117750FC5FF9932E39E2192B3C -4FFE490FFE44F9A53F633D873FF09867FEE19FFDBA9FFF000C71FF00537FFE53 -3FFB757D2A7B7F9ED595E28D753C35A1DD6A2D119FC9036C2AD832312000383E -BEF5A3C9B05BB8FE2CC5F1A67AF7C47FE4B0FF00E44F9FFF00E18E3FEA6FFF00 -CA67FF006EA3FE18E3FEA6FF00FCA67FF6EAFA0FC3DACC5E22D12CF52851A38E -E63DE118E4A9EE33F5CD436DABCF77E207B58A2825D3D6DFCC1731DC2B319370 -1B760390307AE3F9D1FD8D826BE1FC587FAE79EFFD047FE4B0FF00E44F9FC7EC -6787DDFF0009877CE3FB33FF00B754DFF0C77FF5377FE537FF00B757D12F7D6D -1A176B889503F9658B80037F77EBED4EB8BA86D23DF3CD1C299C6E91828CFA64 -D68B29C225A47F1662F8B73996AEBFFE4B0FFE44F9D0FEC779FF0099BBFF0029 -BFFDBA8FF863BFFA9BBFF29BFF00DBABE8AFB6DBFD985C79F17D9CFF00CB5DE3 -675C75E9D78A72DCC4D3B422543328C98C30DC07A91F88AAFECAC2FF002FE2C9 -FF005AF38FF9FF00FF0092C3FF00913E73FF00863BFF00A9BBFF0029BFFDBA91 -7F639DB9FF008ABBA9CFFC833FFB757D171DE5BCD33C31CF1BCC9F7A3570597E -A3B560F8C3C5E3C37269F6D0C714B797D2F971F9F2F971A0EECE79207E1EBE98 -23CAF0A95EDF8B225C519BCD7BD5BFF258FF00F2278A0FD8F31FF3377FE537FF -00B7528FD8FB1FF336FF00E537FF00B6D7BCD86AD2A6952DE6A86D2DD6324F9B -6D3192265E390480739C8C7A8F7A3C3DE26B0F1469F15DD8CC19240C446E4070 -031072B9E3FF00AE2B4597E1D2B25F8997FAC79A3FF97BFF0092C7FC8F07FF00 -863FFF00A9B7FF0029BFFDB68FF863FF00FA9B7FF29BFF00DB6BE8DAE5A7F18D -D3789EFB45B1D24DE4D691A48F21B858C10C01E847BD3780A0BA313E22CCFAD5 -FF00C963FE478CFF00C31EFF00D4DBFF0094DFFEDD4A3F63EC107FE12DFF00CA -6FFF006DAFA1A1B9616F03DD2A5ACD26018CC81B0C7F841E326945F5B340D30B -888C2A70640E3683F5FC453FA8505D3F130FEDBCC3FE7E7E11FF0023E7B3FB20 -E7FE66CFFCA6FF00F6DA4FF8641FFA9B7FF29BFF00DB6BE8AF35362BEF5D8D8C -367839E9F9E6B27C47ADCBA5D8C86C63B7BBBF0540B796E122E0F524B11DAB4F -AAD3F317F6D63FFE7E7E11FF0023C39BF645DC817FE12BC63BFF00677FF6DA67 -FC320FFD4DBFF94DFF00EDB5F444971144EA8F2223B02555980240EB8FA52477 -50CD134B1CD1BC6B9CBAB0207E34D612998BCD71927773FC17F91F3C8FD90B1F -F3367FE537FF00B6D03F642C1CFF00C259FF0094DFFEDB5F435BDD43771EF826 -8E74CE3746C1867EA29A6FAD8384FB445BCB940BBC64B0EA3EBCF4A6B0D4D3BA -27FB4F17FCFF0082FF0023E7F4FD91F61CFF00C2579FFB877FF6DA57FD92778C -7FC2578FFB877FF6DAFA01EF6DE397CA69E2593206C2E01C9E9C7BE45491CA92 -EED8EAFB58AB6D39C11D41F7ABF631EE44B30C4CB472FC17F91F3C7FC322FF00 -D4D9FF0094DFFEDB4BFF000C8DFF00535FFE53BFFB6D7D056F796F77BBC89E39 -B69C3796E1B1F5C521BFB60E14DC45B8B98C2EF192DFDDFAF238A7EC97732FAD -D6FE6FC8F9F7FE1913FEA6CFFCA6FF00F6DA9D7F64EDAA07FC253D063FE41DFF -00DB6BDAF5CF1569DE1D96CE2BD9C4725DCCB0C6A319C938DC7D147735A90CF1 -DCC4B24522CB1B74746041FC455469A5B325E26ABDE5F91F3EBFEC97BCE7FE12 -AC7FDC3BFF00B6D37FE1923FEA6BFF00CA77FF006DAF7BD6757B6D074BB9BFBB -6296F02EE72064FA003DC9C0AC283C6D34773A62EA3A4CDA75BEA4C23B79DA40 -E3791955703EE93D87D7D2AF55F6BF2FF2317524DDDB3C87FE1923FEA6BFFCA7 -7FF6DA913F64CD831FF09567FEE1DFFDB6BDF64BDB78BCCDF3C49E5603EE7036 -67A67D3355F5AD66D340D366BEBD9445044A493DCFB01DCD0EFD65F97F909C9F -53C357F651DA7FE469FF00CA7FFF006DA8CFEC999627FE12AEBFF50EFF00EDB5 -EEDA5EB567ABD847776D3A344F1ACA7E61940C323773C1C556B5D667BBF10496 -914503E9CB6FBC5D25C23319323E5D80E40C1EB8ED5719CE2AD193FC3FC8CE51 -53DCF12FF864CFFA9ABFF29DFF00DB6947EC99820FFC255D3FEA1DFF00DB6BDF -45E5B9B936E278CCE3AC5BC6EE99E9D7A512DE4103959278E360BBC8770085CE -33F4CF19ABF6B57F9FF2FF00233F6507D0F06FF8653FFA9A3FF29FFF00DB68FF -008653FF00A9A3FF0029FF00FDB6BDF04D19884A1D4C45776FCFCB8EB9CFA532 -DAF6DEF031B79E29C2E326370D8FCA97B4A9FCDF97F913F57A5D8F03FF00864F -E4FF00C553D4E7FE41DFFDB697FE193FFEA69FFCA77FF6DAFA06B9A3E368C68B -AFEA3F6472BA4DCCB6CD1EF1990A6DE41C700EEAD162ABC55B9FF05FE462F078 -7DDC7F17FE6792A7ECA7B463FE128CFF00DC3FFF00B6D3FF00E195BFEA68FF00 -CA7FFF006DAF6FB0D5A1BBD1ECF519196DA2B985251E6300177282064FD6A5BB -92E25B17934DFB3CF39C797E748446DC8CE4A827A67A0F4A3EB55F7E77F72FF2 -21E030CF5E5FC5FF0099E147F656C823FE128EBFF50FFF00EDB518FD93F9FF00 -91A73FF70EFF00EDB5EB9E13F16C9AD47AAAEA114165269F74D6AEE921F2D883 -8C82C077FE62BA549A3965923574678C8DEA1812B9E991DA858BAFBA9FE0BFC8 -CE596E125BC3F17FE67CFAFF00B2DADA905BC4E4EEF4D3FF00FB6D27FC33347F -F43337FE0BFF00FB6D7BCEA3D22FC7FA552AF628D7AF520A52A8EFE91FF23965 -95E0EFFC3FC5FF0099E27FF0CCF1FF00D0CCDFF82FFF00EDB4927ECCB1C8B8FF -008499873FF40FFF00EDB5EDB456FED2B7FCFC7F72FF00233795609AB3A7F8BF -F33C3BFE197E3FFA19DBFF0005DFFDB6A64FD9A234503FE12563FF0070FF00FE -DB5ED74B54AB574EEAA3FBA3FE464F25CBDEF4BF197F99E2BFF0CD51FF00D0CA -DFF82FFF00EDB47FC33547FF00432B7FE0BFFF00B6D7B55157F59C4FFCFC7F74 -7FC88FEC3CBBFE7D7E32FF0033C4E4FD9A237503FE12561FF70FFF00EDB4D4FD -9963439FF84998FF00DC3C7FF1DAF6EA29FD6B13B7B57F747FC8CE5C3F964B7A -3FF934BFCCF151FB35460FFC8CADFF0082FF00FEDB4DBAFD9A3ED56935B2F8C7 -52B28A60166FECF135A34AA18304768AE14B2EE556DA49195538CA823DB28A99 -62311383A739DE2F74D45AFC6210E1FCB694D54A74AD25B3529A7FFA51F3EFFC -32159FFD0EFE22FF00C18DF7FF0025D11FEC85670CCF347E37F1124AF0B5B3C8 -BA8DF066899D1DA327ED7CA978A262BD098D0F5518FA0A8AE1F634FF00923FF8 -053FFE44F47EA14BF9A7FF00832A7FF247CFBFF0C8567FF43BF88BFF000637DF -FC9753E99FB26DAE91AAC5A9DAF8CB5A5D4A18DA382F1EE6EE49ADC332B1313B -5D131B6E8D08742181504118AF7BA2AE34E307CD18C53FF043FF009122796D09 -AE59B9B5E752A7FF00247CFBFF000C8567FF0043BF88BFF0637DFF00C974D7FD -8F34D95A233F8BB5ABB58A58E758AEAEAF268CBA3874251EE8AB61954F20F205 -7D0945254A1177518DFF00C14FFF009129E5F4649A729B5FF5F2A7FF00244DE1 -ED37FB1B40D374F12F9C2D2DA283CCDBB77ED40B9C64E338E993455D87FD4A7F -BA28AFCD6B36EAC9BEEFF33DCA7150828C7648835F503C3FA91EFF006593FF00 -4035CAFC2ED109F09E8B7BFDA17C7F745BECE64CC3D58636E3FAD77E92D88450 -F7DB5F032BE531C1EE28F374EC7FC7FF00FE416AFA78539B8A7CAFEE645CF3AF -8D1A4DB4BE11B8BBFB24525E23222CE2306455C9E0375C64F4F7AB3F182367F0 -8A000B7FA5C070013FC5F8D77BE769FF00F410FF00C82D49E6E9D8FF008FFF00 -FC82D55ECEA6BEEBFB985FCCF1CF1BBCB63E3EB99B55B882D74C96D952CA5BCB -769A11C0DE000787DD9F7C115DAFC3682387C2D1451EA3FDA912C8FB2510BC6A -A09CED01B92067AFBD75FE769FFF00410FFC82D49E669BDEFC67FEB8B7F850A9 -D4BDF95FDCC2FD6E6278AC01E17D6718FF008F39BFF403EF5C37C30BDD0EDB47 -D1D4EB528BF75DA6C9AE1F6176CA81B3A771FA57AA79BA7E38D43FF20B526FD3 -BFE7FC7FDF96FF000A6E9D46EFCAFEE6175BDCF1AF181D253C53E2A4D5ACE6B8 -BD92DA31A6B2A3B01FB9F9B1838186E4E7B03F43D8781347B4D57E1E68D6F7F6 -B1DD4422DC23B88B78072C3383DF04F3EF5DB79BA7E30350FF00C82D49BF4EFF -009FF1FF007E5BFC292A5537E57F731DD773C93C37A4FF00687C20D42DC5B09A -457B868E365C90431C601EF8ADFF008617FA2DDE85676DA7AC6BA8416B1A5D85 -84AB87030DB9B1CFCD93D6BBC32E9F8FF9087FE416A37E9DFF003FE3FEFCB7F8 -5354EA2FB2FEE61CC8AFC76AF1EF1059DC47E3CBEF0C4719365AF5D5BDD3E7AF -96B969483EE54FE5F9FB49934F231FDA1F9C2D49BB4D3FF2FF00CFFD716FF0A6 -E9D47F65FDCC3993EA646BFA75AEA5A55C47756B0DD2AA33A24D18701B6B0040 -3DF9FD6BC8A68AFE3F867E1868F7269715D4CD7BFBA2E1479CFB0B01C95E4E7B -723DABDD0B69DDB50C7FDB16A3769C4FFC8407FDF96A4E94DFD97F731F32EE79 -0F876283597F11A586AD6F7A97BA6CB135AD8DA3428AD8DA1B078DDF36303AFF -003E6B443ACDC2691248EE6CB592BA7A2B938458CAE0FE87F2EFDFE82DDA7E3F -E421FF00905A97769D9FF9080FFBF2D49D29FF002BFB98AEBB9071DAB95F179B -9BFD5F4BB0B5B34BF1116BC9A196411A103E55C920FF001374C738AEC3769F8F -F908FF00E416A5DDA767FE4203FEFCB55B84DFD97F731F32EE79E7C2633D8D96 -AFA45CC22096C6EDB0AAD9015C64007D060D3749D26DB4CF8B776969691DA407 -4A276C11044CF989E8319AF44DDA7E3FE423FF00905A97769D9FF9080FFBF2D5 -3ECA7A7BAFEE61CCBB9E53E17F02E99E22BDF11DE5F892571ABDCA46A1C811ED -937647B9AD0F185E69BA678EECEE75F88BE926C764124B1B490A4FBD89C8E467 -6903BF5FC6BD17769F8FF908FF00E416A5DDA767FE4203FEFCB51ECA76D22FEE -62BAEE79978FAEB4ABFF0084FAACDA308BEC4EF195F2A331A96F393270715B5E -19F0858786ECA3D52D229AE3506B2DAE59C9339386E7DF20018AECB769F8FF00 -908FFE416A5DDA767FE4203FEFCB53F673BDF95FDCC7CCBB9F3FC7E2082EF57F -0F6A605B5908AF40B98AD6DA456806E3F2C8E7EF13E9CD775F11F4AB6BDF13F8 -47CEB58A7125D98E4DF1060C9C1DA7D473D3A735E8BBB4FC7FC847FF0020B562 -F883C49A668BABF86ACDB52453ABEA0F64A1AD5D8B15B4B89F008FBA71013939 -18047520D4BA734B54FEE6175DC75F68D6AFA15CE9F05A4090344EA96E88AA80 -9C9181D073CFD79AE33E0EDEE92BA15AE9E8889AE42920B94FB3B2C8A3CC6237 -363DD7BFA5779E20F10683E16D0751D6753D5FECBA669D6D2DE5D4DF6691FCB8 -A342CEDB541270A09C0049EC0D61BFC4DF0CD8DBF8825D62EEEB427D06C1756D -421BBB5F31E2B46129598184C8181FB3CE36825FF7672BCAEE25169ABA7F730B -A7D4E978AF29BD6D322F8ADAF36A5A8C9A728B783CB92299A224EC5E323D8D76 -97BF10B46D2347D52FB558F53D28E9F12486DA7B3DEF706425228E068D992595 -DC6C58958BEE6405479885AE7873C61A3F886F753B2792EB4BD4F4E78C5C58DF -40A2508E81A3957633068DB0EA1C120B452AF546013526D249FDCC2EBB9CAF8E -52CF5BD17C2B1DBDCB5CD9CDAB41109D642598059149DDD73C75A87C27E1DB39 -353F1CE851C7E5E9ECF144919CB04DD1B7233DF241FC057A66ED3F1FF211FF00 -C82D547C41E20D03C2FA16A5AD6A9AB8B6D374EB692F2EA7FB348FE5C51A9776 -DAA0B1C2A9380093EF54E9CD6AE2FEE6175DCF37F87D7779AD4B67A25FA11FF0 -8F49279EDD43BA9290AE73D8163EFB055EF8CFA359BF84EEAF16CA06BE32463E -D021064C67FBDD7A56E3FC4DF0D585B78824D62EEEB427D074F5D575086EEDBC -C68AD184DB661E4990303F679C6D04B7EECE57952D25FF00C42D1B45F0FEBFAB -EB11EA7A441A2593EA37497167BCB40A8EE4C6F1B3C6ED889F281F70F94B001D -0B459DAD67F730BAD8C5F1EE890F887C5FE15B29DDD2175BB67F2CE0B002338C -FBE3FCF78FC67E1B4F0E78452D74A8E65D3CDFACD771C6598884E77018E719DB -FF00D7EFD5782FC65A178EB408B58D3B5056B0999961991E1B88E60A76965782 -491080C197EF64156C8F5DDDDA767FE4203FEFCB55284A4AEA2F5F26175DCF36 -D18D95D78FEDA6F0E043A5259B2DEBDB8DB16EFF009663D0B703DEB91D6F44B5 -3A0F89B562AE6FA2F104B1C52066C20F346703A73BBAFB0FC7D9FC41E20D07C2 -DA0EA3ACEA7ABFD974CD3ADA5BCBA9BECD23F97146859DB6A824E141380093D8 -1AC9B3F1D6997B73A958ADB6A09AD584305D4BA53C5179CD0CCF224722B890C4 -416866E0B861E59C8E5772709276B3BFA30BAEE795FC4CB549BC63ACC8436E8D -6CF69562319602AE68B05D7FC207E32B7B1F38BA5EAED48F73305CA17C01FECE -6BB96F8AFE1FB6B5F11497C350D3DF42487ED10C96E92B4B2CA3F756F1795238 -79DB31810E779F3E1F97F7A85B63C39E30D1FC437BA9D93C975A5EA7A73C62E2 -C6FA051284740D1CABB198346D8750E0905A2957AA3012A2DBD13D7C9FF97F56 -0BF5B9E79E09B8B2BBF1669B3D96AF66CCB03C3259D9D9BC5BD76B30DE7A6410 -0E7DAB2756D02D66F0E78CB5765737D6DAF48B038638406640703D4EFEBEC3F1 -F75DDA7E3FE423FF00905AA8F883C41A0785F42D4B5AD535716DA6E9D6D25E5D -4FF6691FCB8A352EEDB541638552700127DEADD39DB54FEE62BAEE70BF166CED -D64F0F6A5716E8F6D6FA845F6994C7BB6C5BB2770E495E0FF93CF65A05D69B7F -A6473E9223162E4943142635273C90303BF7AA169E3AD36F2E352B05B7D4535A -B0820B9974978A2F39A199A448E45712F9582D0CDC170C3CB391CAEEA127C57F -0F59E9DE2DBDD41750D3A3F0BD9FDB75112DBA4BB57CA694A2B4523A99046818 -C64860B244C46245256A9DECFEE7FE43BABEE59F88FA65C6B1E09D56D6D22335 -C3C619635EADB5C310077381D2B9DF14EAF6DE3A3E1EB0D28C935C8BF8AEAE02 -46C7ECD1A860DBFD0E5B1EF8FA67B1F05F8CB42F1D68116B1A76A0AD613332C3 -323C3711CC14ED2CAF04922101832FDEC82AD91EBBBBB4ECFF00C8407FDF96AA -E49C95D27AF930E65DCF10F1247A1B78FF00C5875B67F2BC98BC9401B6B49E4A -EDE9DFD33FFEBE8FFB26EF50F82C20BCB779EF92CD9D525525C609DA4679CEDC -63F2FAF6D65E1DD16C35FD47588F5494DCDF2A2CAAD11D802A851B4019EDDC9A -C9F0BFC4DF0CF8B6EB4C8ED6EEE614D5AC1B55D2E6B8B5C25F5A298774C98259 -00FB44076CA11FF783E5E1B13C924F58BD7C98AEBB94FE1D5E689A9786ADED2C -5219258ED228AF55602A0B6CC10E48018E73EBDEB1D34A3A6FC4BD663D1AD61B -498E88E6058A2091F9A5936E4631D715A7E1FF008CFE15D720D32E66B8BBD174 -FD4B4597C416B7FA9C71C703D946202F2B32C8DE5802E6263BC2F04FA1AD4F0B -FC42D1BC4D7E9652C7A9E857B358C7A8C16DABD9F9324F031C31550CC7746760 -911B0D19963DC06F5CCEB2B249FDCC775DCF3957B21E09B3B5B38E45F18ADCA1 -2BB08B9598487717279DBB73EDC8AEA75CF0FD9F887E2AC36D7D199ADD746327 -96188573E763071D47CD9FC07E3D578C3C49A6F85F48B7BC6D4D544BA858D8E5 -ED9DC66E2EA2B703008E732F07A0272410083B9BB4ECFF00C8407FDF96AA54E5 -7B72BFB985D773C5340B48359F8416B05EEAA74D4176C2299C164C82C4230CFD -DEBF8E3E87A5F865AA4D7375A8593D9D99481571A8E9F1958E7E4E01E065B9AF -45DDA7E3FE423FF905A97769D9FF009080FF00BF2D55ECA69AF75FDCC5CCBB90 -71DABC6EF74286EBC39E3DBF796E1668B53BA55449584671B4E4AF43F7BFCF7F -6ADDA7E3FE423FF905A97769D9FF009080FF00BF2D4DD39BFB2FEE636D3EA789 -EBBF68B483C1D75752C716889A5C2A25B884CD0ACDB3F8D47A8DB8CFA1AEC3E1 -74502596A06DB554D4A09270EAB0C0F1C7164745DDD73EDE95DDEED3F1FF0021 -1FFC82D4BBB4ECFF00C8407FDF96A4A94D3F85FDCC5757DCF0DD4D08F077C44D -CA541D638EC71F681FE7FCF3A5E0F874EFF84E7493A0B4EF18B271A9C8C1F05C -8F943E7BE71EDD3F1F4DF11E87A3F89F469F4CBAD4E48E09B6EE68622186D60C -31904751E957E08F4CB786389750CAC6A146616CE001EDED4BD94EFF000BFB98 -5D5F7286A38FDDE3DEA9D5FD54DB9117D9EE3CFEB9F90AE3A7AFE3542BDEC3A6 -A924FF00AD4C64EEC28A28AE82428A28A0028A28A0028A28A0028A28A0028A5A -4A0028A5A4A0031452D250069C3FEA93FDD14510FF00AA4FF74515F97D6FE24B -D59D8B629CA9991BA753DFFCFF009FD18D1900F1C7AE7FCFF91571972C7BF39C -8E3FAFF9C7E51796147271F863FCFF009FC3F46A32FDDC7D11C8F72B6DC818A4 -208EB568A649E33F97AF4FF3FF00EA66DDA01391DC1CFF009F6FF3D37E611051 -5318F927F0C1FF003EDFE7B2141E83F0FF00F5FD7FCF47CC045453CC4475041F -71FE7DFF002A42871FE453B80DA4A5C11FFD6A314C04C514B5CC597C4FF06EA7 -E246F0F59F8B742BBD7D659216D2A0D4A17BA124618C88620DBB72ED6C8C646D -39E952E496EC0E9B14573363F13FC1BA9F891BC3D67E2DD0AEF5F596485B4A83 -5285EE8491EE32218836EDCBB5B23191B4E7A574D4D494B66014560E91E3FF00 -0BEBFAF5EE87A6789348D4B5AB2DFF006AD36D2FA296E20D8E11F7C6AC5976B1 -0A72060900F35AE9A85AC97F358A5CC2F7B0C4934B6CB2032246E5C23B2F50AC -63900278251B1D0D0A49ECC09E8A2A85EF8834BD37EDFF006BD4ACED7FB3ED85 -EDE79D3A27D9A03BF12C993F221F2A5F98E07EEDF9F94E1B696E05FA315CCF86 -7E27F837C6B7F258F87BC5BA16BD7B1C4667B6D335286E6458C100B954624282 -CA33D32C3D68F0CFC4FF0006F8D6FE4B1F0F78B742D7AF638CCCF6DA66A50DCC -8B1820172A8C485059467A6587AD42A9076B35A858E9A8AA13F8834BB5B6D4EE -26D4AD22B7D2F77DBE579D552D311ACA7CD24E23C46EAE7763E5607A106A77D4 -2D63BF86C5EE615BD9A379A2B669009248D0A07755EA554C91824700BAE7A8AA -BA02C514514C028A28A002B82F891FF238FC2BFF00B1926FFD33EA55DED705F1 -23FE472F857FF632CDFF00A67D4AB2ABF0AF55F9A0475BAECFAA5BE953C9A2D9 -DA5FEA436F956F7F76F6B0BFCC376E956390AE1724610E48038CE4799DBFC2FD -6BC51E00D660F195BD99F175FDCDB5DCD75A3EB53C6970D6B2A5C5B44971F675 -92D20595594246AEC8ACD26F79A4790FAE564785FC4D6BE2DD366BEB38E68E18 -AFAF2C1967003192DAE64B7908C13F2978988EF823201E0138466ED27D1E8079 -5E9FF067548B46D685A693E1DF07F9D73A4DED9F873429D9B4E33D8DE7DA8CAE -E2DE2D8F7188A17610B1458236CC9808BDAF833C3FAF0F16EB9E27F10DBE9DA7 -5EDFD8D9E9A961A65E49791AC76F25CC825333C309DCC6ED9766CC288C1DC776 -157E10EA175A9F852FE6BCB99AEA65F106B90AC93C85D8471EAB7491A027F855 -15540E802803815BDE17F135AF8B74D9AFACE39A3862BEBCB0659C00C64B6B99 -2DE42304FCA5E2623BE08C80781953843DD92ED7FEBEF1B6CD7ACFD7A6D52DF4 -A9E4D16CECEFF521B7CAB7BFBB6B585FE61BB74AB1C8570B9230872401C67220 -F0BF89AD7C5BA64D7D671CD14515F5E58309C00C64B6B992DE42304FCA5E2623 -BE08C80780785FC4D6BE2DD366BEB38E68E18AFAF2C1967003192DAE64B7908C -13F2978988EF823201E07473292D1EE23CEADFE17EB5E28F006B3078CADED0F8 -BAFEE6DAEE6BAD1F599E35B86B5952E2DA24B8FB3AC96902CAACA12357645669 -37BCD23C86C7827E19DD787EC3C57BFC2DE17D1ECB55B18ED62F07E95396D2A5 -9104DBE695BECD180D389638A4C40C425BA64BF08BDEF85FC4D6BE2DD326BEB3 -8E68A28AFAF2C184E006325B5CC96F211827E52F1311DF046403C0C1F843A85D -6A7E14BF9AF2E66BB957C41AE42B24F217611C7AADD471A027F85515540E8028 -03815CCA9C39A2D76DFF00AF51DD89E06F0FEBD6DE24F106BFAE5BE9DA4CBAA4 -76B11D2F49BC92EE0F3211206BA691E18732C88F14447979096B17CEC30A9DB5 -64785FC4D6BE2DD326BEB38E68A28AFAF2C184E006325B5CC96F211827E52F13 -11DF046403C03C2FE26B5F16E9B35F59C73470C57D7960CB38018C96D7325BC8 -4609F94BC4C477C11900F037872A4927BEBFD7DE227D767D52DF4A9E4D16CED2 -FF00521B7CAB7BFBB7B585FE61BB74AB1C8570B9230872401C672399F85FE1FD -7B4CB0BDBFF175BE9DFF00095DF4A3ED979A75E49731CB1A8FDDA26F86230C48 -5E409080C1412ECEF24923B6FF0085FC4D6BE2DD326BEB38E68A28AFAF2C184E -006325B5CC96F211827E52F1311DF046403C0C1D4BE27DAC3E02D53C47616335 -DCB6F7D71A4DA584EE216BBBE8EF1EC628438DC1165B85550EDC2870CDB40389 -6E37536FA5FF00E08FC8CFD4BE185D1F014DA75BDF437BAFCBABDB7882E2F6E5 -4C497B770DE4574236237B4717EE52DD09F31A289631FBCF2C037FC19E1FD787 -8B75CF13F886DF4ED3AF6FEC6CF4D4B0D32F24BC8D63B792E6412999E184EE63 -76CBB36614460EE3BB0BE77FB316A3AE68106A9E15F136AFFDBB7771A96B5A8D -86A7F664B6F3FC9D52682F53CA8F2176CC629F2C79FB76C504424D7B1F85FC4D -6BE2DD366BEB38E68E18AFAF2C1967003192DAE64B7908C13F2978988EF82320 -1E0654B92A28CD68EDB7F5EBF883D3435EB3F5E9B54B7D2A79345B3B3BFD486D -F2ADEFEEDAD617F986EDD2AC7215C2E48C21C900719C883C2FE26B5F16E9935F -59C73451457D7960C27003192DAE64B7908C13F2978988EF823201E01E17F135 -AF8B74D9AFACE39A3862BEBCB0659C00C64B6B992DE42304FCA5E2623BE08C80 -781D3CCA4B47B88C0F85FE1FD7B4CB0BED43C5D6FA77FC2577D28FB65E69D792 -5CC7346A3F7689BE188C3121790242030504BB3BC9248ED634BF04FF0062F833 -58D3E68ACFC4BA96A9F69B9BFF00ED15F2ADF519E60731C991215802ED855584 -A5218E34F9F60CEBF85FC4D6BE2DD326BEB38E68A28AFAF2C184E006325B5CC9 -6F211827E52F1311DF046403C0C1F843A85D6A7E14BF9AF2E66BB957C41AE42B -24F217611C7AADD471A027F85515540E80280381594547DD8AD747AFDC313C0D -E1FD7ADBC49E20D7F5CB7D3B4997548ED623A5E937925DC1E642240D74D23C30 -E65911E2888F2F212D62F9D86153B6AC8F0BF89AD7C5BA64D7D671CD14515F5E -58309C00C64B6B992DE42304FCA5E2623BE08C80780785FC4D6BE2DD366BEB38 -E68E18AFAF2C1967003192DAE64B7908C13F2978988EF823201E05C3952493DF -5FEBEF117F507BA8EC2E5EC6186E2F5626304371298A3793076AB38562AA4E01 -60AC40E707A579DF87FC2DE36D4BFE128D47C42DA468BE28BBB696CF46D574BB -B7D463D3627DDB55209A0880DACB0C8E49633BAFCC51238A38FB5F0BF89AD7C5 -BA64D7D671CD14515F5E58309C00C64B6B992DE42304FCA5E2623BE08C807806 -89E26B5D7B53F1058DBC7324BA25F2D85C19000AF235B41700A609CAECB841CE -0E437180094D467677D00F1C83E07EB5AAFF006FD8BE8BE1DF03E9BACF86F52D -1AFAE345D4A7D46E6FEEAE3C9115D5D192DA033BC4AB7077C8EEE4CEFC8DEC4F -7BA1685E28D5FC7963E24F1258E91A3FF66E9B77A75BDAE95A94B7FF0068FB4C -B6D233BB3DBC1E5ECFB2280007DDE61E5767CD63C01A85D5E78AFE2543717334 -F15A7882286DE39642CB0C674AD3E42880FDD5DEEED81C65D8F526B7B44F135A -EBDA9F882C6DE39925D12F96C2E0C8005791ADA0B805304E5765C20E70721B8C -004E30A705AF9FE5FF000D7D3E636CE67E367FC89BA77FD8CBE1FF00FD3C59D7 -7B5C17C6CFF91374EFFB193C3FFF00A78B3AEF6B65FC47E8BF50E81451456A23 -CAFF00685F0A785BC57E1FF0FAF8C3C51A7785747B1D5C5D79FA9A59B477127D -96E235840BC578777EF4BFCC8E7119C0070CB5FC3BE2DFF847FE0B583F87746D -234FD4AEEE67D2F42B1D3AD7C9D3EF2E1AE658E1BB8E143916B22A9BD6F2CB95 -80C8E1A4DBB8FAE550BCD0AC750D574FD4AE60F3EEF4FF0030DAB3BB15899D76 -B384CEDDFB77287C6E557914102470DCEE93E7738EEC77382F89FE1CF08DA7C2 -E9348F186BBA4431C9E6259EB7E3516D76B1EA1224A567D9718899C1691846A1 -542828AA88028F33D260F04D9E8DF0E2D3C55A678774AF87369A6EB3690A6A6A -8BA2DC5D47796D1DA5DC7F686642F710ADD5C4459DDCC734A449202EEDF4C550 -FF0084834BFEC1FEDCFED2B3FEC5FB37DB7FB4BCF4FB3791B77F9BE6676ECDBF -36ECE31CE71533A2A4EFA6DDBB34FB85CF2BF04F89AEBC37F093C3DA7E8D1C33 -5D5F6AF73A1F8696705A0FB0A5D5C0B59810479B147A7C1E7825C19D2200485E -55635FE2978461D1EDBC183578748F19786B48D36EAC27B4F1AEA51A9B9BA11C -2D0DEC8658DA391E28ADAE9E59301D2292E1D15CE636F45F16EA5E13F095FE9F -E27F12EA9A76872DBC5369B6B7FA9DF2DB4616731C92440BB052CC6DA36EE408 -CE3037675D7FB2FC53A55A5C2FD9357D367F26F6DA51B27864DACB2C32A1E41C -32A3AB0E84290780697B2BC7D9B7B25F87979B0BF53E6E0174BF863F0BEEBE2C -DD685AA5D2F87EE124D07C73A9C1135D6A124967E44D20B98917741179C24728 -F34625651E7BB1327B97C20FED4FF854BE09FEDCFB67F6D7F62597DBBFB437FD -A7ED1E42799E6EFF009B7EECEEDDCE739E6B43C53E3FF0BF81BECBFF00092789 -348F0F7DAB77D9FF00B56FA2B6F3B6E376CDEC376372E71D370F5A357F1FF85F -40D06CB5CD53C49A469DA2DEECFB2EA5777D1456D71BD4BA6C91982B6E505860 -9C8048E28A708D2936E5B2FF002D583D4E63F685F0A378C3E0BF8CAC618B51B8 -BD5D22F64B4B6D32E678A49E7FB34A1232B0B0332B16C794DB958E32A78A83E3 -57C3DD17C5BA5073E10D235CF14DF797A4D8EA77FA3C17AFA7ABB316B8632A32 -EC814CB30472AB23288C1DD2A83E99583E2AF1FF0085FC0BF65FF8493C49A478 -7FED5BBECFFDAB7D15B79DB71BB66F61BB1B9738E9B87AD69529C1F33975B7F5 -F88265792C63F02F86FC3DA4E88DA7691A3D94B67A6AB6A5339586D8158A38A3 -C9CC92B9F2E14DCE399037EF0A88DF07E357866EBC41A4E813DAC9A8CCD61E20 -D1EE3EC164C7CB900D4ED0BCB2AA8DCEB146B2B609D80167652C88C9AFE22F88 -1E03D22DB42D535EF127876CADEE337BA45EEA37D04692E63DA65B7776C1FDDC -D8DC87EECB8CE1B9BFE2AF1FF85FC0BF65FF008493C49A4787FED5BBECFF00DA -B7D15B79DB71BB66F61BB1B9738E9B87AD297238CA2DE9F901E47FB404DE32D6 -75AD12CF4DF07788AF341D1B5BD1F53175A3DC5A11A94A97B133C72235CABAC1 -1A6E3F3260CA11D9A28E02D27BD54173A85AD9CD690DC5CC304B772986DE3924 -0AD348119CA203F79B623B60738463D01AAFFF00090697F6CFB27F695A7DAFED -3F62F23CF5F33CFF0027CFF2B6E73BFC9FDE6DEBB3E6C639AA8C14252937B81E -2BF1EA7F196ABE23D260B0F07788B51F0EE91A96957892695716863BFB81A8DA -C8CCE86E524090C51CAA03A98D9E632388D6DD253CC7ED27069FA4F893C4D746 -D7C2FAD78B753F0FC717870DEEA3143AEE99749F68F28D9C2537B29725A26873 -3B5CB0427CBDAD6FF4CD8DFDAEA70B4D67730DDC4B2490B490481D4491BB2488 -48FE25756523A82A41E4559D871E9F5AC278753BBE6DFD3CFF00CC69D84A29C1 -323FCE29C22E473FE7FCFF009F4ECBA248E8A9961C9FA75007F8FF009FE8ED9D -0FDDEE3E6C7F9EDFE7A2E60200A4D2F964E7BE3D2ACAC58C7073C7F3FF003FE7 -A2AC381CE3F11FE7FC8FCA79C0AC23FCFD09C51B3FD926AE6CC7FF005B8FF3D3 -F4FC99E56171819F5C7F9FF3FA2E60278C623418C70383452A8C28EDC515F9A5 -5FE24BD59D8B6108FF003FE7FCFF0043611F97F9FF003FE43F19146DEFFD2BF4 -0A4FF771F4462E2458E3FCFF009FF3F9214C1F4FA7F9F6FF003DA523A60F0075 -A4C00718C0F4CD6D7239488AFBFF009FF23FCF6618F246467E87FCFA7F9ED39E -7073FE7FCFF9F431EDF80FF3FE7F93B8AC5711E318183DFF004FF3FE78685190 -723EB9FF00EBFF009FE564AE3AE47A7F9FF3FE098EBFE3FE7FCFE8F98562B988 -FDDC1FF38FF3FE7866CF9739FCC7F9FF003FA5AD8063FC7FCFA7F9ECD29C633C -7F9FF3FE787CC2B158C7CF6E3DF1FE7FCFE1E5135EB6A9F1B34CBFD161D76796 -18A5D23558B54D1E7B7D3ED6D144D219ED679A140D2BDCADAC6DE54ACB246031 -46112C91FB06CC718E3DB8FF003FFD6FCA3F2C28E4E3F0C7F9FF003F8297BD6D -7619E4525EB6ABF1B34CBFD163D7679618A5D27558753D1E7B7B0B5B4559A433 -DACF34281A57B85B58DBCA959648C2B146112C91EB785FC2BE31D3FE28F8A758 -D67C45F6DF0BCF6D6F6DA36991B8CAE1E59659274F2C0575694448D1B7CD1227 -9BBDD43D7A394C93C67F2F5E9FE7FF00D4CDBB402723B839FF003EDFE7A28C35 -BB7D6FF809B3C57E1A5CE95E2AD6F48B1B7D1F5DD0744F084463F0FE97A968B7 -F6802C711B51732DC4F12AB318A4748A10E4EC76924DCE42DBF4DE16F027FC23 -7F16BC63AD5B58F9361AC69BA76EBB69BCC92E6ED27BF69771662FF2A4D6EAB9 -F955022261630ABE8663E49FC307FCFB7F9EC8507A0FC3FF00D7F5FF003D08D3 -4AD7DD7F95BF21B652B6D42D6F26BB86DEE619E5B49443711C5206686428AE11 -C0FBADB1D1B079C3A9E845715E16F0143E18F8B5E31D6B4FD1AD34CD3759D374 -E2F3DA471C5F6ABD49EFDEE1DD5704BED9A125D87CD91C9C1C7A01888EA083EE -3FCFBFE54850E3FC8AD5A5269BE82D8E3F41D0AFA5F1FF0089B5ED5A0DBE5F93 -A668C77AB20B211472CB228C928F25C49223FDDDEB696F95F9033733E07D41B5 -6F8AFACEADA445AECDA3EA9621F51935FD1E7B03673C3E4A5A416A6E218A4689 -D5AF2474064547F98796656F33D53047FF005A8C54FB3DACFADFFAFEB60B9C4F -C56F0949AE7C2CF881A5E89A7C2DAC6B9A45EC4A910489AEAE5ED4C319773805 -8858D3731E02A8C8006399F0878135CF0B7C51D1AD16C77783340D12FF004FD2 -2FC4C84C704CFA7186D641B83B3C66D6E1436CC79420DD23C86435EB94944A94 -652E6F4FF31DC31452D256C20A29692800AF3BF8B976DA4EADF0F3567B2D46F6 -CB4EF104935D1D334F9EFA48A36D32FE20E63811DF6EF9635C85C02C335E8B49 -5138F32B01C17FC2EBF0F7FD03BC5DFF008466B1FF00C8B5C97C2FF89DA67877 -C357B69A8E8FE2EB7B8935BD62F153FE10FD59B314FA95CCD13656D88F9A3911 -B1D4670402081ED74959F25472E6E65F77FC11E878A7C2FF0089DA67873C357B -69A868FE2EB7B8935BD62F153FE10FD59B314FA95CCD13656D88F9A3911B1D46 -70402080BF0BFE27699E1DF0D5EDA6A3A3F8BADEE24D6F58BC54FF00843F566C -C53EA573344D95B623E68E446C7519C1008207B5D254C69CE36B4968ADB7A79F -905CF14F85FF0013B4CF0E786AF6D350D1FC5D6F7126B7AC5E2A7FC21FAB3662 -9F52B99A26CADB11F34722363A8CE08041017E17FC4ED33C3BE1ABDB4D4747F1 -75BDC49ADEB178A9FF00087EACD98A7D4AE6689B2B6C47CD1C88D8EA33820104 -0F6BA4A234E71B5A4B456DBD3CFC82E78A7C2FF89DA67873C357B69A868FE2EB -7B8935BD62F153FE10FD59B314FA95CCD13656D88F9A3911B1D4670402080BF0 -BFE27699E1DF0D5EDA6A3A3F8BADEE24D6F58BC54FF843F566CC53EA573344D9 -5B623E68E446C7519C1008207B5D2511A738DAD25A2B6DE9E7E4173C53E17FC4 -ED33C39E1ABDB4D4347F175BDC49ADEB178A9FF087EACD98A7D4AE6689B2B6C4 -7CD1C88D8EA3382010405F85FF0013B4CF0EF86AF6D351D1FC5D6F7126B7AC5E -2A7FC21FAB36629F52B99A26CADB11F34722363A8CE0804103DAE9288D39C6D6 -92D15B6F4F3F20B9E29F0BFE27699E1CF0D5EDA6A1A3F8BADEE24D6F58BC54FF -00843F566CC53EA573344D95B623E68E446C7519C100820725E01F18C51788ED -FF00B7341F1759E93A2EA5ACEAF63FF1496A8FF69BBBDD46FBCB93E4B6DC9E55 -A487E56CABFDBF90AF071F4CD254FB19FBBEF2D3CBD3CFC82E7CCF1F8C62B1F8 -792CD6DA078B8F8A746F12EADE21D26DBFE112D53FD23CCBFBC9161DC6DB627D -A2D6E1E1DCF9F2BED1BF1B9063AEF85FF13B4CF0EF86AF6D351D1FC5D6F7126B -7AC5E2A7FC21FAB36629F52B99A26CADB11F34722363A8CE0804115ED7494468 -CE0D3525A2B6DFF0770B9E29F0BFE27699E1CF0D5EDA6A1A3F8BADEE24D6F58B -C54FF843F566CC53EA573344D95B623E68E446C7519C1008202FC2FF0089DA67 -877C357B69A8E8FE2EB7B8935BD62F153FE10FD59B314FA95CCD13656D88F9A3 -911B1D467040208AF6BA4AA8D39C6D692D15B6F4F3F20BA3C53E17FC4ED33C39 -E1ABDB4D4347F175BDC49ADEB178A9FF00087EACD98A7D4AE6689B2B6C47CD1C -88D8EA3382010405F85FF13B4CF0EF86AF6D351D1FC5D6F7126B7AC5E2A7FC21 -FAB36629F52B99A26CADB11F34722363A8CE0804115ED7494469CE36B4968ADB -7A79F905D1E29F0BFE27699E1CF0D5EDA6A1A3F8BADEE24D6F58BC54FF00843F -566CC53EA573344D95B623E68E446C7519C1008202FC2FF89DA67877C357B69A -8E8FE2EB7B8935BD62F153FE10FD59B314FA95CCD13656D88F9A3911B1D46704 -0208AF6BA4A234E71B5A4B456DBD3CFC82E8F14F85FF0013B4CF0E786AF6D350 -D1FC5D6F7126B7AC5E2A7FC21FAB36629F52B99A26CADB11F34722363A8CE080 -41017C13F13B4CD23C4BF102EEEF47F17456FAA6B715E59BFF00C21FAB379B10 -D36CA12D816C48FDE4322E0E0FCB9C60827DAE92854E6945732D3CBCADDC2E8F -14F04FC4ED3348F12FC40BBBBD1FC5D0DBEA9ADC57966FFF00087EACDE6C434D -B284B605B647EF219170707E5CE30412BE09F89DA6691E25F8817777A3F8BA2B -7D535B8AF2CDFF00E10FD59BCD8869B65096C0B6247EF219170707E5CE30413E -D74942A7356F7968EFB77BF9F985CF1CF883F106C3C6BA4E95A4E93A4F8A25BD -93C41A2CC05C785753B68D638B53B696476925B75445548DD8966030B5EC74B4 -95AC62D3729310514B495A0062B07C5565E28BCFB2FF00C237AC691A4EDDDF68 -FED5D2A5BEF33A6DD9B2E61D98F9B39DD9C8E98E77E92935CCACC0C1FF008463 -FE121F0AFF006478CE1D23C4DE77FC7DC7FD9BB2CE7C3EE4FF0047964971B709 -D59BE65C8C70079D5EFC35D4B53FD9197C0D79A44377AFAF8363D3974E9DA275 -17D1D9858C062766E5995487CE0150C0F19AF64A2B29528CB7ED6F90EE79D78E -6EDBC35F12FC2FE25BAB2D46E747B7D2353D3A5974CD3E7BF91279A6B0922062 -811E4DA56DA6F9F6ED05402416507998FC21E36BEF8256F67E11BEFF00846F5D -B6D6E5D474AB6D4B7DBDB369EBA9C935B5A4E8A8658A036BE52F92A23650AB13 -6D50E95ED6064D2EC38CF4FAD4BA4A4DB6F7FD6DFE417381F88F7B6FA5F83134 -0D4359F175BDC5FDB1B6FEDBF0E69135DDF8DA143C85ADAD64485DC1FBDB13EF -318F69505791D5AEAE7C2D67E0BD7E2B5FB2EA56DA25DE916565A57863539ECE -38A69AC9967782184C96DB22B656168FB49663179A3CB32D7B77947BE41F7E3F -CF7FCA97CB03D3F1FF003FE7F9294399B77FEBEF15EC71BF08342BEF0B7C25F0 -4E8BAA41F65D4B4ED12CACEEA0DEAFE5CB1C088EBB949070C08C8241EC6B91F8 -A73CD0F8F34CBA9A6F11787EDED34D962B4D6FC33A349AADCCED34A867B7645B -7B8485145BDBB96922DD217511BA08A5593D8D61CE7DB838FF00EBFF009FE8E5 -889C751DF83FE7DBFCF4728AE4504F6FD02FA9F3ADAF87EC6DBC23F0C357D7E3 -F147866F6C3C2D159E9FA6F8534BD4E5934D9DE3B769C4FE52CC5950C36EA90D -CA9526393CC13748FA0D76D966D3FC3BE23F166A5AEF847C73168F6D04D17876 -D9EEC2DCCC0BCB0DB4462B859D97C9B8DF1C624F91125954F936F2C5EDA23C1C -E0FE83BFF9FF003D144581838CFD3FCFF9FD31F6696CFF00AEFBFDDB157397F0 -C59DF6B1E19F0CDF78AB4BB3B7F12C36D0DD5CC0815D2CEF5A0293089B736DC7 -992A6E0C7E5661B8826BC7BC7DF0CFC6973F18A4D4743B49A4F0BC32DA78B05C -45791C33C9ABC52DADACD6B1FCE8DB5F4DB79E3557C44CF752798E06DF2BE8BF -2C0C7F8FF9F4FF003D9E13AE3A8ED9FF003FE7F47520AA4545B057BE8721F0BB -C2777E09F867E12F0E5FC90CD7BA469169A7CEF01631BC914291B142402572A7 -048071D40EDD40879E573FA7F9FF003F84FB71EA3D3FCFF9FF0005C73D87F9FF -003F97E571F752482D72158B6E0F4F5E7FCFA7F9ECE098EFCFE5FE7A7F9ED2ED -E9EC319CD3B6E071F951CC35122038E7FCFF009C7F9ECBB31C608FA0FF003FE7 -F4936F18C9A0A7723AD2B95CA478FC3FA7F9FF003ECE29CFFF005A9F8FCE936F -7C64D2B8F948F1F87F4FF3FE7D94A91DB1DFFCFF009FFEB3F1C63F95260679EB -E9C7F9ED4EE2E501D0514631C515F9D55FE24BD59BA2509951F4F5A0A63B7E66 -A744CC6BF4148531FE7FCFF9FD3EEE93F723E88CAE41B723348571D7F9D58F2C -13D8FF009FF3FE7A34AE39E47F9FF3FE7A6B71DC83148C320F7A98A7F9FF003F -E7FA0506738FF3FE7FCFA55C3420DA07B50467DFD2A528450531FF00D7E29DC2 -C88483CF6EFF00CFDE8DA0F7FD3A549B79FF00EBD211CFA7AD3B8B948B1F87F4 -FF003FE7D94A91DB1DFF00CFF9FF00EB3F6F1FE146DEFF00D28B93CA458E3FCF -F9FF003F9214C1F4FA7F9F6FF3DA523A60F0075A4C00718C0F4CD55C9E5222BE -FF00E7FC8FF3D9863C91919FA1FF003E9FE7B4E7B1CF6FF3FE7FC831EDF80FF3 -FE7F93B8AC5711E318183DFF004FF3FE78685190723EB9FF00EBFF009FE564AE -3AE47A7F9FF3FE098EBFE3FE7FCFE8F98562B988FDDC1FF38FF3FE7866CF9739 -FCC7F9FF003FA5AD8063FC7FCFA7F9ECD29C633C7F9FF3FE787CC2B158C7CF6E -3DF1FE7FCFE0D68C8078E3D73FE7FC8AB7B31C63F2E31FE7FA7E4CF2481D79FA -7F9FF3FA52901576E40C51B4FB7E7568C59CE475C751FE7FCFE808F0072723DB -FCFF0091F93E602A85268DA7DBF3AB462F6EBEA07AFF009FF3D011E00E4E47B7 -F9FF0023F23980A9838CE28E956CC5EDD7D40F5FF3FE7A023C01C9C8F6FF003F -E47E473015307D28E956CC5EDD7D40F5FF003FE7A022E00C9E3D063FCFFF005B -F23980A983E9474AB5E401D8FE3FE7FCFF002043EED91FE7FCFD3F27CC055C1F -4A3A55AF200EC7F1FF003FE7F92084FBE47BE3FCF6FF003D0E602B60FA51D2AC -8831D57F339FF3FE7F04F2F6E32707B738FF003DBFCF4398457C1F4A3A559584 -64F1EC79CF7FF3FE7A27978C738EE39C7F9EDFE7A1CC057C1F4A3A55958464F1 -EC79CF7FF3FE7A27978C738EE39C7F9EDFE7A1CC057C1F4A3A55958464F1EC79 -CF7FF3FE7A27978C738EE39C7F9EDFE7A1CC057C1F4A3A55958464F1EC79CF7F -F3FE7A27978C738EE39C7F9EDFE7A1CC057C1F4A3A55958464F1EC79CF7FF3FE -7A27978C738EE39C7F9EDFE7A1CC057C1F4A3A55958464F1EC79CF7FF3FE7A27 -978C738EE39C7F9EDFE7A1CC057C1F4A3A55958464F1EC79CF7FF3FE7A27978C -738EE39C7F9EDFE7A1CC057C1F4A3A55958464F1EC79CF7FF3FE7A27978C738E -E39C7F9EDFE7A1CC057C1F4A3A55958464F1EC79CF7FF3FE7A27978C738EE39C -7F9EDFE7A1CC057C1F4A3079F6F5AB2B08C9E3D8F39EFF00E7FCF47247C753EB -C7D3FCFE5F91CC32A85240A7796467827DFF00CFF9E2AD08CE79CFF2C7F9FE9F -90B08C0CE323FCFF009FF389E702010FCD8EB8FF003FE7FCE1563180C1B1FA7F -9FF3F859D8063FC7FCFA7F9ECE0BC71DBB0FF3FE7F94B90EC57F28E3047E1F97 -F9FF003C288BA0238FAFF9F4FF003DAC6DFA8F4E3FCFF9FD176FCDD00FC7FCFF -009FD27986A242B105F6FF003FFD6FF3D9C23DBDF9FF003FE1FE7B49B493FD73 -4EDBE9F952B94A24581FE7FCFB7F9ECE09CFA7E1FE7FCFE920538C7A52EC3CE4 -633F854DC6A045B78E98EFF4FF003FE7D976FE3E952853D69DE5FE3F852B95CA -88B69FCE82B9A98479FF00EB0FF3FE7F476CC76C7E9FE7FCFE0B987A1004C720 -53B61CE3BFD6A6110C74FEBFE7FCFE0F11FBD4F30AE915C2714EF2F06A70801E -D4A1001DFF003A5CC2E62129C77C7D3FCFF9FD136E3BE3FCFF009FF3D27D833E -F49B38C6695C2E40549FF3FE7FCFE885393C7EB53ECF6A4D9F9FB0A771DC836F -B1FF0039A42A41C71F9D4FB3D0FF009FF3FE7D10AE3FCFF9FF003FA3B8EE553D -68A5718761EF457E7D53E397AB352F47FEAD3E8296923FF56BF414EAFBAA6BDC -8FA1CAC4C6693681D38FA53A8AD2C0371EF9A694E9C7E5525140D322D9F9FF00 -FABFCFF9E1BB7BF1FE7FCFF9ED35145D8EE42509E31FE7FCFF009F4695E0FF00 -9FF3FE7F09F68CFBD26DC0C034EE3B9014CD34A63B7E66ACF96298531FE7FCFF -009FD1A90EE41B723348571D7F9D58F2C13D8FF9FF003FE7A34AE39E47F9FF00 -3FE7A3B8EE418A461907BD4E23C9E3FCFF009FF3EC863E7A63FCFF009FF3D2B9 -83420DA07B50467DFD2A631D063F7A7CC2B22123AF38EF46C07BFD2A5F2CD298 -FDE8B8591015EBF9D1B47AF7F4A98A114863F7F6F4A2E1CA8876F5EDDFFCFF00 -9FFEB2ED19E3F97F9FF3FA49B727FF00AF4A633CFE5E94EE1CA8831F87F4FF00 -3FE7D9DB3F0FC3A7F9FF003ED26DE7FF00AF46C3CF18EDE945C5CA438FC3FA7F -9FF3ECED9F87E1D3FCFF009F6936F3FF00D7A361E78C76F4A2E1CA438FC3FA7F -9FF3ECED9F87E1D3FCFF009F6936F3FF00D7A361E78C76F4A2E1CA438FC3FA7F -9FF3ECED9F87E1D3FCFF009F6936F3FF00D7A361E78C76F4A2E1CA438FC3FA7F -9FF3ECED9F87E1D3FCFF009F6936F3FF00D7A361E78C76F4A2E1CA438FC3FA7F -9FF3ECED9F87E1D3FCFF009F6936F3FF00D7A361E78C76F4A2E1CA438FC3FA7F -9FF3ECED9F87E1D3FCFF009F6936F3FF00D7A361E78C76F4A2E1CA438EFD3FCF -FF005BFCF65D9EFF00A7F9FF003FA4BB79FF00EBD1B0F3C63B7A5170E54438F7 -FF003FE47F9ECBB083DFF01FE7FCFE92EDE7FF00AF46C3CF18EDE945C390871E -FF00E7FC8FF3D8DA4763F97F9FF3FA4DB79FFEBD1B0F3C63B7A5170E421C7BFF -009FF23FCF63691D8FE5FE7FCFE936DE7FFAF418F39C8C7D68B87210E3DFFCFF -0091FE7B1B48EC7F2FF3FE7F49B6F4C7E8693CB27A8FCF8FF3FF00D6A2E2E522 -C7BFF9FF0023FCF63691D8FE5FE7FCFE92EC3DBF4A3CB27A8FCF8FF3FF00D6A2 -E1CA458F7FF3FE47F9EC6D23B1FCBFCFF9FD25D87B7E947964F51F9F1FE7FF00 -AD45C3948B1EFF00E7FC8FF3D8DA4763F97F9FF3FA4BB7D3AFB5063EE47E945C -3948B1EFFE7FC8FF003D9DB3B7F4FF003FE7F4785F4A76C3CF6EDCF145C6A245 -8C038C8EF4BB73D3B74A90212053FCB00FF8D2E61D910EDEA7BD2EDA94479FFE -B0FF003FE7F47ECE9D73FE7FCFF9E173068401381C6052EC3CD58110069447C7 -6A9E60E620F2FDBF334A100FF3FE7FCFE93840294280052B8B988BCB24E0FEA3 -FCFF009FD14467AE3FCFF9FF003E92E052D215C8C47D3FC69C131DFF00953A8A -057100F5E7EB40007402971460F1C51615C28A76D39EDF9D26C34682128A5E69 -29D8028A5A4A2C014518A29586148001D00A5C51401424FF0058DF534512FF00 -AC7FA9A2BE02A7C72F53A56C69429FB94E9F741EBFE7FCFE8BE577C1C0FF003F -E7E9F958B64CDB447AFCABD3F0FF003F87E4BE4E001DFD87F9FF003F4E3EE69C -BDC8FA1CCF72A6CE073C50508EFD2AD98F7023AFB1C71CFB7F9E3DB88F66DC76 -EE0E71FE7B7F9E9ADC456C628AB063193D80E0FF009E3D3FFD5D98631E83F0FF -003F5FF3D0BA022A2A4319EE08EDD3FCFBFE5F934C7819CFF4A7A00DA29769CF -FF005E8DA40CE318A004A4A5C51823A8C5160B898CD0140E8297145161DC4C66 -93681D38FA53B145160B8DDB9EF46C03FC8A7514582E3420E3FF00AD49B053E8 -A02E4623E9FE34797FE73525140EE47E5FF9CD26CF63F9FF009FF3FA4B450172 -2F281EA3F5A411E3F87F23FE7FCFE9351405C88C591DA93CB23B7F9FF3FE7D26 -A280B90F944F5C7F9FF3FE7B1E591DBFCFF9FF003E9351405C84C79E0FF2FF00 -3FE7F44119EA07F9FF003FE7D27A280B9098F3C1FE5FE7FCFE88233D40FF003F -E7FCFA4F4503B9098F3C1FE5FE7FCFE88233D40FF3FE7FCFA4F450172131E783 -FCBFCFF9FD10467A81FE7FCFF9F49E8A02E4263CF07F97F9FF003FA208CF503F -CFF9FF003E93D1405C84C79E0FF2FF003FE7F44119EA07F9FF003FE7D27A280B -9098F3C1FE5FE7FCFE88233D40FF003FE7FCFA4F450172131E783FCBFCFF009F -D10467A81FE7FCFF009F49E8A02E4263CF07F97F9FF3FA208CF503FCFF009FF3 -E93D1405C84C79E0FF002FF3FE7F44119EA07F9FF3FE7D27A280B9098F3C1FE5 -FE7FCFE88233D40FF3FE7FCFA4F450172131E783FCBFCFF9FD10467A81FE7FCF -F9F49E8A02E4263CF07F97F9FF003FA013BEDFCBFCFF009FE535140AE4623E47 -F8D38201DFF953B14502B898CD038E9DA9714A14FA631EB45AC2128A76D39C7F -5A5117039FD3FCFF009FD07640328AB02024FD3A803FCFF9FD058C8EBF2F71CE -3FCFF9FC0BA0200A69761EF8FCEAC2C3C9E3D8F39C73FE7FCF47AC1C0C9FD3FC -FF009FD06C0AC22393D8FA1E3FCFF9FC1C220704F4FF003FE1FE7B5B11807FC3 -B7F9C7E9F93826075E9C75C7F9FF003F84DC65510107183F97F9FF003FA2AA01 -8391F5CF4FD7DBFCF6B2100FF3FE7D3F4FC9707F2FF3FD3FCF6570B15BCA2300 -8FC3F2F7FF003FC9BB4000E40F71DBFCE3FCF6B4506738E7EBFE7D3F4FC8DA07 -B7E3FE7FCFD382E80AA63DBC1247B1FF003FE71F934A65739CFD47F9F4FF003D -AD04E7FCFF009EDFA7E4DF2B8C9C671E9FFD7FF3FC9DD0158C582471C7BE3FCF -F9FC1BE5E474381DFF00CFF9E0FE17027B11F8E31FAFF9C7E4821014676E7E9F -E7FCFE8EE22A08BAF63EE71FE7FCFE018FD8E3FCFF009FC3F2BBE58FFF005718 -FF003FD3DB868840033B73F4FF00EBFF009FE45C0ABE4E0F4C7B13FE7FCFE8BE -50C67F9E7FCF6FF3DAD88C0FC3A63B7F9C7E9F9208F6F4201F5031FD7FCFF22E -8660CE36CD20F4623F5A296E462E251FED9FE7457C0D4F8E5EA74AD8DDB51FE8 -B0FF00B83BFB7FF5BFCF6976F3D3FCFF009FF3E8968B9B487D762FF2A94AF7EF -F4AFB5A7F02F433E522C71FE7FCF6FF3D93601E9F81FF3E9FE7B4A5703A9007F -9FF3FE708579F4F6CFF9FF003FA69727948B6FB9FF0038FF000FF3D9A62CE01C -11FF00EAFF000FF3DA720F5F4EF9FF003FE7F436F38C63F1FF003FE7F462E52B -2C3B71C63E87E9FF00D7FF003D0F2BA64138F7FA7F87FF00ABB582BC67D3BE7F -CFF9FD02BCF61FE7FCFF009E85C5CA55F2480011F87E5FE7FCF0084E41C0FAFF -0093FE7DBB59DBC7D3FCFF009FF385DB9F41FE7FCFF9E8EE09157C938C11F87E -5FE7FCF0D0838395FAE7FF00AFEDFF00EAED6CAE3FCFF9FF003FA1B4FE3EDFE7 -FCFF0022E162A984F03F41F87F9FC3F26AC5C06DC07F9FF3FE7A5CDBEB9F6CFF -009FF3FC80A7A0EDE9FE7FCFF2770B14CC04360839FA7F9FF3FA376291927EBC -7F9F7FF3D2E9403923E9FE7F0FF3D93663DB1C75C7F9FF003F817158A860238C -73D7A633FE7FCFB33CA18CFF003CFF009EDFE7B5DD80738FD7FCFA7E9F92ECC7 -7C63DFFCFF009FD0B858A261C123D3DFFCFF009FD13CAF638FF3FE7F0FCAF6C1 -C75FCFFCFA7E9F923443DB238C9FF3FE7F93E641629F938F63EE7FCFF9FD13CA -2738071FE7FF00AFF955D1181F874C76FF0038FD3F24F2401FC39F5C7FF5FF00 -CFF277114BCB23D8FBD062239EDEA6AF7963FF00D5C63FCFF4F6E1BE40DB8F94 -1F5C7F9FF3FA1CC329043C5050FB7E7574467BE7F9639FF3F97B70DF2303AF3F -41FE7FCFE45C4540878A0A1F6FCEAE88CF7CFF002C73FE7F2F6E1BE46075E7E8 -3FCFF9FC8B815021E28287DBF3ABA233DF3FCB1CFF009FCBDB86F9181D79FA0F -F3FE7F22E0540878A0A1F6FCEAE88CF7CFF2C73FE7F2F6E1BE46075E7E83FCFF -009FC8B815021E28287DBF3ABA233DF3FCB1CFF9FCBDB86F9181D79FA0FF003F -E7F22E0540878A0A1F6FCEAE88CF7CFF002C73FE7F2F6E1BE46075E7E83FCFF9 -FC8B815021E28287DBF3ABA233DF3FCB1CFF009FCBDB86F9181D79FA0FF3FE7F -22E0540878A36107B71EF574467BE7F9639FF3F97B70DF2303AF3F41FE7FCFE4 -5C0A810E051B083DB8F7ABA233DF3FCB1CFF009FCBDB86F9181D79FA0FF3FE7F -22E054087028D841EDC7BD5D1191D73FA0C7F9FE9EDC37C8C0EBCFD07F9FF3F9 -1702A6C381EF46C3EDF9D5D119EF9FD0639FF3F97B70DF2303AF3F41FE7FCFE4 -EE0530A7D29761F6FCEAE88CF7CFE831CFF9FCBDB86F9181D79FA0FF003FE7F2 -2E0530A7D29761F6FCEAE88CF7CFE831CFF9FCBDB86F9181D79FA0FF003FE7F2 -2E0530A7D29761F6FCEAE88CF7CFE831CFF9FCBDB86F9181D79FA0FF003FE7F2 -2E0530A7D29761F6FCEAE88CF7CFE831CFF9FCBDB86F9181D79FA0FF003FE7F2 -2E0530A7D29C22273DF1570467BE7F418E7FCFE5EDC22C381CE33F4FF3FE47E4 -5C0AA22FCFD09C7F9FF3F83844BD4F4FF3FE1FE7B5B11807FC3B7F9C7E9F9384 -7DBD38EBFE7FCFE9371D8AC212081CE33D31F4FF003F87E4AB1670460FBFF93F -E7DBB5AD8073D3D3FCFE1FE7B285FA71FE7FCFF9C2B8EC5758718E307BF3F4FF -003FE7870880001E71D7EBC7F87F9ED305E323B7F9FF003FE70E0BCFEB8FF3FE -7FA2B8289105E39FD7FCFB7F9ECEF2F6E38C7D07F9F4FF003DA42A7DE9766476 -A572F948B1C7F9FF003DBFCF676D19EBFE7FCFF9F49027F914E11FBD2B8F9575 -22DBCFBFF9FF003FE780AFFF005BFCFF009FF094A63D6829C75A076443B71EDF -D3FCFF009F65DA3D47B7F9FF003FE126290AF5EA28D4764464633DBBFF009FF3 -FF00D60AFF009C7F9FF3FA3CAE7A75A528475A0564447BFE7FE7FCFF00F58DBF -87F9FF003FE7A481727DE9DB0F3DBF1C517172A21C0C1C7D7E9FE7FCFB1B47AF -7F4FF3FE7F4976F3FF00D7A5D9C1EDDBAE280E54458EBD477FF3FE7FFAC6DF7F -A7F9FF003FE126CE7FFAF4ED98A0764424633F9FF9FF003FFD60AFFF005BFCFF -009FF0976D3B67F9C5016472B77FF1F737FBEDFCE8A5BC18BB9FFDF6FE7457C3 -54F8DFA9A1D2D9A1FB1407FE99AF5FA7F9FF003D24F2FF00CE7FCFF9FD1D60A3 -EC56E7FE99AFF215385C0FFEBD7D9D3F817A1973158C7FE73FE7FCFE814F6FD6 -AC6D149E58ED8AD2E1CC41B3FCE7FCFF009FD13CB23B559098AE0352F8FBF0BB -45D46EF4FD43E24F842C6FED25782E2D6E75DB58E5864525591D0C80AB290410 -40208C7D25C947761CC76BB4D06320FF00F5EB82FF008690F845FF00454FC15F -F850DA7FF1CA4FF8690F8478FF0092A7E09CFB7886D3FF008E7F9FE4BDAC3B8E -E77DB38A4D983F4F7AE73C25F167C0BE3DD4A4D3FC33E34F0F788EFE288CEF6B -A4EAB05D4A91860A5CAC6E48505946718CB0F515D679640FF0FF003FE7F95292 -7B30E62B6D3EF48531564C63D3F4FF003FE7F43671FF00D6FF003FE7F4770E64 -5611E3A0FA71414EA2AC79401FF1FF003FE7F90531FF00EBC7F9FF003F83B85D -15B67A71415E0D58F2FF00CF5FF3FE7F036FE1F8FF009FF3FA170D0ADB3D0629 -4AF5A9FCAE78FD39FF003FE7F00A77200FF3FE7FCF42E1A15F69FA7F9FF3FE7A -053DBE9FE7FCFF0084FE5FE9FE7FCFF9C1B07B7F9FF3FE7B3B868418C67B7AFF -009FF3FE0857FF00ADFE7FCFF85831FF009FF3FE7FA218E8B85910118CF3EFFE -7FCFFF0058D9EFF4FF003FE7FC26D94BB3FCE28B8591010467B77FF3FE7FFAC6 -CF7FA7F9FF003FE1314C52ECF7FD280B2202BD7F3FF3FE7FFAC6C1EA3FCFF9FF -003DA6298A5D9EFF00A5170B22B95C67B77FF3FE7FFACBB07A8FF3FE7FCF698A -629767BFE945C2C8AE5719EDDFFCFF009FFEB2EC1EA3FCFF009FF3DA6298A5D9 -EFFA5170B22B95C67B77FF003FE7FF00AC6D1EBDFF00CFF9FF00227298A5D9EF -FA51715915F6F5EDDFE9FE7FCFB1B47AF7FF003FE7FC89CA628F2FAF268B8591 -06DEBDBBFD3FCFF9F6368F5EFF00E7FCFF0091318F1CF34BE5F0793FCA8B8591 -06DEBDBBFD3FCFF9F6368F5EFF00E7FCFF0091318C839228F2CF345C39510EDE -BDBBFD3FCFF9F6368F5EFF00E7FCFF0091318C839228F2CF345C39510EDEBDBB -FD3FCFF9F6368F5EFF00E7FCFF0091318C839228F2CF345C39510EDEBDBBFD3F -CFF9F6368F5EFF00E7FCFF0091318C839228F2CF345C39510EDEBDBBFD3FCFF9 -F6368F5EFF00E7FCFF0091318C839228F2CF345C39510EDEBDBBFD3FCFF9F636 -8F5EFF00E7FCFF0091314C1E78A0C7D7F2EB8A039510EDEBDBBFD3FCFF009F63 -68F5EFFE7FCFF912ECE7FF00AF4A63EBF975C501CA8876F5EDDFE9FE7FCFB1B4 -7AF7FF003FE7FC897673FF00D7A531F5FCBAE280E5443B7AF6EFF4FF003FE7D9 -760EC7FCFF009FF3E926CE7FFAF4FD9EFF00A5171F2A21DA7E9FE7FCFF009E8B -B7B76A9847D3FCFF009FF3F838260E718FD3FCFF009FC15C342011FA0C7A52EC -C1FF00EBD4E2219FF3FE7FCFE4E09C7F9FF3FE7F202E915C26453B675FF1AB01 -314040051717310F97EC7F2FF3FE7F4704FF003FE7FCFF0049768A5C52B93723 -09EBFE7FCFF9F6367B1FCFFCFF009FD24A28B8AE45B0E7D3FCFF009FF3D131FE -7FCFF9FE93518ED40EE4254F423FCFF9FF003E89B3BE71FE7FCFF9E936D14018 -A2E17212873CE4FF009FF3FE7A285EFC0FF3FE7FCF4A5E22F1268FE10D1EE357 -D7B54B1D134AB7DBE75FEA37096F045B982AEE91C851962A064F24815C5FFC34 -9FC221FF00354FC15FF850D9FF00F1CA9738AD24C2E7A16CCF07FCFF009FF3EC -8171E9FE7FCFF9EDE7DFF0D27F08FF00E8A9F82BFF000A1B4FFE3947FC349FC2 -3FFA2A7E0AFF00C286CFFF008E54FB487F305D9E85B3D7FCFF009FF3EC08CFA7 -F9FF003FE7D3CF7FE1A4FE11FF00D153F057FE14367FFC72BBED3752B3D6B4EB -5D434FBA82FAC2EE249EDEEADA459229A360191D1972194820820E0820D529C6 -5B3B85D9284C7F9FF3FE7F4367B1FCFF00CFF9FD24A3BD55C572309FE73FE7FC -FE808FDBF5FF003FE7F4928EF405CE36F862F6E3FEBA37F3A28BFF00F8FEB8FF -00AE8DFCE8AF88A9F1BF5374757603FD06DFFEB9AFF2AB18A4D362DF636C47FC -F24E07D07F9FF3C4E63C724000FF009FF3FE71F654EDC8BD0E66418A5C54C61C -7A6476E9FE7FCFE07963DBFCFE3FE7F969A01062BCE7E017FC88DAA7FD8D7E25 -FF00D3E5F57A63427FCF03F5FF003FD3CDFE00C79F02EA7C9FF91AFC4BC7FDC7 -2FAB3D3997CFF419E854B8A7F9471DC7D7FCFD7F2A511E7B9F7E2B456022A315 -218C8EB907F4FF003D7F2A4D8704F1400CA314EDBCF6FCE9761E6815C6518A76 -D39FFEBD0571D450171B46D03B52E294823A8A63B8DA4DA076C53BB518A02E36 -8DA01F4A7518A02E371EF49B07F914FC518A02E336814863A7E2971405C8C47F -E73FE7FCFE8797FE7FCFF9FE8FC518A0771823FF0039FF003FE7F43CBFF3FE7F -CFF47D18E68B85C608FF00CE7FCFF9FD0F2FFCFF009FF3FD1F4639A2E171823F -F39FF3FE7F43CBFF003FE7FCFF0047D18E68B85C608FFCE7FCFF009FD0F2FF00 -CFF9FF003FD1F5C57C6FF116A1E10F82FE3FD7B48B8FB26ADA5F87F50BEB3B8D -8AFE54D1DB48F1B6D6054E1941C1041C720D4B928A6D85CEC847FE73FE7FCFE8 -797FE7FCFF009FE9E79FF0AAFC4FFF00458BC6BFF809A1FF00F2B68FF8557E26 -FF00A2C5E35FFC04D0FF00F95B53CCFF0095FF005F30B9E8623FF39FF3FE7F43 -CBFF003FE7FCFF004F3CFF008557E27FFA2C5E35FF00C04D0FFF0095B47FC2AB -F137FD162F1AFF00E02687FF00CADA399FF2BFEBE6173D0C47FE73FE7FCFE879 -7FE7FCFF009FE9E79FF0AAFC4FFF00458BC6BFF809A1FF00F2B6B92F1C7863C6 -5E0DD4BC3774FF0017BC5D2787AF7504D2B5091ACB45F36DA4B8223B49948D38 -EE53706380A042737292174485F72752CAEE2FFAF98EE7B808FF00CE7FCFF9FD -0F2FFCFF009FF3FD3E63F0ECBE3EF124DA16976FF16BC50359D43C41AE5BCC7E -C1A37976DA569BA8CD6D24FB4D80DF2362D21C07043DDF9A1192274AF59FF855 -7E26FF00A2C5E35FFC04D0FF00F95B4A353995D45FF5F303D0C47FE73FE7FCFE -8797FE7FCFF9FE9E79FF000AAFC4FF00F458BC6BFF00809A1FFF002B68FF0085 -57E26FFA2C5E35FF00C04D0FFF0095B55CCFF95FF5F315CF4311FF009CFF009F -F3FA1E5FF9FF003FE7FA79E7FC2ABF13FF00D162F1AFFE02687FFCADA3FE155F -89BFE8B178D7FF0001343FFE56D1CCFF0095FF005F30B9E8623FF39FF3FE7F43 -CBFF003FE7FCFF004F33D05F5FF06FC57D1FC317DE2DD53C5B61AC689A8EA4D2 -6B505924B6B25ACF631A088DADBC036B8BD7DC1C39CC71ED2BF36EF4FC735519 -5FA05C608FFCE7FCFF009FD0F2FF00CFF9FF003FD1F4639AAB85C608FF00CE7F -CFF9FD0F2FFCFF009FF3FD1F4639A2E171823FF39FF3FE7F43CBFF003FE7FCFF -0047D18E68B85C608FFCE7FCFF009FD011E29F4B8A02E340C0A0281DA9D8A314 -0AE2518A7019A708C9FF00EB5215C8F14B8A90444751CFBF03FCF5FCA9DE58F6 -FF003FE7FCF634021C515298B1FE703FCF5FF3D031E7DBD71E9FE7FCFA00458A -2A43111D4107FCFF00F5FF002A3CBCF73D7D280D88F1462A4F28F7C83EFC7F9E -FF009528887F9FF3FE7F900458A0D4C61C73C6476E9FE7FCFE07963DBFCFF9FF -003D8D00871454E21E7FA01FE3F8FF009E8863C724000FF9FF003FE70C3621C5 -153AC3927DB8200FF3FE7F4704E9C63B8F9B1FE7B7F9E8AE0703E22F1F6BBA26 -B3716565F0D7C51E20B68B6ECD474EB9D2920972A09DA27BD8E4E092A7720E54 -E32304E2FECE1752DF7C34B9B99ECE7D3A79BC4BE2291ECEE4A196063AD5E931 -B98D990B29383B599720E091CD7AC187938EDC100E7FCFF9FC3CDBF67F5FF8A1 -3533C8FF008AAFC4C4738FF98E5F7FF5BFCF4CBEDAD7BFE833D0707D29769F6F -CEAC2C23278F63CE7BFF009FF3D1026DC1CE3D39FF003EDFE7A6B7115F6934BB -4FB7E7567CB041E39EE38E39FF003FE7A288F0072723DBFCFF0091F92B8EC701 -7FFF001FD73FF5D1BF99A29DA98C6A577DBF7AFF00CCD15F1553E37EA742D8EE -74B5CE99687FE99277FF00647F87F9ED6B660F61F8FF009F4FF3D99A5293A559 -73FF002C53A7FBA2ACECEFDFD315F59097BA8CF9480AE7FCFF009F4FF3D8F2F0 -7AE3F1FF003E9FE7B79EFF00C331FC1FE9FF000AA7C107DFFE11CB3FFE3747FC -3327C1FEBFF0AA3C11F4FF008472CFFF008DD1CD3ECBEFFF00801CA7A16CEF93 -FE7FFD5FE7B7CFDF08744F88F75E1CD724D0BC57E16D37493E2CF127936BA978 -62E6EE74C6B57A1B74A9A842AD960C46235C020738CD745A4F80FC37F0D3F680 -F0BE9DE10F0F697E15B0D53C31AD5C5FDAE8965159C57724375A52C0F2A44143 -B46279C29604A89A4031B8D6DFECFABFF141EABFF636F89B8071FF0031DBEFF3 -FE789E6E6959F9FE81CA761E1BB3D5ED346B78F5EBEB1D4B565DDE7DD69B64F6 -703FCC4AED89E595970BB41CC8D9209E3385F9FBC413FC37F197C7B8744D03C4 -9A1EA1F12C6AB6BA8DD6AB35FDBC97DA35B5A34626D2ECF189BF7C2D2E565B64 -388D6E2EE494AF991C537D35B4E739FC73FE7FCFE8BB4671D3DB3FE7FCFE9725 -CC92158F92753BEF0DDEF88A782F6EF4AB9F8ED63E3CB58122F3636D6E0D24EB -10491A5B007CC4B5FEC8903C821C26D7B932FCE6E2BEACF2BA6467F1FA7F87F9 -ED64A9C673D3A9CFF9FF003FA295E718C7E3FE7FCFE84172DC2C5558B18E08F5 -E7E9FE7FCF09E560838E477CFF009FF3FA58DBC7F87F9FF3FC94A7CDD00FF3FE -7FCF4D798562AF9471823F0FCBFCFF009E0109041C7E3FE7FCFF004B3B463FCF -F9FF003F9284CF603FCFF9FF003D0E60B157CAEC7F2FCBFCFF009E1020EA081E -F9FF003FE7F4B6531FE71FE7FCFE09B0FF00FABFCFF9FE4730AC54F28F00E7E9 -FE7FCF1F92088119DC3FCFF9FF003DAD9403AE7DB8FF003FE7F4509D40EDE9FE -7FCFF27CC16299830718FD3FCFF9FD1362E339FD3FCFF9FD2E3201CE3E9FE7F0 -FF003D93CBC7B63DFF00CFF9FD0E60B14DA12A7A7E7C67FCFF009F64F2B8CFE3 -FCFF00C3FCF6B9B00C7F8FF9F4FF003D94478FC38EBFE7FCFE8F982C5230E091 -9FD7FCFF009FD10C679C03FE7FCFE9577CB031FE3FE7D3FCF669840EC3F2FF00 -3FE7F4398562A795F87D4FF9FF003FA0633CE01FF3FE7F4AB82303F0E9FE7F0F -F3D9BE48F6CFD3FCFF009FD1F3058ABE57E1F53FE7FCFE818CF3807FCFF9FD2A -E08C0FC3A7F9FC3FCF66F923DB3F4FF3FE7F43982C55F2BF0FA9FF003FE7F40C -679C03FE7FCFE95704607E1D3FCFE1FE7B37C91ED9FA7F9FF3FA2B858ABE57E1 -F53FE7FCFE88633CE01FAFF9FF003C55D1181F874FF3F87F9ECDF247B67E9FE7 -FCFE85C2C55F28FD3EB5E6FF00B4A4647ECE9F153838FF00845355FF00D2397F -FAF5EA82303F0E9FE7F0FF003DBCFBF684D1EEF59F805F12F4FD3ED26BFD42EB -C33A9DBDBDADAC4D24B348D6B2AAA222E4B31240000C93C01E9137EE30B6A76B -E51FA7D693CB6E7835744607E1D3FCFE1FE7B37C91ED9FA7F9FF003FA5F3058A -BE51FA7D693CB6E7835744607E1D3FCFE1FE7B37C91ED9FA7F9FF3FA1CC162AF -947E9F5ACCF12F866C3C5FE1CD5741D5AD8DE693AA5A4B657706F64F361910A4 -8BB94865CA96190411D88ADF1181F874FF003F87F9ECDF247B67E9FE7FCFE85D -3D1858F13FD9C3E07EBBF08B49D7A7F17788E0F1678A755D42E249354B7B516A -BF6537571711466353B43196EEEA66C0F95AE5A305922435EC2626E78ED9FF00 -3FE7B55D1181F874FF003F87F9ECDF247B67E9FE7FCFE9304A115140CA9B0FD3 -EB4189B9E3B67FCFF9ED5744607E1D3FCFE1FE7B37C91ED9FA7F9FF3FA573058 -A9B0FD3EB4189B9E3B67FCFF009ED5744607E1D3FCFE1FE7B37C91ED9FA7F9FF -003FA1CC163CB35E423F68CF038E87FE114F1075FF00AFCD1ABD20C4DCF1DB3F -E7FCF6AE3359D26F24F8FBE0DD412D677D3EDFC33AE412DD2C6C628A47BBD25A -3467E8198452100F2446F8FBA71DF7923DB3F4FF003FE7F488BD65EBFA20B153 -61FA7D6831373C76CFF9FF003DAAE88C0FC3A7F9FC3FCF66F923DB3F4FF3FE7F -4BE60B15361FA7D6831373C76CFF009FF3DAAE88C0FC3A7F9FC3FCF66F923DB3 -F4FF003FE7F43982C54D87E9F5A0C4DCF1DB3FE7FCF6ABBE58E9F963FCFF009C -7E4D108031C7E5FE7FCFE8F982C54D87E9F5A5119F43F53D29FA9E9365ADE9B7 -7A76A36905FE9F7713C1716973109229A26055D1D1B2194824104608E3E9C00F -D993E1077F855E083FF72ED98FFDA7FE7F94393E882C77E20C7183FE7FCFF9EC -E54C60E47D73D3FCFF009F6F3F1FB32FC1F1FF0034A7C13D3FE85DB3FF00E37F -E7F9739E32F863FB387C39FB27FC259E15F859E18379BFECDFDB3A769B69E7EC -C6FD9E62AEEDBB9738E9B86719150E725BA5F7FF00C01D8F665888C76C7FF5BF -CFF9E1C22E99EDEFFE7D3FCF6E1BF679D42F35BF801F0CF51D42EE7BFD42EFC3 -1A65C5C5DDCC8D24B348D69133BBBB1CB31249249C93CFD3D076F271803FCFF9 -FF003C353E6498F97A102C617FCFF9F4FF003D8F2F8E403FE47F87F9ED311C0C -9FF3FE7FCFA1B73D80FF003FE7FCF4770B742B88B1CE307BE0E3D3FCFF009E0F -2B90083F9FF9F4FF003DAC15C7B0FF003FE7FCF014F9BA01FE7FCFF9E8F982C4 -021C63B7AF3FE7D3FCF6045D33DBDFE9FE1FE7B4E17B8F4EDFE7FCFF00276D19 -C631ED9FF3FE7F45CC0A25758F1E83E9FE7DBFCF63CB1DFF0097F9F4FF003DA7 -2A719CF4EA73FE7FCFE8BB46718C7E3FE7FCFE8730F9480260019E3FCFF87F9E -CA131DF1FA7F9E9FE7B4BB4E739FC73FE7FCFE8BB707F1E99FF3FE7F4570B10E -CE3A9FF3FF00EAFF003D9447B7FF00D7FE7D3FCF69719E49E9DFFCFF009FE8ED -BC7F4A3987CA41B78FF3FE7B7F9EC6CDA7B0FC7FCFA7F9ED3953EA6936F7EFE9 -8A5CC1CA458E39FF003FE71FE7B79B7ECFB1E3C09AA607FCCD9E26E9FF0061DB -EFF3FE78D7F127C3CD7B5CD66E2F2CBE26F8ABC3D6D2EDD9A769B6DA4B5BC385 -0A7699EC6590E482C7739E58E30300627ECD3652D87C31BAB69EF27D4E787C4F -E248E4BCBA58C4B70CBADDF032388D510331193B555727800600CF9BDF5A77FD -06A27A6E38FF003FE7B7F9ECA508EC7FCFF9FF003DA6DBC63A7D28D99EB8AD39 -8394876F1FE7FCF6FF003D8D8738C1FAFF009FF3FD26DB8FE9418FD47E9FE7FC -8A398394F35D57FE42779C63F7CFFF00A11A28D586354BCFFAECFF00FA11A2BE -3E7F13343D174842749B2EBFEA13FF0041156B68FF003FE7FCFF0028B4651FD9 -163C7FCB08FF00F4115736D7D3C1FBA8CEE43E5FB1FCBFCFF9FD1A539A9F68CD -2EDABB8731E59AFA7FC649F813FEC52F10F7FF00A7CD16B9AFD9F3E25F83BECD -AAF83FFE12CD0FFE12DFF84B7C4FFF00120FED287EDFFF00219BF97FD46EF33F -D5FCFF0077EEFCDD39AEB35F5FF8C94F027FD8A5E21FFD2CD168FD9E57FE281D -57FEC6DF13FF00E9FAFEB14DF3E9FD6C3E63D1367F9CD053DBF5A9C26293656D -717315F69A5D8476A9F60A0271DA9DC7CC57D946CC1FFEBD58D829366051CC1C -C41B78CD26CC7FFAEAC6CA367E747305D15F69C719A42BFE4D58F2C7A7E94857 -14F982E880478E831E9C5214EB560463DA82B8A398342BF96074E2829C1EFF00 -8D4FE5FA5295F5FF003FE7FCFB1CC1A15B60EC31432673C54FE5F3FE1414E738 -A7CC1A106C3F9D053DBE95314A5D828E60B2202BD79C7AD2151EDEDFAFBD4E52 -94A0A3982C880AF5E71EB48547B7B7EBEF53ECA3CBF7A3982C884AF5E71EB485 -47B7B7EBEF583E3AD67C41A2DA69A9E1AD1EC75BD4EF2EFECE21D4AF2E2CE08D -0452485DA686D6E367FABC0F3151496037EE2AADC843F19AF357F0F686BA2E83 -05E78C355D4750D2D747B8D41A2B6825B09A686F6792E1617905AAC9018D26F2 -32CF716AAE9119BE497512760B23D38AF5E71EB48547B7B7EBEF583F0EBC5FFF -0009E78593546B4FB05CC77779A75DDB097CD48EE6D6E65B59C46FB54BC7E6C1 -26C72A8593692884955E97CBF7AA52BABA0B2212BD79C7AD2151EDEDFAFBD657 -8BFC6FE1BF87BA6C5A8F8A7C43A5786F4F96616E977AC5EC56913CA559820791 -802C42B1C75C293D8E390FF8699F83BFF4567C0FFF00851D9FFF001DA4EA456E -C7647A295EBCE3D690A8F6F6FD7DEBCEBFE1A67E0EFF00D158F03FFE14767FFC -7697FE1A67E0EFFD159F03FF00E14767FF00C7697B48F70B23D14AF5E71EB485 -47B7B7EBEF5E75FF000D33F077FE8AC781FF00F0A3B3FF00E3B5E9853DE9A9A7 -B30B2212BD79C7AD2151EDEDFAFBD4DB0D294F7AAB8AC884AF5E71EB48547B7B -7EBEF536C34A53DE8B8591095EBCE3D690A8F6F6FD7DEA6D86B88F12FC72F86B -E0DD6AE747D7FE21F85743D5EDB6F9FA7EA5AD5B5BDC45B9432EE8DDC32E5595 -86472083DE939A5BB1D91D915EBCE3D690A8F6F6FD7DEBCEBFE1A67E0EFF00D1 -58F03FFE14767FFC7697FE1A67E0EFFD159F03FF00E14767FF00C76A7DA47B85 -91E8A57AF38F5A42A3DBDBF5F7AF3AFF008699F83BFF004563C0FF00F851D9FF -00F1DADDF087C5EF00FC41D4E5D3BC2DE38F0E7897508A2370F69A3EAD6F772A -441954B948DC90A0B28CE31961EB42A917B30B23A92BD79C7AD2151EDEDFAFBD -4DB0D294F7ABB8AC884AF5E71EB48547B7B7EBEF581E3AF10EB3E1FB5D362D03 -41FEDFD5B51BBFB2431CF3BDB59DBE22926696E6748A56863DB0B20611B66478 -938DE5979187E33DE6AFE1ED0D745D020BDF186ABA8EA1A5AE8F71A83456D04B -6134D0DECF25C2C2F20B559202893791967B8B556488CDF243A893B0EC8F4E2B -D79C7AD2151EDEDFAFBD607C3AF187FC27BE164D51ECFF00B3EE63BBBCD3AEED -84BE6A47736B732DACE237C2978FCD824D8E550B26D251092A3A629EF54A5757 -42B2212BD79C7AD26CCF4EDD299A9C17B2E9B769A74F05AEA0D0B8B79EEA1334 -51CBB4EC678D5D0BA86C12A1D49008DCBD479B78075DF1E5CFC51D6740D7359F -0E6BFA3693A746F7B77A468771A7B437D330686DC3BDEDC2BB2C28F24A8C2364 -59ED186E594ED4E76690591E9C107618AF36F8CBAA7F65FF0063FF00C553E38F -0D6FF3BFE44DF0D7F6C79D8D9FEBFF00E25F77E5EDCFCBFEAF76E7FBDB7E5E7B -F67AF887F10BC69F621F1163B1F0DEAF77A426A29E1993C3D2585D90DE5EE9A3 -98EA170B2471B398DE368E39919E232A44248C3AF8D3E2BE97E27FB1FF0066EB -FF00157C1FE46FF33FB17E1DDFC9F68CEDC6FF00B56933E36ED38D9B7EF1CE78 -DB93A89C6FB7F5EA3D0E83F6651FF18DBF09FF00EC52D27FF48E2AF4AC7BD79D -7ECC71E7F66CF84E47FD0A5A4FFE91C55E99B7EA3FCFF9FF003D2A0FDD417440 -130381814A179A98463DA82B8ABB8AE8876FD697663FFD75288FD87F9FF3FE7B -2EDFAFE54AE17443B78FD68D983FFD7A9BCBC74E28DBF5FCA8B85D10EDC8A5D8 -476A98251B31EF45C3988769A529EDFAD4DB05667892D358BAD12E22D02FEC34 -CD5DB6F9375A9593DE409F30DDBA249A166CAE40C48B8241E40C15CC1CC5DD9F -E73414F6FD6BC7BE187C66D4E7F83D3F8B3C6AF05C6B03514B21A2E97A34FA65 -EDB4D3CB1456763716D753B98AEA433DB925DD621F68421DA20277ABA77C5CF1 -8EBBF0EFC3FE55B687A4F8EF5FF16EA5E19B7DF1CD7BA65A7D8EF2FBCE77C3C3 -24B8B4D3A6DA4797BE631E562463B33F6A82E7B5ECFF0039A367F9CD78A43F15 -7C6261B5F09C92E849E3B6F16CDE16B8D6134E99B4C8F1A6CBAB433A5A9B812B -EEB4582364332EC99E4219D2351274DE0CF8977D67E19F157FC264A6F75BF0A6 -AEDA56A53786347BB9E3B9DE90DC5BC96F6B199E739B7BCB6F317E6D9209B04A -2872D544C2E7A36DAF35FD9F173E02D57FEC6DF13FFE9F6FEA4FF8684F0AFF00 -D02BC73FF8406BDFFC8555BF666BF8B57F85F757D025C4705D789FC493469756 -F25BCAAADAE5F101E29155E36C1E5594303C1008C54F3A72567FD682B9EA1E5F -B1FCBFCFF9FD0DBE871FE7FCFF009E92ED19A5DB5A5C5CC44509F5FF003FE7FC -F602E39FF3FE7FCFD25C0F4A3145C2E795EB031ABDF7FD777FFD08D146B3FF00 -218BEFFAEF27FE8468AF969FC4CD4F49D1BFE40F63FF005C23FF00D0455CACFF -000F5CC375A1D93C12A4C822085A360C032FCAC38EE1810476208AD1AFA383F7 -51CE2514B45581E65E20FF009395F01FFD8A3E21FF00D2CD168FD9E7FE442D57 -FEC6DF13FF00E9FAFE97C41FF272BE03FF00B147C43FFA59A2D70DF07B58F895 -6BE1CD762F0FF84BC29A9E90BE2DF12F9175A978A2E6CEE1FF00E2797C5B7429 -A74CAB86DC06246C800F19C0C6F697F5E43E87D094562695ADDEDA787ED6EBC5 -B1E95A06A4ECC934169A935CDB21DCDB424D24509725002731AE0E47206E3E55 -F15BC696FA3FC50F855AADB78F2EA3D1A7D6A6B1BFD06CA681ED265FECAD4A41 -348238CCEC448B08DA643102A8DB3700C2E535157623DC28AF946FBE2ADA6A90 -B78BDFC53AA5A78BED7C756BA1269C97975069F69A6B6B715A2A4967910319AC -24F3CCB3ABC99B90E8C8AB02C7F54DA5E5BDFDBACF6D3C77103676C913865383 -838238EA08FC2942A467B3025A314B45697013146296929DC03146296928B806 -28C52D250021146DC76A5A28B8EE2628DA07614B451703CF3F68AD4EF344FD9F -7E276A3A75DCF61A859F85F53B8B6BBB591A3960952D25647475C1565201041C -820115507ECEFE161FF315F1CFFE17FAEFFF0026D3FF0069EFF936AF8B3FF628 -EADFFA472D59F0FF008D6F3C35E2DD3FC07E2A9A7D475ABD866B8D1F58B7B466 -5D4ED610BE6BDC889365B4D11922590B04864696268B6B48D6F0E4EDCDAA1F42 -A7FC33C785BFE82BE39FFC2FF5DFFE4DAEBFC1FE0BD3FC0DA6C963A75C6AB710 -49319D9F58D5EEF539431555204B732C8EAB851F2860A0E4819249DEA2AD24B6 -42B8DC7BD01714EA2AAE17385F8B1E12F1978CF458F4CF0A78BAC7C251CD95BE -B8B8D2A6BB9E58F721D90C915D5BB41B94488CEA4C804998DE27557ACCD6FE15 -EB22D3C1179E16D6343F0CF893C3568DA6F9E3427974D9ACA48A359AD63B35B9 -8CC31996DED244DB2964FB3AA6E2ACE1BD368A9714F50B9CBFC39F057FC205E1 -58F4A7BDFED0B992EEF352BBB911794925CDD5D4B75398E3CB148FCD9A4D8859 -CAAED05DC82C7A60B8A75154B4564171B8F7A02E29D45170B8DC7BD01714EA28 -B85C6E3DE80B8A75145C2E371EF405C53A8A2E171B8F7A02E29D45170B8DC7BD -01714EA28B85C6E3DE8D98A75145C2E376D1B314EA28B85C6EDA36629D45170B -9C27C57F08F8C7C65A2C7A6F84FC5B63E118E6CADF5C5C69535DCF2C7B90EC86 -48AEADDA0DCAB2233A92E04998DE27557ACDD6FE156B22D3C1179E17D6343F0C -F893C3568DA6F9E3427974D9ACA48A359AD63B35B98CC31996DED244DB2968FE -CEA9B8AB386F4DA2A5A4DDC2E72FF0E7C13FF080F8563D2DAF3FB42E64BBBCD4 -6EEE562F2924B9BABA96EA731C796291F9B349B10B3954DA0BB9058F4DB314EA -2A969A20B8DDB59BA478674DD0AFF5ABDB1B7F22EB59BB5BEBE937B379D32DBC -36E1B0490BFBAB78570B81F26719249D4AE1BE1E7C67F0CFC53F21FC3ABAE4F6 -B7168B7F05F5F787351B1B49E06DBB5E39EE208E37DC1D480AC491920100909B -5757013C29F0B5F41F12A788358F166B9E32D5E0B496C6CEE35A4B28BEC70CAF -13CE88B696D02B798D6F6E4990391E50DA5773EECCF8CEBE281FD8FF00F08D0F -1C7FCB6FB47FC217FD83FF004CF6F9FF00DABFF02DBE4FFB7BFF0082B7BC1FF1 -67C2FE3BD4E5B1D1AFA79E7109B981EE2C2E2DA2BE8032A9B8B49658D52EE105 -E3CCB033A012C47762442D87F19F49FED4FEC7FF008A57C73E26F2FCEFF9133C -4DFD8DE46767FAFF00F8985A79BBB1F2FF00ACDBB5FEEEEF9A1DB97DD01BFB31 -0CFECD5F09BFEC52D27FF48E2AF4CDB8ED5E6BFB30FF00C9B57C26FF00B14749 -FF00D238ABD2E9C3E14171314B8A5A4ABB8831462968A2E02628C52D145C04C5 -18A5A28B8098ACCF1269175AE68B736365AD5F7876EA5DBB352D352DDEE21C30 -27689E29633900A9DC878638C1C11A945203CF2D3E04F84EE742BDD37C53A7C1 -F101EFF511AB5F5DF8AACAD6E9AE6ED604B7498C4B12428CB0471C43CB8D3E55 -C9CB33B3137C0CF0D59784B47D03C34B3F82A0D13519F55D227D0C441B4EB998 -CFE73451CC9243B596EEE53CB68D91565F9150AA14F43A2A795761DCF32FF851 -361FD938FF00848F5CFF00849BFB5FFB77FE12BCDA7DBFEDBF64FB179BE5F91F -65FF008F3FF47DBE46DDBF363CDFDE574DE04F0241E06B4D480D4AFB5BD4F54B -BFB7EA3AB6A5E50B8BC9C451C2AECB0C71C4BB618218C08E34188C120B1666E9 -E8A12482E25799FECF3FF2216ABFF636F89FFF004FD7F5E9B5E67FB3CFFC883A -AFFD8DBE28FF00D3F5FD1F697F5D83A1E97452D1542128A5A2803CA759FF0090 -C5F7FD7793FF00423451AD7FC862FBFEBBC9FF00A11A2BE667F133747CADE2E9 -D93C5FAD0DC702FA6E9FF5D0D6C68DE34F13CD0C56D6BE27BFB38635114517F6 -9491A803002AA86E98C630315C778DB50917C67AF286E1750B81D3FE9A3563FF -006ACBD49C572AA9CAF4679327A9F41E9FF12FE215B5BC7037894EC895510FD9 -2299D8018F9999324FB9249E726BAED3FE36F8B20B48A39EDF4EBB91405370D0 -3233E0004B0126327927000F615F2DD8F8D752D2462DEE9A250080A7E651CE4E -01E074EB534BE3ED5AE49F32F0B0CEEC1518CFD2BAA38B92D9B2D4DAEE7AB788 -7E2B7889FE3BF856F9F538A1993C3DADC68B14319112B5D6965900209FE05EB9 -3F2F5EB5CFFC2AF15DFCDE0AD46D25D42EE6824F10EB6EF14B3B18D98EAD74E4 -95CE09279FA9CFD3C6F55F12DFDC7C4BF0FBB4EC19347D45414F94E0CD639E98 -FEE8A83E1F6B175FF08E5E46D3C8D19D5F5462858ED24DFCE738FAD4BC437AB6 -373F7753E8F6BDDC70AC17BE178FF3FF00D6F6E289D7AC8F2D7B0376FF005A0F -F5FF003FCBC806A0DE80FE74FF00ED12C30540ACFDB7633E7477D368DE14FF00 -8487FE121834AD05BC459FF90A49144B7406CF2FFD6852FF0073E5EBF778E9C5 -74B6B782489245954E4758DB233DF07EBFE7D3C745E03D8AFB8FF3FE7F948B7D -819DDC8F6FF3FE7F46AA3EC1CEBA9EF8BE3ED75338D7EFFF001BA73FD6AED97C -50D7ACE64946AF70ECB9FF005B29707823956247E63F971F3E45A9AA8006DCFA -B0FF003FE7F4B0BAB294C32A9F4E71FE7FCFE1AAC431A99F4A45F19BC40C326F -C91FECC311FF00D96B7A2F8E3A8B81FB8B2CFA794FFF00C5D7CA516B0F165636 -9225F447FE9F87F9C7172D3C51716E30973303D724E7F9FF009FE96B1535D4A5 -51DCFAAA0F8C5ABDC0256DACF03A9313FF00F1756D7E296B2C0FFA359023D637 -FF00E2FF00CFF2F96ADFC6D796ED9FB579808E8E9D3F2C7F91EDC5D4F89776CB -FE92A2771D183E303F1CFBD6AB16FAB2D5447D4B17C58B882DC1B9D3239245C9 -79239F62F5F420E38F7FFEB4FA7FC63D32E50F9F693C5286C058995C11F53B79 -CE78C7FF005BE66B7F883A7BB2A49E7229EAEEA303F23FD3FF00ADA769E2DD2E -54DCB751AE0E30EDB3F46C7F9FD3458C9742D4CFA72D7E2568D3863334F678C6 -3CE889DDD7A6DDDE9DF1D7EB8B51F8FB4192548C5F80CC428DD13A807A724AE0 -7E35F362F886E2D72627DAA06361E47E59FAD685B78C5827EF6DC3E0632876E4 -F7ADD629F61A99F4EDADEDBDFC664B69E2B88C36D2D138600FA6454D5F31278C -444C92476C51D082A565C1523A1071C1E3F95757A6FC59BC8D6241A8C802367C -BB88C3971D482D8271D7BE7E95AC7151EA86A68E9BF69EFF00936AF8B3FF0062 -8EADFF00A472D74DE0BF05FF00C235F6CD4350BCFED9F136A7B1B52D5DA2F2FC -DD9BBCB8628F2DE4DBC7BDC470866C6F7666925925964F0AF8F9F17AE352FD9F -7E285A5C5A412ADCF85F5385248498F66EB59412412DBBA8F4E9F97B558FC58D -02ECB89649ECB6E31E7C24EECE7A6CDDD31DF1D7EB5A46AC252BDCBE6563B1A2 -A2B3BDB6D463325A5CC373183B4BC320700E338C8EFC8A9F61C76AE9BA18DA29 -DB4E7B51B0E3B51701B5CCEB9F13FC1DE18F0D69FE22D63C5BA1E93E1FD43CBF -B1EAD7DA9430DA5CF988648FCB959823EE40586D27201238AD5F12785B47F19E -8B71A3788349B0D7748B9DBE7D86A56C9716F2ED60EBBA37054E195586470403 -D45781F87F46D53E11785BF67FBBF14E8DAADDD9F877C2E742D474ED1F4E9F57 -9B4FD55ACED4477461B6493E544B6BEB6F39371537814652591844A4D0CFA134 -BD4ECF5CD32D351D3AEE0D434FBC852E2DAEED6559629E2750C8E8EA48656041 -041C10411566BCFBE036937BA67C3F90DEDA4F62F7FAE6B7AB410DD466297ECD -77AADD5D5BB3C6C0346CD0CD1B18DC2BA1255D559580F43D871DAA93BA4C4368 -AC4F17F87350F1369B15AE9DE28D57C273ACC2537BA3C76924AEA15879645CC1 -326D248390A1B2A3E60320F21FF0A8FC558FF92D5E39FF00C03D07FF0095949C -ADD00F4AA2BCD7FE15278AB3FF0025ABC73FF807A0FF00F2B28FF8547E2AC7FC -96AF1CFF00E01E83FF00CACA5CCFB7E433D2A8AF35FF008549E2ACFF00C96AF1 -CFFE01E83FFCACAF4CD871DAA93F210DA29DB4E7B51B0E3B53B80DA29DB4E7B5 -1B0E3B51701B453B69CF6AE1BC4BF0E7C41AE6B5737D65F13FC55E1DB5976ECD -374DB6D25A0870A14ED371632C8724163B9DB9638C0C009BB01DBD15E6BFF0A9 -3C559FF92D5E39FF00C03D07FF0095947FC2A3F1563FE4B578E7FF0000F41FFE -5654F33EDF90CF4AA2BCD7FE15278AB3FF0025ABC73FF807A0FF00F2B2B77C21 -E04D6BC33A94B75A8FC42F11F8B20684C42CB58B7D3238918B29F301B6B385F7 -0008C162B8639524021F37901D6D14EDA73DA8D871DAAAE21B5CCEB9F13FC1DE -18F0D69FE23D63C5BA1E93E1FD43CBFB1EAD7DA9430DA5CF988648FCB959823E -E4058609C8048E2B57C49E16D1FC67A2DC68DE20D26C35DD22E76F9F61A95B25 -C5BCBB583AEE8DC15386556191C100F515E07E1FD1B54F845E16FD9FEEFC53A3 -6AB7767E1DF0B9D0B51D3B47D3A7D5E6D3F556B3B511DD186D924F9512DAFADB -CE4DC54DE05194964611293433E83D2F54B3D6F4CB4D474EBB8350D3EF214B8B -6BBB591658A789D4323A3A9219581041070410455AAF3EF80DA4DEE99F0FE437 -B693D8BDFEB9ADEAD04375198A5FB35DEAB75756ECF1B00D1B343346C6370AE8 -49575565603D0F61C76AA4EE9310DAF99FC3FF00041F55F0D788FC17E17F03DF -7C1AF046A9E11BFD02F6CF506B2B8FB55E4C91456B78915B5D4C1E48A2174269 -2478E49BCC80334BE5A98BE9ADA73DA8D871DAA65152DC678F782CF8BBC77F12 -BC37E2DF107822FBC09FD8FE1DBFD3AEECF52BFB3BAF3AE6EE6B09716EF6D2C9 -BE38FEC5286794444EF88AA1CB84CCF19FC08B9B1FB1FF00C2256DAEEB7BB7FD -A7FB6BE2D78934EF2B1B766CF2CDC6FCFCD9CECC6063764EDF74DA73DABCD3E3 -47C3DFF84E468E7FE15AF81BE227D97CEFF91D2E7C9FB1EEF2FF00D47FA15CE7 -7EDF9BEE7FAB4FBDFC32E292EFFD7A00CFD987FE4DABE137FD8A3A4FFE91C55E -998AF35FD9857FE31ABE12F3CFFC223A4FFE91435E9BB063AD541FBA806518A7 -ED1EBCD2EC1EBDEAEE223A314FC0E3D7FF00AD4EDA3FCFF9FF003FC95C08A8A7 -E071D33FFD6A76D1D703FCFF009FF3D8B811D2549B78071FE1D3FF00D74E193D -33C7E9D3FC3FCF62E3B11514F230707AF71F853BDF38E7F2E9FE1FE7B170B116 -0FA51D29FE9EB8FE94EF7CE39FCBA7F87F9EC5C08A8A7E0647AE3FA52ED1D703 -FCFF009FF3D8B81C17897E1E6BFAEEB5737D65F13FC57E1DB5976ECD374DB6D2 -5EDE1C2807699EC6590E482C773B72C71818030BF665B4974FF85F756B3DECFA -94F078A3C4B1C97B74B1ACB70C35CBE064711AA2066232762AAE49C281815EB1 -81C7AFFF005ABCCFF67941FF00080EABCE3FE2AEF147FE9FAFEA34524FFAE807 -A55253F68F5E69760F5EF577111D18A7ED1EBCD2EC1EBDE9DC0F25D6BFE4317D -FF005DE4FF00D08D146B5FF218BFFF00AEF27FE8468AF9997C4CDD1F087C43F1 -369D07C40F1344FA85BA3A6A774ACAD2804112B641E7EB5863C5BA6E33FDA36D -C7FD365FF1FF003FCBCFFE2FDC48BF16BC6B85CE35BBE03AFF00CF77FF003FE7 -8E49AE5CE7E5E7D87F9FF3FA78B2AD2BDAC7CFCA7EF3D4F6F3E2ED2C13FF0013 -1B61FF006D97FC7FCFF25FF84B34DEA353B5FF00BFCBFE3FE71F97870B9973C8 -27F0A537331E9FCAA7DB4BB20F69E67A8DEF8A6C3FE16068B2FF00685AED4D32 -F949F39700996D0E09CFFB27F23F867F811BC3102DCEAD243A3A6AE753D45FED -CC917DA306EE700F99F7BEEF1D7A7B74F2C9E790F892C49CE7EC971DBFDB87DE -934099C584BDBFD2EEBB7FD3792B4F6AF976FEB534752D1BFF005D4FA27FE12D -D2867FE267679FFAEEBFE3FE7F929F166978CFF69DA7FDFF004FF1FF003FCBC1 -FED2DFDEC7D31486E881C31FCAB3F6AFB19FB43DE7FE12BD314FFC856CFE8674 -E3F5A917C57A6679D52C71FF005F09FE3ED5E03F6ACF566E28FB4E3F88FE029F -B59761FB5F23E811E2AD23F8B54B1073FF003F29FE347FC257A48071A9D97FE0 -4A7F8FF9FE5F3EFDA7A7CCC314BF69C7F1B11F4147B692E82F69DD1F408F1869 -2A79D4EC81FF00AF84E3F5A917C61A4E7FE42D683FEDE13FC7DABE793727FBCC -3F2A432B6321DA9FB69073F91F448F18E92071ACD9FF00E04A7F8D3C78CB4A1F -F318B1FF00C094FF001AF9CFCC61FC4FFE7FCFE941627AB3D3F6F241CFE47D1C -BE33D2075D5AC33FF5F29FE3ED4E1E35D207FCC5AC303B7DA53FC7FCFF002F9C -06E3FF002D1C7E748771FE37C7E34FEB12EC2E73E9583C7FA5DB3168B58B4898 -8C129768A4FE47DAB52D7E2F416AA8A35FB274539DB24F1B679E84939F5EFF00 -976F95FE6FF9E927E46906E18FDE3D3589922BDA1F5FDB7C71D2D01FB45EE992 -1E3063BA54C7AE724FF9FD352DBE357852628B36AD6D0123E6633A1553F50D93 -F97E5DBE2B191D6593FCFE34003FE7A38FA8FF00EBD69F5C98D5468FAE7E2BFC -4DF0C6A9F08BC756F69E22D3A49A5D0AFA34845CAAB3B35BB80AA09CB13D302B -BF8FE2B78653FE66AD19BD8EA117FF00155F9EDE25C0F0EEA9FBD639B497FF00 -403EF5A0003FF2D5BF3357F5C9257B1A3AAD23F416D7E31F866DA58E45F13E90 -8E8C1959351881041E083BB8AEB34AFDA774ED3C2ECF1B6952A871214B9BF864 -DDFECEE66C81C7623F0AFCCEDA9D7CD6FD6976459FF5ADFAD358F9C764255A48 -FD56B7FDAE7C39F767D7FC3846EEAB7F1AF1F4F30F3F8D6ADAFED51E0CB8DBFF -00156F86E273DA4BF8971F8F998FD6BF2576418FBCD9F4E6976C1DC37E66B659 -A555D0BFACC8FD788FF693F074A99FF84DFC2207A36AD08FFDA94C83F68EF075 -B8265F1DF85E527A0FED4B738FFBE5C7F915F915BA0C7DC3F8934A1A01FF002C -F3FF000234FF00B56AFF0028D6259FB06BFB4D7C38F25B7F8C341128CE106AF6 -C54FD4EFE3F2EDF9579BF697F0395FDCF8BFC308E0E4B36B56EC31F830FF003F -A7E4207807FCB3FF00C78D3BCDB71FF2C7FF001E347F6B55FE50FACB3F5E21FD -A63C0CA989BC5FE1876CFF0006B56E831F42C6AD5BFED31F0E49266F18F87E3E -98F2F58B67CFD7E718AFC7E13DB0FF00977CFF00C08D385D5B8E901FFBECD3FE -D7AABEC0BEB323F6147ED2BF0C4A9CF8DB4218E70754B6E7A71FEB3FCE2ABBFE -D33F0ED65FDDF8C3C3CC9D99B59B753F9063FCFF00FADF9042E61CE440DFF7F0 -FB534CC1BEEC2C0E3FE7A1FF003DA8FED7ABFC83FACC8FD6ED5FF6C3F841A15E -25ADEF8D2D77B46250D671BDE478248C17815D41E3A120E307B8AAA3F6D9F82B -C1FF0084D97D7FE41979FF00C67FCFF2FC9B05FB4678FF00A694D2B3B1F950FE -2FFE7FC8A879B57E897F5F30FACCFB1FACDFF0DB1F057A7FC26C31FF0060CBCF -FE33FE71F928FDB5FE0B673FF09B0CFB69979FFC67FCFF002FC9611DD7198C7F -DF6694433F5F2C0FF8151FDAD5FF00BBF8FF0098FEB33EC7EB41FDB5FE0B01CF -8D463FEC1779FF00C67FCFF24FF86D8F82AA73FF0009B007FEC177BFFC67FCFF -002FC948E2F394B232328254956C8041208FA82083F8D3BECFEACA3F3A3FB5AB -F65F73FF00317D6A4BA23F59CFEDB9F050707C6BFF0094ABDFFE33FE71F927FC -36F7C135C1FF0084DB07AFFC826F7FF8CFF9FE5F935E4C6319971F4534796831 -FBDFFC74FF009ED4FF00B5ABF65F73FF00317D667D97F5F33F590FEDC1F04BA7 -FC26C48FFB04DEFF00F19FF3FC81FB6FFC121CFF00C26D83FF00609BDFFE33FE -7F97E505A69771A8CA63B48E5B99157714863762074CE00AE86CBE156BF7DE51 -6852DA291776F9E6DBB4633CA8CB03DB18E3BE31C0F37ACB74BEE7FE6546B579 -7C314FEFFF0033F4FBFE1B7FE091E3FE136C8FFB055EFF00F19FF3FC957F6DEF -827C11E36C1FFB055EFF00F19FF3FCBF3974AF822BFBB7D4B5500F3E6436ABF5 -C61DBF03F77DBDEBA9D33E19F8774B11B1B41752A67F7974E5F7673D57EEF7C7 -4EDEBCD64F3AAAB64BEE7FE6754235DEE92FEBD4FD01D33F6BEF849AD605978A -A5B84C95DEBA4DE84071920B18401C7AFB7E193FF0D95E0A07FE419AF83FF5EF -07FF001EFF003FCBE3BF2A2DDC30FF003FE7FCF6047185EA01FF003FFD6FCBF2 -C659D625EC92F97FC13B553B6FA9F627FC365782881FF12CD7F1FF005ED07FF1 -EFF38FC8FF0086CAF0503FF20CD7C1FF00AF783FF8F7F9FE5F1DF970E78DA7DB -346D403A28FF003FE7F2F6A8FED8C5775F70F912E87D89FF000D95E0A207FC4B -35FC7FD7B41FFC7BFCE3F23FE1B2BC140FFC8335F07FEBDE0FFE3DFE7F97C741 -933F757A527C83F800FF003FE7F2A3FB6315DD7DC2E55D8FB0AE7F6D3F0259DA -CB717365AE416F121924965820544503249266C00003CFB7E5F3E7C34FDAAFE1 -0F817C6E9AB78534ED6A5D174ED1DF4CD5B54B386CE5BEF115F3CD09FB76A4D1 -CA9BE48FC89764F2E5A56BCB96508A374BC00641C88D4D1B907F07EB8FF3FF00 -D6A3FB5B12D6B6B89C2EB4D0D4FD9B3F69DF82FF0001EE6C34ED1B47B9F126DD -156DAEBC4D6FE1CD2ACB528E5430AB42CF6CE3CD826C79804AC6557818B493EF -06197E20FED81E19F1B7D83FE1396F05EBFF0065F33EC7FF000907C318AE7CAD -DB7CCF2FCDD74EDCED4CE319DAB9E9C703AA7C3FD07542585A359C84825AD5F6 -F00631B70540E9D00E4579CF8E3C0E9E1E96D8C5E28D0F498E76936AEB87CA2C -015C043BD77633C9C0EA3A76A8E675A568F43924ABC5E89347D93F02FF006FAF -879E0EF825F0FB40BED27C4B2DE695E1ED3EC67782D6DCC6D2456D1A31526704 -AE54E3201C6381DBB81FF051FF008640FF00C817C53F5FB2DAFB7FD3CFF9FE5F -9B1E1DF0C6B31784B419C6953CD0CF630BC6F02F9B95F2D4E485C91C1EF8FD38 -8C5DA1FF00962738E7835B7F69625689AFB8E49D6AB17668FD2AFF0087907C31 -206746F14FD3EC96DFFC91FE7F928FF828FF00C3207FE40BE29FAFD96D7DBFE9 -E7FCFF002FCD413A9E3CB7E3FD9A71753FF2C9F3EC0FF9FF003F92FED3C577FC -08FACD4EC8FD28FF0087907C31206746F14FD3EC96DFFC91FE7F92FF00C3C7FE -1967FE40BE28FF00C05B5F6FFA79FF003FCBF35D403FF2CA4FC8FF009FF3F929 -8B8FB8E3DF078FF3FE7D8FED4C4F75F707D66A763F49C7FC1483E190C7FC49BC -523FEDD6DBFF00923FCFF20FFC1483E190EBA378A7FF00016D7DBFE9E7FCFF00 -2FCD954DA4FCADFE14B8C1E8C09F41FE7FCFE8BFB5711DD7DC2FACCFB1FA483F -E0A43F0C863FE24BE291FF006EB6DEDFF4F3FE7F92FF00C3C7FE19E01FEC5F14 -E3FEBD6D7DBFE9E7FCFF002FCDBFBB9FBF8F61ED4B83CE438F6DBD3FCFF4FC8F -ED5C4F75F70FEB33D8FD231FF051FF0086831FF124F150FF00B74B6FFE49F63F -97E47FC3C7FE19839FEC4F14E463FE5D6D7FF927FCFF002FCDC2C49FBAE7F0FF -003FE7F432DC928DFF007CFF009FF3FA2FED5C4F75F707D665FD23F48FFE1E3D -F0D0819D0FC558FF00AF4B6FFE49F63FE7A1FF000F1EF868A7FE407E2A047FD3 -ADAFFF0024FF009FE5F9BA25603EE3600F4A70B9607EE30FCFFCFF009FC8FED5 -C5775F70FEB2FF00A47E907FC3C7BE1A1033A1F8AB1FF5E96DFF00C93EC7FCF4 -07FC1477E1A03FF204F1503FF5EB6BFF00C93FE7F97E6FFDADC6498F1F9D385C -BB1E011CFBFF009FF3F91FDAB8AEEBEE0FACCBFA47E86DD7FC14E3E165A4CD0C -9E1FF1BB32F53168F1C8BD33C32CC41FC0F6FCB96F82FF00B7E7C3DF0DF83AF2 -DAE747F13B493F8835CD417CBB3B7188EE756BBB88C10D3A90C12550C31C3023 -2719AF87166738EFF9FF009FF3F966F870BFF67CDD466F2EFD7FE7E24FFEBFF9 -E8DE6B88B5F43455E56BA3F4B7FE1E3BF0D31FF204F1663FEBD2D7FF00923DBF -4FC97FE1E3BF0D14FF00C817C560FF00D7A5AFFF00247F9C7E5F9CA03939E73F -8FF9FF003F929DDD738FCFFCFF009FCA3FB5F13DD7DC4FB699FA323FE0A3BF0D -081FF124F15E3FEBD2D7FF00923DBF4FC93FE1E3DF0D14FF00C817C5608FFA74 -B5FF00E48FF38FCBF3949047DE03FF00D5FE7FCF4091D7CCC7B7F93EDFE7B3FE -D6C4F75F703AF3E87EAA69BE24B6F1969D6BAFD9472C567AAC497D04770A1645 -8E501D4300480C030CE0919EF45739F08FFE494F82FBFF00C496CBFF00442515 -E826E4AEFA9EAC7548FCE8F8C32C03E2D78D81964046B97D9017FE9BBD71A648 -B3F7E63F406BBFF8B57F6317C58F1A07B6B7771ADDE825D9B93E7BF5C5730BAA -D88E059DA67FE075F3F26F99FBACF02504E4CC469233FF003DCFE62A3263E7F7 -7337D58FF8D748351B661F2DB5AA8E9811B5483504C1C436E3FDC84D473DBA02 -A4FB1C44EEA3C436444121FF00459F827AFCF17F9FF3C73CB717DA7ACB2DA08A -3924BAB82914D3BC9E6E256CE21084FCBFEC11EAD9E83D0AE6EA47F15E9C4050 -7EC57231E5FF00B70543E16B5115B5E4F0C4B14F35E5CF9B2A4203498B8931B8 -F538ED9E95B2AAA31BDBFAD4DD43963B5FFA673F737FA8C7A15CDCCB60BA7CCA -A7A4A25312F42E78C1C0CB60673803BF1269CB3DA6A9776AA8EF12C314A16599 -E52199A404EE6C9E428E338E3DCD765359C977149148CD244E0ABA3440A953C1 -041EB50D9E8074F8CC56C248519B3B563C0CE00FD00000E80000600C08F6AACD -19D9A8FC264892603FD5A8FF003F4A51348BD401F856E36973E47CF31FAF1FE7 -FCFE111D226EED20C7A902A149331E57D8CB5B87007381F4FF003E9522DCE3AB -1E3FD9FF00EBFB7F9ED78E92475761F8FF009FF3FA34E96AA3E697A7AFFF00AE -8E6886ABA1585CA0FE227E8BFF00D7A77DAA21D4BE7FDDFF00EBFF009FE4E7B0 -8578328CFD0D43E4C29F7896E3FCFF005A7EEB072B137DAADF1D5FF2A5FB55BF -60FF0098FF003FE7F2AAC6DA339F2DBDF18FF0FF003FC98F736E8BC46FC7D3FC -3FCFF25CA84E69177ED50FF70FFDF429AD7508E8873EBB8566B6A488788A507F -0A63EB057EEC727A7503FCFF009FC2953BEC89F688D13748C384C77C534CF93F -EACFBE05667F6DCA093E4B9FABFF00F5E98DADCE7FE58E0FBC84FF005FF3FCB4 -549F61F343A9A4D39F461FF0134DF389EA5C7FC00D65BEAB331FF52BF8B1FF00 -1A8DB55947FCB34FFBEBFCFA569ECD85E2FA7E44BE2470DE1ED53E76FF008F59 -782BFEC1A92D24BC7948BA4B682303868A7690E7E8517F9FFF005B235ED55E4D -135153147F35BC83208C8CA9FF003F855C5D71D39FB3C23FE020FF009E9FE7B6 -9ECE5CB648D6DEEFFC1F435BCA8CF1F695FC481FD6945AA3B63ED00FD1EB2FFE -12393FE78467FE023FCFF9FCA45F13363FE3DD47FC04566E1344F2FF005A1A47 -4D42722604F5FBFF00E7FC8FC9C347DC38391ECE3FCFFF00ABF2A03C4EC7FE58 -A7E4053D7C4A0F58D07E03FC2B37ED17526DFD685E1A131E899FF810FF003FE7 -F2C1D5AD6EE11AACD1335BAE9B079C23CAE653B0B64820929C05054839571D86 -3553C4AAB9202A9F6C0FE555EEAE74ED42E4DC5C2BB48C82275170EA92202485 -650C030F99B861D091D2946534F52E1CA9EA68FF0061C83FE591FF00BEC7F9F4 -AA7796B71672854D26E6E8119DF0BC7B41F4F99C1FD3F971BBA73DE6AB099ECF -4CB8BD883152F0C4EEA0FA123BE08E3DEB5AC7C29AE6A119922D09D554EDC4ED -E51CF1D9C83F8FF85473D45ABFEBF1348D26F657F93383F3AE53FE605783EAF0 -7FF1CFF38A69BFB9419FEC4BD51FEF41FF00C72BD3ECBE1CEB579BFCDB1B3B4D -B8C79F36EDDF4D9BBD3BE3AFE5A369F096EA4F33ED771676F8C6DF2636933D73 -9CEDC76F5EF4FDAF75FD7DE6AA8547B47F3FF33C7C6AB718E346BDC7FBD0FF00 -F1CA51ABDD03FF00205BDFFC83FF00C72BDBECBE1259C7BCDD5DBCD9C6CFB3C4 -23C7D725B3DBD3A1FC342D3E176896F296912E2E5718F2E57000F7F9429CF5EF -FF00D697597634FAA547D17F5F33C07FB62F0671A25F0FF80C5FFC72B445C5C0 -E96F2FE119FF001AF7DB5F036856529923D3226620A9129320EDD9891F8E2B4A -D349B0D3A532DAD8DBDAC846D2F0C2A848C8E3231E9FA54BAB7D90FEA337BB4B -D2E7CF16706A57F3F956BA7DCCF2609C470B1C0F5FE549A8F877C44F3DADAB69 -973676F70FE535C4804437120247BC9010B9F9431239C28F99971F49647A5457 -70437D6F2DBDC429716F2A18E48A550C8EA460A9078208E31495469DEC6D1C04 -56F26CF9F2D7E1BF8846B51595ADADBD94E63569ADDDD4C4B0E0AAC8DB370439 -4DABDDB1800AA3347D9DAFC1ABE6B75373ABC105C7F12436C6451CF1862CA4F6 -EC2BD2EC74FB6D32231DBC5B376DDEECC5E49484540CEEC4B3B6D451B9892703 -9AB3B87A0A72AB27B1B2C1525BAB9C759FC2AD0EDA52F2FDA6F176E0473C8028 -3C73F22A9CF1EB8E4FB619369B61A1DC4B6B69E05BBD4A10430B94368EAF903A -19A70E00E9820720E3D6BB4C8F4A5DCA4F4FD2B3E67D4E88D0A71DA27311F8A7 -5082248E3F056B31C48A155165B00AA00C0007DA781FE14FFF0084BB53EDE0DD -6FFEFF0058FF00F24D747C7A5285FF00668BAEDF99AD8E68F8BF523FF3276B7F -F7FAC3FF0092693FE131D4413FF147EB63FEDB58FF00F24FF9C574FE413DBF5A -5F2323278FC7FF00AF4B9A3DBF3158E72DBC577F71711472785357B68DDC2B4D -2CB6456304E37305B82703A9C0278E01ADF33A0FE203FCFF009FCAA4F24FB7FD -F42868CAFF00771FEF526E2FA014F54D4974DD36EEECC335D7D9E2797ECF6CBB -E5936A93B517BB1C600EE6B97F0EEA7A945ADE9305DEAF1EAC9AAE9935FC8611 -19B78A44680016ECA8AC623E7B60B966215391CE7B3D87DBF3AC5D03C13A5785 -F67D8219479710B78BED37935C79318C7C91F98EDB14ED5C85C03B573F7461C5 -C526981B25D48EA3FCE68DC074FD2976FD3F3A1907702A0621607BFE155F53D4 -EDB46D3AEEFEEE510DA5AC4F3CD2005B6A282CC70064E00E80678AB3B178C63E -94790A73C281FE7FCFF9E00396D175DD6BFB6ACAC7598ED636D42C65BE4B7B74 -2AD6463684342EFBD9663FBF037A841FBB271F30DBE77AD78F355D74C4754D4A -F7C1B6CF766CE3D38E817EFF006D638F2CA5CC66290E4A96555113755656039F -4BF0BF80D3C386CC36A12EA234FB4FB05899D515A180ECDCAC5400EC4C683760 -6163418CEF67E82EB4B8AFADE5B7B8862B882652924522865752304303C10471 -835BA9C232BDBFAF981CE7C34C7FC2B8F0AFAFF64DA7FE895AD7BFD134FD5377 -DAACE19D8AECDEEA3701ECDD475ED595F0CEDD9BE1BF850819FF00894DA7FE89 -5AE8FECF9EDFA56536B9989A4D599C8DE7C31D1AE650F13DD59A85C7970CA0A9 -EBCFCCAC73F8E2B2EE3E12E67636DAC3C509C6D59605761F5208CF3EC2BD08DB -95C1C118E3EED345BF3C67E98A5CC60E8537D0F2BB9F861ADC42568AFAD6645C -945C6D6603A0C11804FD71EF59173E0BF125A40D2C96ACC8B8C888248DD40E15 -4927F01FFD6F6A36F9C0CB0C7A0A6FD9BFDB6FF3FF00EAFF003D9A979184B090 -7B1E077361AAD8C61EE2DEE6DD09DA1A4B42A33E9C8F6AA64CF8FBEDFF007E7F -FAD5F439B6C01F33034DB8B08AEA0686702689B1B9245054E0F7078EDFE71C3E -7F231782ECCF9E592E08FBC47FDB2C7F4A89E2BAE40940F4F931FE7B7F9E9EFB -FF0008BE97DB4FB4FF00C074FF000FF3FCB38FC39D1147FC7B3F1EB3CBFF00C5 -7B7F9ED4A7633FA94FA33C40A5D649F3B1FF0001FF003FE4546E2EC7FCB718FA -57B1BFC27D29E4665B9BD8C124845906147A0C827D2A95DFC1F85A406DB54961 -4C60ACB1EF39CFA82BEDDBB7E5AF3A32784ACBA1E4FF00E98BC79D8FF3F5A035 -EFFCF723FCFD7FCE2BD1EF7E10DFA6CFB1EA504DD7779CAF1E3A63182D9FD3A5 -675E7C29D7EDA20D1B5ADD1DD8D914AC08EBCFCC1476FF003D9F3A21D0ACBEC9 -C5EEBEC01E6BE71D01E9FE7FA7E505DBEA4969249021B89D57291B481031F4CF -38FF00EB76EA3AC97E1C789A2467FB0A90067E59949E9E81B26A81F07F8840CF -F665C7FDF0F55CD15D89F65516E8E36D527D664686FAE9927032FA6E0C600EFB -867322E4ED2DF71BD2ACF876DA5834D68A2C45125CDC2AA28002E2671C0ED526 -ADE0ED475393324F711A021D113CB2236031B94952C0F5E7391DB1DA1F0CE917 -F0E93E5A0693CBB8B84F32494EE622670493EB9079FF00235738B8E8D04B58E8 -CD5C5C2E70E4537CC987DE707D8D324D3F505EA801FF00AEC7FCFF009FCA3FB0 -5D11830AE07A4DFF00D6FF003FCB3E68F739F99A253752A1E5D47AF38C7F9E7F -CF45FB7B8EAE9FF7D7F9F7FCBF2ACDA75C11FEA003D879A7FCFF009FC8FECA7E -774017FE07FF00D6FF003C7E0FDCEE3F69D3FC8FD52F83AC5FE11F8218E32743 -B13C7FD7BA5149F071767C21F03AE318D0AC463FEDDD28AF723B23E8E3F0A3F3 -B7E2F789122F8B7E378534932326B97CA5F693BB13C833F8D72C9E22B962A23D -140079CE3FCFF9FD3D4FE29CB6E9F13BC5FF00226EFED8BCC9DA3AF9EF5CB9BD -5030A028AF9D9D6A6A4FDDFC59E4CA714DFF005FA1810EA5AB487E4D2D1791FC -3FE7FCFE96A3935A900C5B409EB91FE7FCFE9A26FB3FC5513DCA9EAC7F9564EB -47A44CDD5F26624B0EA63C57A707782393EC57457E518C6FB7CFF4AB3E1382EB -FB327DD7B142A2FAF011B075FB4CB9FE555AF2643E2BD3B1FF003E575DFF00DB -B7FF000A87C38DFF0012D9B9DBFE9B77FF00A5127F9FF3C5CA7782B7F5B8F9DF -2EDFD6A756906DFF005BA91F43B505498B407E6BF99FE8A07F9FF3F873B202C3 -96C9F6350BC393DCFE3583BF7307393FB274DF69D39320CB237D641FE7B54675 -5D2E338C86FF007A4FFEBD72AD680F6FF3FE7FCFA452582B7DE5381DAA5C1BEA -CC9BEE8E9A4D6F4C53FF002CC0F763C7F9FF003ED526F11E98BC799103EC7FCF -F9FD39C6D2A2618009E3B9A88E89103FEAF3FE7FFAD54A827BB64DD1BB2F89B4 -F0389A3FF3FE7FCF6A53788F4FED2A1C76FF003FE7FA669D115BFE597E9FE7FC -FE8C6D10E0FEEF033C647FF5FF00CFF2E8850A6BA8FDC6B52D36BF60DFC62A26 -D62CD8900A7AE08A87FB0DCF44C7F9FF003F97E53DAF842FAFD6436F6F35C6CF -BFE5445B6FE438E87F2FCBA94692DE454552BDB5236D4ED4818298FA542D7F68 -78320FC87F9F4FCBF2DBB5F861AD5DC65D2CA44C1DA7CDDB19F7E1883F8FB7B7 -1AB6BF05B59B8895D9EDA07EF1C8E770FC811FAFFF005AF9E847ED1D0B0F196D -091C78BDB3E8173F518FF3FE7F078B8B539FDD03F5FF003FE7F97A55B7C05692 -24326B02394A82CAB002AA71C804B8CE3D703E83B74717C0CD0A29524F36FA45 -5604C725DC58600E707080E3E841ACA588A11D9B35580E6D795AF9A3C5E37B49 -0FDC03F0FF003FE7F49552CC9E540FC2BDE6DBE186816170B345A442CC99E269 -5E55E98E558907AFE9EDC6BD9F87AD34C90CB6DA6DA59CA46D2F05B6C2475C64 -638E07E5F960F134DED7FBCD165ABA9F35EB7A3C777E17D6A7B7B792510D9CAE -ED1445827EED8E588E8383D7D3DB8EB6CBE1ADE5F465E3D3E6500E3120111CF5 -E8C41FF3EDC7A77C4A81BFE15D78ACB6D18D26EFF8307FD4B7BFF9C57482CF7E -33328FA385FEBFE7F9672AAB957F5D8E88E5F4AD667915A7C1A9EE232D22C76E -41C6C91B27EBF2E47FFAAB421F81B6EF0A996EB649FC41232CA0FD723F957A78 -B2D847EF437FDB4FF3FE7F43CA900E109FA39FF0FF003FCB3F69D8DA380A2BEC -DCF3E8BE02E90F10133DD4B2F3964C2A9FC083E9EBDBF2BB07C15F0C5B42A8FA -689DC67F792CCE19B93FDD207E4074AECDA4B88C7FAA93F073C7F9FF003EC09D -C8F9B2BFF033FE7B7F9ECD4A7DCD56168C7687E073963F0E7C37A6C2D1C5A2D8 -32925B33C62520FD5F271C0E338AD9D3F4AB3D26130D8DADB59C4CDB8C76E8B1 -A96C63381DF007E554FC51E29B6F0AE8B73A95C47757696EACED0D9A077DAAA5 -DC92582A80A8C72C467000CB15063D5FC53169FA89B1B4B3BED66E92259E54B2 -10288919995093349183B8C72602E48D8738C8CD25296ECD14143E148DBD83FB -C83FE04293720FE21F9D43A6EA7A7EADA75ADFD9DEACF6973124D13F97B77230 -DCA7040238E70707FA4E65807FCB741F503FCF6AC9B71D195711A551D4D02519 -E29ACF1F3B6E138F6FFEB7F9FE4D3939DB383F407FCFF9FC973771FC89B78229 -3CC1EE3F0A8BCEDA46033FFDF5FE7FCFE4E4BA6CE0DA8FA92FC7EBFE7F3C2E6F -21E84824471FC7FF007C7F9FF23F27AAAB8EAC3D7E5FF3EFFE7A2A48ADD62551 -F56FF1AB4890100B48AA3D32DC7EB473791492655F271D431F6D878FF3CFF9E8 -863600E226247B63FCFF009FC26956D89CEF73F463556458F0709293FEFF00D6 -AAE85A0AFBE3C830FBF38F7FF3FE788DE755192981F87F9FF3F9446455E904FC -FF0079BFCFF9FD1866001C5B85C7A8FA7F87E9F92D16A4DD132CE9264807F2A9 -0609C0CFE47FC2AA477654E3CB451F4E9FAFF9C7E5763BD541C322FD3F1FF3F8 -53B8D3108C7661F50DFE14C79117196C7D73FE15745E46C0EE752476C8FF003F -FEAA6BDCDBA8E638CE3DF1FE7FCFE0B9985D772979D1F7931F81FF003FE4FA52 -7DA235FF0096D8F6C63FCFF9FC2696EED533FE87131F66C7F9E9FA7E559AF6DC -FF00CBAAAFD1FE9FE1FE7B2E769EA857F31C6E93FBE4FB629A2F541F4F7CFF00 -9FF3F8E2169E063C5B63D839E3FCFF004FC9CB3DBEE1BA1C0FF7C8FF003FFD6F -C9F30B98996EF77F771FED37FF005A9EB74B8E4A0F5C38AC8F1278934BF0AE8B -71A94FA7DCDEC702B3B45699670AA85D89CB2A801558E588CE028CB15064D5FC -4DA769FA87D86CF46BCD62ED2259E58ECE5894428CCCA8499A58C1DC637C0524 -8D9CE32B5566C66A35D46073CF5E030A6FDBE104FCADF5047F9FF3F91A6DC68F -ACE9B6B7F653C125ADCC2B3C3212EBB9180653838238238201FA63898C168A73 -E6DB73D32CDFE7FF00D5EDC66DD9D8012E6DE41C893F0C7F9FF3F94ABE512368 -93DC7151F916AA47CD6D9F62DFE7B7E9EDC1BAD62CE5508E9F2B30FF003D3FCF -669A657CC7B3281FEAA4FC40FF001FF3FCABC97010E046C39F4FFEBFF9FE4F92 -E628F910E73EE7FC7FCFF288DE29276C2783EFFE3FE7F93BA276EA72FF000DEF -F67C3AF0B2853C6956A3AE3FE58A7F87F9EDD27F69FAA1FAEF1C7E9FE71F9739 -F0DEEDA3F875E150223FF20AB519FF00B629FE7FCF1D19BCCE7721047F9FF3FE -71536B998AE396F1DF002A8CF62E3FCF6FF3DA755B93CA88BF1917FCFF009FCA -AF9914B8C86CE3FBC3FCF6FF003D9CB021276975F60C07F9E9FE7B46B71A6582 -9740E0C6847B329FF3FE7F061B8950F287F051482DDCF0B332FF00C087F9FF00 -3F93FC89F1CDD71EE3FF00AFFE7F90AFD42F6233A8E072AC3DB601FE7FCFA700 -D4F71FBDF8E07F9FF3EDC3FECB29FF0097943F80FF003FE7F269B595790F0B1F -5207F9FF003F930B8BF6EDC0FCC47FC07FCFF9FA527DA31C97233EABFE7FCFD2 -809700E0187F3C7F9FF3F8045D01F7E31F46FF00EBFF009FE4FD02EC559811FE -B31F518A9124CFFCB45FC855690DC8049718F66FF3FE7F4A3A89D45AD245B3B9 -82DEEB2364B7109990608CE503A13C03FC431D7B604DD8AE6D8C67FD60FF00BE -452965400EE04FA6DAE0BC23AF6BBE22F0C3CF25DE9D6DABF9ACBB26D3658FEC -A015212685A50C24287710180F9C637280CD4748F18EB7A978774F2D36991EB9 -A86A1F648E396C25856CC04694ADC44D26F0FE4C6ED80D82CC801287CC3A723D -6FD3FAEC07A4B5DAAFDE0BC7F9FE9FE7B447508C1236AF1FE7FA7F9EDC12F897 -58658F4A66D306B5FDAAFA5C976B03FD99716CD74AE23F3031CC411482E30E4F -2428CE8E91E21960D37556D6228E7BCD2AE8DB5CB6996D33AC995492368E252E -FF00EAE58F239C306E768068717116875AB7818F1163F0FF003FE7F4E4BC07A6 -D85D6917724F616F348DAB6A44C8F02B31FF004E9FA93FE7FA30FC40D257FE61 -DACE4775D16F863FF217B1FCBF28BE1D5EC53F8725996391124D4B51750E1A26 -00DECC4655802A7D8804639C7386D38C1DD76FD43DD7BA3A1BAF04E85A8CA1E4 -B1DAC06DC45988633DC2B01F8FF9195A87C27D16F7CB307DAACB6673E44D9DDD -3AEFDDD31DB1FE1AFE616C60B83FEFFF009FF3FA4A229989CB30E7D7FF00AFFE -7F942934F4666E95397D95F71C56A7F046296155B0D56E6DE5DDF335C849576F -A6D0139E9CE7D78F4C1D43E06EBB0C2AD63AD5BDCCD91959E031285C75DCA5B9 -E3A63D79E2BD656D59BABC9F831A996CD7AB3CBFF7D63FA7F9FE5A7B69AFE910 -F0F4BB1F59FC28B19B4CF85BE0EB3B92AD716FA359C3214CED2CB02038CE38C8 -A2AFF819427827C3EA092069F6E327A9FDDAD15F510778A6696B687E71FC5CBB -947C58F1A2856206B77A33FF006DDFFCFE1F972C2599B9C11DFAFF009FF3FA7A -8FC4CD22097E2778B9DB1F36B178C4E33CF9EFFE7FCF19B63E1C1739F2209670 -98DDE5A16C0ED9C7D3F4AF9AA8E2A4EC8F31D16DB385586E1C81820FBFF9FF00 -38A9D34E9D8E36919AF4CB2F044F34648B574C1C11210873F4247F9FD35ADFC0 -C7CA56611A39EABBB91F9023D3FCF4E6751742E3879BE8CF0D934995BC59A621 -0416B1BA6FC9E0FF001AB1E13D0259F4D98F3817D78BF95CC82BD5AF3C29047F -10F4288C8B97D26FDC9C67044D643D47F78FA7F85AF879A069F268572CFBD4AE -ADA98C0C0E05F5C01DBD07F9ED7294FD9AB2EDFA9BFD52A35668F3F8FC2D2B63 -231C7A5588FC2873C9007B57B10D174B56DDE5648FEF3E47E47F1FF2387AD969 -D092C91AC64F04A719AE6F7D8D60DADD9E471783FCC1F26E931D76AE7FCF4A99 -3C164A92213C7F7C85FD0915EA6F0D91FE1DC7FDECFF009FF3F84263B40788FF -00FADFE78A6A321FD561B33CEE1F0133A06CC311FEEB9391F90C7F9FCB453E1B -5A346BBAF8AC98048106403EC770CFE42BB031DB0FBB173EC3FCFB530AC4A07F -A3B1C7A7F9F6FF003DA9C0161692DD1803E1D68713AB8372E148255E44C37B1C -2838E3B63FC2CA784F44B59048B630657A091D9D7F22706B542C64F16A78F6A3 -60ED6D8FF3FE7FCF41F2A3454A92DA28A70D959D8C85EDE1B5B77236968620A4 -8FA8EDC7E9F94A1A361CCAC7BFA7F9FF003F83CC7C716E07E551BC0EDD102E3D -07F9F4FD3F2575D3F535B25A2448B0DB91CE71D7938C7F9C7E9520B4B6ED91FF -0002FF003FE7E9550D8C87908DF876FF003FE7D8F22E23FE1C608EDC7F9FF3F4 -A56EC559F63416C60CF048FC7FCFF9153A69E84F12E3FE05FE7FCFE9938B9079 -CFE9FE7FCFE419AE1072F81FE7FCFF009E06AFFF000C3B58DB162CA3FE3E82FD -58FF009FFF005543240507FC7D27E44FF9FF00EB5631B995BF889FA7D3FCFF00 -9E8B899FB93CFF009FEBFE7A2B343E6E8677C4D745F871E2A532062749BBC0DB -FF004C5EBA23A8DB4581B0B91D7181FE7FCFE1C5FC47B690FC3DF143104E34AB -A3927FE98B7F87F9EDD30B19891C7F9E3FC3FCF6D5B7CABFAEC4FC8D05D6AD50 -716AF9F77C7F9E94D935C42C7644507FBDFF00D7AA3FD9D371C0FCFF00CFF9FD -248ECA4539280FE3FE7FC8FCA5C9F404C49751320E1307DFFCFF009FE583AC78 -7ADB5CBA59EE27D423654D805A6A5716E98049FBB1C8A33CF5233C75E38E9523 -95318854FE3FE7FCFE934724E9D208CFE1F4FF003FE789E692D87A3EA725ACF8 -7BFB5BC2B7FA2A4B2C297164F662694B4CE8190A06258E588EA727271C9F4A9A -9697AC59F884EA9A45B59DDFDA6D56DAE62BDB97831E5BB344C8CB1BFF00CF59 -43023FB98C60D77A6EEEF8FDC44A3A703FFADFE7F940C6E24FF9668323B0FA7B -7F9FE4D4A5DB40B25D4C1F0CE8B1787BC3BA6696F37DA3EC56B15B79A54A6FD8 -8177632719C6719E3F0E35D3EC81B9C647E9FE7FA52BDBDC1E0ED5FA7F9FF3FC -9B15A18F96C67BFF009FF3FE0DB6F7169B0CD4F41D0F5FB64B7D4F4EB5D42DD1 -F788EEADD6550C0632036467048CD3746F05787342B97B8D2B49B0D32E190C6D -2D9D9471395272549500E3201C7B0F4E2E46EB1F523F1AB09AAC707F120E7A7F -9FA526E49590F4EA3355F0B699E24B34B5D52DA1D4AD91FCC582F2D966457C10 -182B0201C1233EE6A9E93F0F344F0F5CBDCE8FA5D969970E863696CECE385D97 -20EDCA8048C8071EDEDC693F88076DB503EBD21E871F41FE7FCFD38CBDF4AD7B -22EF12B6B7E0CB7F11DBADBEA7676DA9C0AFE62C579124AA1B180C0302338246 -7DCD4CDA05CE72CE3D7AFF009FF3FA4526B1393F2EECFAFF009FF3C7E51FF695 -C9EF8C7A8FF3FE47E4ED2564D91744E74F9233F3484FD0FF009FF3FA0A9B1B96 -90FD3FCFF9FE500D42E7B903F0E9FAFF009C7E482F271D5941FA7FF5FF00CFF2 -AE65B364DD16387E73260FAE69A6D998120B8CFA9FF3EFFE4711ADEDC67EF81F -D3F5FF0038FCA55B8BB607F7A07F9FAD529C5E838B88CFEC892424EE3F88FF00 -3FE7F4C6D43E1AE81AADE4975A8683A6DEDD498DF3DC59C6EED8181962B9E000 -3FFD5C6FA9B9231E681FE4FBFF009FE532ADD11FEB0B0F6FF3F4AB4D2D8BB419 -97A7F87EC747B44B4B3B28ACED6324AC16D188D132493850001939359DA97807 -C31AB5DCB777DE1DD3EF6EA4C6F9A7B48DDDB03032C4678031F80F4AE8F7CC87 -25CF1EF41BB6EE73FE7FCFE54EED6A84D2E8655868B63A4DA25A5869E9676B1E -4A416C82345C924E14600C9E7EA6AB2F872C20D566D4A1D3218F5099364B7891 -2099D4630A5FA91F2AF04F61E831B726A613A83F87F9FF0038F6A88EA608E33F -E7FCFF009ED37EE494BEC739FF00966DF4FF003FE7FA656ABE0E8F58B959E76D -463754D805A6A5716C98073F76391413EF8CF4F418DF6BF90F40D83C67FCFF00 -9FCB88CDC5CB1C8C8F6C7F9FF3FA09F2EC231359F0AC9AAF856FB45469614B9B -27B31348C66750D1940C4B36588E09C9C9F5F4A7A9E87AED9F884EA9A459DA5E -7DA6D56DAEA2BCBA6831E5BB344C85637FF9EB286047F7318C1AE984B7671F78 -FE5FE7FCFE4A5EEC7527AFA7F9F7FF003D1DEDA08C9F0E78727D03C3BA5E9796 -9FEC36B15B79B8DBBF6205DD8C9C676F4CFF00F5B445ADC21E233F863FCFF9FC -A4125D9C7DE3F97F9FF3F94B1CB72A7E60C71DC7F9FF003FC93DEEC646A97600 -F94FD38FF3FF00EBFCA45FB62FF083F97F9FF3F95849A5079CE6A649180E476E -E2903D0A624BDFEE0FCBFCFF009FD1EAF77DE2C8F6FF003FE7F9682CB9EA79CF -F9FF003FE4349603800F14682D0E43E194930F873E141E48651A4DA639EBFB94 -FF003FE78E971230E6003E9581F0D2775F86BE13C0C81A45A7FE894ADF7B9603 -EE74ED5A4FE263443240CC7983F5E7FCFF00F5BF0ACF6727244457E87FCFF9C7 -E13B5E9046E46039E4520BA8CFF1ED1EE6A37DC6556B4980E54FE07FCFA7F9EC -C68644EAA40EE47F9FF3FCAE8F2DBFE5AB0FC7FCFBFF009E8E30C2C7994FD09F -F3EFFE452B20D0CF119638C807D09C7F9E9FE7B4AB6721E857F03FE7FCFE968D -9DBE72D213F53520B4873C48C3D81FF3FE7F42CB6114C69F2B7F77F3FF003FE4 -7E4BFD9D38EC3EA0FF009FF23F2D158500CF99D2A68D14632C452D2C062B594C -072BFE7FCFF9F4A7A969D73756B24115CCF6123631716C10BA6083C07565E718 -E54FE1C11D7C7144C3E6627FCFF9FF003D1E6DAD5B8C1FC0FF009F4A9E64BA16 -A0D9E7969E186B4D3EEE08B55BC8AF2EE5F3E7D4488BCF6701541DA63F2C7C91 -A26020185CFDEC911AF80626B6C0D4EEBFB47ED5F6DFED3062F3C4DE5F93BB6E -CF2FFD57EEF1B31819C6EF987A1369B6EDFC447D4557974687F85BFA7F9FFEB7 -B714AA3E9F90D537D8E207C3D8DAD403A9DD7F68FDA7EDBFDA798BCF13795E4E -E0BB3CBFF55FBBC6CC639C6EF9869689E14FEC68AE3FD2E4BCB8B997CFB8BA9C -AEF95F6AA02422AA8C2222E1547DD04F249ADA974731E30C4103B1FF003E9FE7 -B557B2950FDEC7F9FAFF009FE54E5756627092E83C695211CBAFE07BFF009C7F -9E9CE78034F90E897455C01FDABA90FCAFA71FD3FCF6DB68A74E3E638F46FF00 -3FE7F4E6FC072C8BA25D65C8FF0089AEA3EDFF002FB3FD3DFF00CF47A28FDDFA -90D58EBD6D2E500F994FE47D3FCFF9E14A5D273B10F19E9D7FCFF9F6A42F251F -C44FF4FF003FE7DA41A84C3F8FF3FF00F5FF009FE53748098CB720731AFE007F -9FF3F9279F273B80518E4EDFF3FE7F48CEA729F43F5EDFE7FA7E486FDC8E76FB -67FCFF009C7E45EC33ECDF021CF823C3C7FEA1D6FF00FA2968A4F0136FF02F87 -1B18CE9B6C71FF006C968AFAD87C28CCF97BC6205B78EBC4324162892B6A171B -A544019BF7ADD4FE03FCF4CE135DB1E23FCFFCFF009FE5D0F8D2FA38FC61AF29 -4DC45FCE3FF22356236B1B78D9815F2552537376475A92B5AE3562BC7E080BEF -520B2B8279971503EB7201F2A9CD427559D89FDD9C76FD7DFDAB1FDE7517BBDC -C6D4AC1BFE166E82AD39E748D44E47B4D63FE7F0A8FE1EE991BF87AEC99580FE -D7D50607B5FDC0A82FEEE693E256847A1FEC8D4063DBCEB2A7FC3A790E8575FB -C0BFF137D50F5FFA7F9FFCFF009E3A1AFDDABCBFAD42D0B9D39D2A11C991FF00 -33FE7FCFE486C6343DC8F73FE7FCFE961138E65503DFFCFF009FE532AC7823CC -FAE2B2E78AEACB71899BB101E23CFD7FCFD7F5F4A69936E3118AD63E563B9FD2 -A329193F7452E7BF433F65D8CB32BFF72A3325CF68D7F3AD9F2948CE31FE7FCF -F9E8C2AB8FBA3F2FF3FE7F4D5598FD8B463F9B7478DA067DE9DBEE723803DF3F -FD6AD27723F8318AA9248C4E40C7B8E3FCFF009FC0D3A09D3E5EA883CDBAF65F -C7FCFF00903F055B89C75603DB34C72E73C1A85D6660401B7DFF00CFF9FE8F61 -2935D4B46E64DBCCB814CF3D58E0CB939F5FF3E9FA5527B5998E5B9FF3FF00D6 -FF003D9C96D2A9FBA323D7FCFF009C7E4393139C9BDCB9FBA27A93ED46C8CF44 -CE3D6AB6C9D7A01FE1FE7FCFB3C79E3B28FCFF00CFFF00ABF22E41379473C262 -8F2E51D00031DC534338C8CE0D3B7313CB53039EF885697779E02F12DBC08D3C -D2E99751A43121677631380AA0752720605347C44D350E4C1ADE47FD406FBFF8 -CD747F2E3934E1E5F7A778DACC0E7D7E25E8E8066DF5CE3AFF00C48AFBFF008C -FB7F9EDB9A378B74DD62D5A7823BA44572845DDACB6CD9C6785915491CF5C63F -2E24223F4FD690C21BB56728C1F7FBC6A562DBEBB005215003FE7FCFE1F9547D -650E70147F9FF3F97B708D60EE784C90383E958BACD9788E1B851A5697A75CDB -ED197BCBF92060D93901561718C05E723E8300D66A11BE8CABCBB16B50F125AE -9C21FB4DD456BF6895608BCE709E648DF751724658E0E00E4FE1C13EA8D02879 -A68E08CBAC619D8282CCC15579EE588503B938EBD38EF18EA5A369373A7DA6AF -73A3DAEBF7565243E56A376BF6586090A79CCE1CA79885A350AB80CE5481B143 -B2477D69A0F86BC4D05B78A6F6D1ECBFB1E2B6D3EE75D963632321952E8EE7E0 -3BA4B6E1FA6F07B853B7A634D349FF005F220EEC2DC3E017FF003FE7FCFA3C5A -CA4FFAC3FE7FCFF9ED97E06FB52F82BC3FFDA5E7FF00687F67DBFDA3ED39F37C -CF2977EFDDCEECE739E739ADEFB4C718E4E2A1A49D908AFF00D9AEC3FD61C67D -7FCFF9FD1069C10E73FAFF009F4FF3DA2D66E7509AD5534BBCB4B29C3FCCF796 -CD7085707236AC9190738E727A1E3D28E94DAE4372CDAAEA7A6DE5BEC2163B4B -092DD8367A9669DC6301B8C0FAF14596EDA0D4D510AA76FC294C88993B7A0ACC -D625BE9E00BA5DDDAD9DC0705A4BBB669D0AE0E405592320E71CE7B1E3D33F4D -1AE25C16D4F52D3AEA0D9F2A5A58496EC1B2307734EF91D78C0EDC8C53D12BDC -77B1D0FF006844BC7963F11FE7FCFE8C6BF8CF451FE7FCFF009C7187AAC5A84D -6EA34DB9B6B4B80E0B3DD5B34EBB71C8DAB2260E71CE7B1E3FBB7B3DF38FD3D3 -FC3FCF686ED6116DEF54F45FD3FCFF009FD207B8DC7803EB9FF3FE7F487D3FCE -3FCFF9F6767BE71FA7A7F87F9ED2EC1724B773BF9247D7FCFF009C7E57908F50 -6B2C718C678F43D3FCFF009F678919470D8FD3FCF7FF003D07A3D069D8DC8046 -0E4B0F739FF3FE7F4BD17944FF00AD5E383CFF009F4AE5BCF7FEF1FF000FF3FE -7DB1EFD3C4925E3B596ADA65BDA9C6C8EE34D92571C0CE585C203CE7F8475F6C -85EF5F7B1AAAAD687A1B431648F34103DFFCFF009FD216B181FA48BF5CD727A7 -4D7F15AC62FAE21B9BB19DF25BC26143CF1842EC471FED1E87A7414EFDFC4925 -E48D65AB6976D6871B23B9D36495C70339717080F20FF08EDE84D351937AC86E -ADF73AF974E85BA483D08FF3FE7FA43FD971A1254F07B8FF003FE71F965E9977 -77159A25FDC43737633BE5B684C28DC9C610BB91C63AB1E99E3A020BCD417559 -A496F6D5B4C2988ADC5AB2CCADF2E4B4A6421870DC041D473F29CDDBCCC9BB9B -0B6410E323AFAD48B6E073EDE9FE7D2AA0D54600DDFF00D6FF003FD3DB8C8D5B -5ED6E0B855D334ED36EEDCA0264BCBF7B770D93C05581F2318E723BF1C51AB23 -6372F750B2D28DB8BCBBB7B5FB44CB6F0F9F22A79B2B7DD8D724658E0E00E4E3 -F292E2E20B385659E58E042E918690ED059982AAE4F72C4003B92077AF3DF19F -8CF45B29EC6DF559748B7D7AEAC65B7315FDC836B041294F38B86D9E62168D00 -5C0672B8F917CC64A97975A0683E2582DFC4F796B3D98D1A1B5D3EE75F923769 -194CB1DD1DCFC07749600E78DE3D421DBAFB3D2FFD7C87D4F4E6C8ED5134AC3B -573DE08D46F07827C3EBA89B86D4069F6E2E7ED21BCDF33CB5DFBF773BB39CE7 -9C839E9C6BB5F0CE707F118FF3FE7D38CAC931244CD74EA0FA540752746F9971 -EF9FF3FE7F461BA073F29FCBFCFF009FC711C93061F7483E9DBFA7F9FD15D22B -42DAEA63D48FD3FCFF009FC2517E99E48E3DFF00CFA7E958EC39CED23DBD3FCE -3F4FC80403927E9DBFCF4FF3D95C455F8657512FC37F0986C71A4DA67FEFCAFF -00857485E26E87DB15C47C35447F87DE17F9B07FB2ED7BFF00D3153EBEDFE7B7 -54208CF7FC8FF9F4FD3DAB592F7D89227729CFCD55E58A30BD97D08E3FCFFF00 -5BDAA55B68F8E83F1E9FE7FC3D29C2CA2233903FCFF9FCBDAA194509220BD1B8 -F43FE7DBF4FCA2E87AFD79C73FE7FCFA699D3E3F6FCE9AD649907A7E247F9FF3 -E9536119D92473F97F9FF3C7E40383C1C7B838FF003FE7F0B6D62A3A31181FE7 -FCFF0091135BB2F391C7BF4FF38FF3D9DAC16B0C59E4007CC7E9FE7FCFF470BB -917A30FAFF009FF3F4ED1142A7A1E3D3FCFB7E9F92E7BE71FA7A7F87F9EC9BB0 -13ADFCC00FA7F9FF003FE43FFB4E6CFDE1F9FF009FF23F2A7E9FE71FE7FCFB3B -3DF38FD3D3FC3FCF61BB30B9686A93FAE3DB3FE7FC8FC9EBAB483A938F66FF00 -3FE47E543D3FCE3FCFF9F6767BE71FA7A7F87F9ECDBB0F99A3513582BEE7DC7F -9F4FF38E245D610F5087DCD62FA7F9C7F9FF003ECECF7CE3F4F4FF000FF3D872 -B683E797721D4F4CB9D4AF659E1F13EA9A6C4F8C5ADB4768634C000E0C903373 -827963CFA0000A7F0D9A3B5F0C4B14D2B5CC89A9EA4AD3CDB43C9FE9B3FCCC14 -05C9C13C003AE00AD0F4FF0038FF003FE7DB9FF01F1A25CF38FF0089A6A3EDFF -002FB37D3D3FCF6D1C9F25BD3F51377DCEE4CF6FFEC8FF003FFD634E06DDFD3F -FAF589E9FE71FE7FCFB3C03D73FE78FF000FD3DB8C9B42367CA80FF3FE549F63 -84F4C67EBFE7D3FCF6CB065503E627F1FF003EFF00E7A4AAD70323209F6FF3FE -7F9276EC16B9F66781942782BC3EA3A0D3EDC7FE435A29BE03CFFC20FE1DCF5F -ECEB7CFF00DFA5A2BEBE1F0220F97BC73751A78D75F040C8D42E3A9FFA68DFE1 -5CFBDEC6A7F8455AF1F007C7BE23FF00B095CF43FF004D5BDFFCFF002C41B460 -93FAE3FCF4FF003DBE566FDF65685D6BE5038CFB7F9FF3FA70CFB648C70A9FE7 -FCFF002FCB988FE23F83D471E27D1B8E33FDA1173E9FC5F4FF002389D7E26784 -39C78A3451FF00710847FECD4F927D8A425E999FE22E899214FF00656A1D39FF -0096D67FE7FCF12FC3C8DFFB0AE86E3FF216D4FAFF00D7F4F5CCF877C6D67E31 -F88FA75D585ED95C5926957A228A0995E755335A7EF2501BF77BF1F2A101805C -B10C4A2751F0F65DBA15D7FD85B53FFD2E9EAE70E5872BFEB70F43AB8A120FDE -3F4CFF009FF23F2B9044B85E73FE7FCFF9E9496739CFF5A9527200E4E7FCFF00 -9FC2B91C7B14A56DCD3448FA753DEA40171C28ACF59C8C60F4F7FF003FE7F4B1 -1DD0E72C33FE7FCFF9E307066BCC9F52C9E7B534C6A4741519BB41EB4D37A3B6 -08F6FF003FE7F94F24BB0B992EA3DADC1CE38F7FF3FE7FA44D640E79FC3FCFF9 -FE88D7A7B2E3EBFE7FCE3F261BB624F3C7F9FF003FE78D14664B717B8E6B2551 -9EB8FF003FE7FCE2378111B18CFD4FF9FF0039FC033B13CB60FF009FF3FE7885 -A6E393FE7FCFF2AD1297564371EC3B6A83D07F9FF3FE7B3768C6703D7A7F9F43 -FE7A46D7183FD2A23718AD6C4FA22765E8300530C44F38F7CD40D7B8EF5136A3 -B78F9B8E7D3FCF4FF38E0D82DA964C0C4F3C76A61B466F503D7355CDFF005EA3 -F0FF003FE7E9C07501EFFCBFCFF9F4E1DF4BDC7A93FD832793FAE2A48ECD40E7 -207B5523A860F208FF003FE7FC8E0FED21FF00EBE3FCFF009FC27716C69A428B -E87FCFF9FF003D2C47246A79E4FF009FF3FE78C3FED0C9EFFE7FCFF9ED32DC16 -EFF854B4BA9516D6C6E1BD8D07009FA54326A448E3F2FF003FE7FA65AC858F35 -3A47BC7040FF003FE7FCF48E5822B9A43E5BE66C927DC75AAB24CCDDCD5D4B34 -6C6587D4FF009FF3FCA71A646792C287282E83E57D4C09A56C70A71EB8FF003F -E7F4ADB1C9E84E7BFBFF009FF3E9D3BE9F02A93BD73EF503DA42BFC43F3FF3FE -7F44A683919CF6D6C72A7E9FE7FCFF0043041FEBD3FCFF00F5BDB8D79228D41F -9FE807F9FF003FCB0BC63AAC9A078535AD4EDD63927B2B29EE6359412A591198 -03820E323B11F855A7776488B12F38E411EDFE7E9FA7E46707A8FA838FF3FE7F -0B33EC1FE7FCFF0091EDC57CF39CE3F4F4FF000FF3D9A6BB12F4258E2CFDE38F -F3FF00D6FF003DA75B65049E3FC3FCFF009ED8A8AECB8207FF005BFCE3F4F6E2 -6133AF6C7D7FCFF9C7E55A21AD372D2DBA1E807F9FF22A45B5400741FE7FCFE5 -5484F28E4A1FC7FCFF009FE4F13CD9385C1FF3FE7FCF157422F7D957D693EC91 -8EEA31FA7F9C0AA7E7CC39DBFE7FCFF9F43CE9B2460647F9FF003FE70AE3D4BD -F65407AFE228FB3C78FBC2A819A55192A39FF3FE7FCE10DDC83B63FCFF009FCB -F22E2F99A02DE25279A6B409EBF9D671BC907F0FFF005BFCFF0043F806F189EA -07F9FF003FE7A0D86C5D68531D7AF35118107403DBFCFF009E958175AFDC47E2 -9D3B4D509E45C595CDC393F7C346F02A80738C6256CF1D87239AD46B96618240 -1FE7FCFF009E29D95BCC775D495E0439E7FF00ADFE71FE7B5765D9DF1CFF009F -F3EDF91E6B673D4FF2FF003FE7A709BBD4E3D3B7F9E9FE7B43B0892365EFF29E -BFE7F2FD3DB8B2BE5EE0063D87F9FA7E9ED543D3FCE3FCFF009F670723BE3F4F -F3FE7D382E906C69204A954273CD6509DC7727D7FCFF009FF05170EBFC7F9FF9 -FAFF009E95CC3B9AFB223DF9A63469EBF9D63DCEA42D2DE59EE264860890BC92 -48C155140C92C73C000124FD7A76C41F13FC2FFF0043468A7B7FC7FC5CFF00E3 -DFE7F9524DEC075CD1A01C544F0A11C0C7A63FCFF9C5729FF0B3BC2FC67C51A3 -1FFB8843EDFED7F9FE483E24F859B3FF0015568DD7FE82117FF15FE7F0E1F2BF -E515C5F8771FFC5BBF0B3027FE4156A7AF4FDD2FF87E9F96F9665C73C74CF4FF -003FFD6F6E303E1C2B1F879E173BB8FECAB5C63FEB92FF0087E9F97462DDC91C -8EBDBFCFB7F9ED33F8980D170E00E7F0FF003FE7FA02E5C1FBC0FBE7FCFF009F -4ED27D88FF007BE9FE7FCFF828B46C024E0FF9FF003FE789D7A05AC462EE4C7E -BFE7FCFF00F594DE49D32BF5FF003FE7E9D9E2C7DFA7F9FF003FE70E364D9EBF -E7FC8FD3F21DC7A90FDA64239FAFF9FF003FFD64370E4F518FAFF9FF003FA4DF -603EA463FCFF004FF3D94D9367AFF9FF0023F4FC877158AC6466E4F5FF003FE7 -FF00D5C37383D7F1071FE7FCFE16BEC07D48C7F9FE9FE7B29B26CF5FF3FE47E9 -F926BC82C54C9239FCBFCFF9E3F23383D7F1071FE7FCFE164D911EBC7F9FF3FE -7086D5F191C11DBFCFD3FF00D5D8B5BA058AE3E6EBC77FF3FE7B7E522C449183 -C9F4FF003EDFE7B2FD9987518C7F9FF3FE709874C8CE39FF003FE7FC381DB601 -C2D99BBFD7FCFE1FE7B3D6CDBBB60FB7AFF9FF003E8D5B965C654F03FCFF009F -6FCA417AB8E463FCFF009FF39C3490F4EA626A5E21B1D2EF24B59A1D55E44C65 -ADB48BB9E3E46461E38CA9EDD0F18238238A7F0E2117BE1A96E23F31125D4B51 -7512C663703EDB3E32AC0153D320804639E9C75AB78BB476FF003FE7FC8E303E -1FDD08F40BACE07FC4D7533CF1FF002FD3D6B68F25920364D81FEF1FCBFCFF00 -91F4C2FF0067B0E8D8FF003FFEAFCBF2BA2ED475C629C2F14F181E9FE7F5AC92 -EC83E4535B59067E663F87F9FF003F8625589875E6ACFDA9319C0A05C2E31C53 -F905EDD0FAE7C0DC7827C3FF00F60EB7FF00D16B453BC1077782F403EBA7DBFF -00E8B5A2BEB21F0A333E5BF1BE90F378DBC40FB3EF6A370467FEBA37F9FCBF0C -85D131824053F4FF003FE47E5D2F8D754F2FC65AEAE48C5FCE38FF00AE8DFE15 -86DAA75E4FF9FF003FE7B7C74E3373675A8C48068EA3D87D3FCFA7E94CB8D06D -6F2DA4B7B98A39E0950C724322064752305483C10476AB0753CF724D306A27DC -5118C8BE587733F44D06EB4BF3AD66B8FB5D8C7836B34AECD38539CC7213F7B6 -E0624CEE6070D9652EF9BF0F2D10E81744F5FED7D53F4BFB8FF0FF003DBA237E -7FBC7DAB97F879765741BAEDFF00136D4CFF00E4FCF5D495E2EEFB7EA3E58276 -B9D78B68D7B13EE7FCFF009FE4E1146BC6CFF3FE7FCFA57173D31D7EBFE7FCFE -8A2E19874C7F9FF3FE7A2F71680FD9A2D08D476C7D286403FA5402524E73CFB1 -FF003FE7F43CC63D79FA7F9FF3FCA1B464E7124200CFF9FF003FE7F061231EA3 -DBFCFB7F9EC1273C93C1EFF5FC3FCFE8D1D318ED4AE8CA5217807D0F7FD3FCFF -009E1A7EE83D7FCFFF005BFCF67E4F3F5FEBF87F9FD183A631DA912C6953D3F9 -9A6988B76A9F279FAFF5FC3FCFE8C1D3A0E9ED40B444260EDDFA734D36C4F38E -DDBFCFF9C55B24F3FE7BFF009FF3D22C9C67A628BD87B158C1814C6841FA55A2 -314CF2FDE9DFB8AFDCA86318E98A618D474007A7F9FCBF2AB661C9F4A4301CD3 -D1957466BE141C0E07B631FE7FA7B7113673C703D7A7F9FF00EB76C71AA6DB38 -A05A803A6054D85A1948C5793907FCFF0087E9F94E27DA318FF3FE7FCF5C5EFB -282738E7FCFF009FCA836BED4B950EF6D8A7F6A51D41FCBFCFA7F9ECFF00B663 -D78FF3FE7FFADC5AFB3723B506D46738A5C887CC403512BDCFE5FE7D3FCE385F -ED36031938FF003FE7FF00D5C4C2DBF0A0DAFB0A3915C572B9D41F3D5FF2FF00 -3FE7E9C46D784F6391FE7FCFD3DB8B82DBF0A0DAFB0A39121F3144DCB1E7611F -51FE7FCFE9CCFC4999DBE1EF8A0638FECBBAFF00D12DFE7F03F876A2DFD6B9FF -00887A74F79E01F13416D13DC5C4BA65CC71C3129677631300A00E492780055C -229490AFE6592AEDD54FF9FF003FA7B712C7036471D7BFF9FF003FD33078EB4B -FF009F5D73FF000417FF00FC6690F8F34B1FF2EBAE0FFB805F7FF19ABF66FB0B -437121C03DB3FA548B1003000C7A573E7C7DA5FF00CFAEB7FF00821BEFFE3341 -F883A5A9E2D75BFF00C10DFF00FF0019A7ECE5D8AD0E9162007A548912D72BFF -000B0F4B51FF001EDAD8FF00B80DF7FF0019AC2F17F8D2CF5AD363D2E3B3D68D -A5F4A20BE93FB0EF46CB6DAC641831027785F2BE520AF9BB87DCA6A9C9BB099D -27803C71A67C45D167D4F4C70F0457935A9E1867637CADF32A9F990A3E31C6FC -7506BA168D41EB5E3DE1BF1245A0EAB1DEAE9FAC8375777F0DF47FD8B77C42D7 -571716D367CAFE1DECBB4609FB465BFD5E0766FF001274B1FF002EDACE3FEC07 -7BFF00C67DAAA74DA97BAB416DD4EAD907AD46E808C572C7E23E99CFFA36B391 -FF00503BDF7FFA65EDFE7B35BE22E9BD7ECFAC8F6FEC3BDF7FFA65EDFE7B67C9 -2DAC3BA3A69101F6FE7FE78FF3DAAB80BEC7FCFF009FF3C73EDF10B4D27FE3D7 -59C818C8D0EF78FF00C85FE71F931BC7DA68FF00976D647FDC0EF7FF008D7B7F -9ED2E12DAC2BA1B7C49F883A2673FF0020BBFE3FEDAD9FF9FC3F2E8B383D7F10 -71FE7FCFE1C8DA6AB1EBBE39D367B5B5D4120B6D3AEE3964BAD3E7B6556796D8 -AAE644504911B9C0ECA7A76EBF3CF5FE9FE7A7F9EC4D72D935D3F5013248E7F2 -FF003FE78FC8CE0F5FC41C7F9FF3F8274C7F8FF9FF003FA381E7AF4FFEB7F87F -9ED9BB210992473F97F9FF003C7E46707AFE20E3FCFF009FC13A63FC7FCFF9FD -173CF51C7E1E9FE1FE7B0EC803248E7F2FF3FE78FC8CE0F5FC41C7F9FF003F82 -6471FE3F4FF3FE785CF3D471F87A7F87F9EC3B200C9239FCBFCFF9E3F23383D7 -F1071FE7FCFE0991C7F8FD3FCFF9E173CF51C7E1E9FE1FE7B0EC803248E7F2FF -003FE78FC9436D3D463EBFE7FCFA6386061C7F9FF3FE7F076EEF9E9FFD6FF0FF -003D9E8985D16239C67278279E7FCFF9FE5604ABEB93E959D9031D47F4FF003F -E7D9C1F1FC407E9FE7FCFA705ECC77B1A6B22F3D38A9048BE9F956509D87724F -D7A7F9FF003ECF17447A0FAFF9FF003FC9B90F4359654C8E0539648FD85640BB -391C7E5FE7FCE3F25FB637A803FCFF009FF3C1A13A1AFBD3FF00D74A1907A563 -8BD6F4FCBB7F9FE9F93C5FE07391F8F5FF003FE7D8D02C8D61B78C8A51B06381 -F97D2B312F41CF5FF3FE7FCE0E265B82471F95161A5D8BA150E381FE7149E4A9 -04FB7A556598E2A459BDF2053B342B5857831DAA268383C7E7565662DC76F7A5 -1B4834AEC2FA941EDC018C542F6A3271C7B7F9FF003FA6350C40F2306A268B8F -5A774F71DD192F6ECA33FA7F9FF3FD399F02865D16E474FF0089A6A5D38FF97D -9BFC3F4F6E37753F0D5FDEDEC93C1E25D534F89B18B6B68ED0C69800705E066E -48CF24F5EC3819BF0E6D5A0F0C4B14934970E9A9EA2AD348143C845ECE371DA0 -0C9C678007A015A72AE4D3C83466A827DC7B7F9FA7E9F92EF20FDEFD7FCFF9FD -2DBDAA9C607E5FE7FCFF00285ADDC118EBE99FF3E9FE7B636F20B11F9AE7A93C -F3FE7FCFFF005812B0C00FC0E3838FF3FE7F06942A7A1E3D3FCFB7E9F92E7BE7 -1FA7A7F87F9EC3B20B9F69F80093E04F0E13D4E9B6D9FF00BF4B4527C3FE3C07 -E1BEDFF12DB6FF00D14B457D743E1441F2B78EE299BC71E2221B0A751B9EDFF4 -D5BFCFF9E30FECD331E64C7E1FE7FCFE9DD78D2C43F8BF5D603ADFCE4FFDFC6F -F3FE78C6366140C741EA3FCFF9FD3E6271F799BD9D8C05B590FF001B1E7FCFF9 -FF002255B7619AD868303AFE5EDFE7F4FC98620A3181C7F9FF003FE711616A8C -D58093CD73DF0F602741BA207FCC5B53FF00D2E9EBB13C75E9F97F9FF3F87357 -3F0EFC277B712DC5CF863469EE26669249A5B0859DD8924B125724927A9A7756 -B325BD753704383FFD7A91230B839C77E95CC9F869E0DC1FF8A4B42FFC16C3FF -00C4D467E1AF8347FCCA7A1FFE0B61FF00E2695A2FABFBBFE0927583E538FF00 -3DBDFF00CFF24DC38CF38FFEB7BFF9FE5CFE93E14F0FF87AE5AE74AD134DD36E -1D0C6D2D9DA471395C82549500E3201C7B0AD56987AF3536EC32D0900E8290CA -3BF38F5FF3ED545AE00CE4807AFF009FCAA36BD519C9C63F0FF3FE7D296816EE -68F9C14F148671C719ACBFB629CFF9FF003FE7DF086F57FF00D7FE7FCFE787A0 -591AA270391FD693ED03B8E9EA6B2FED8307D7FCFF009FF2707DB0639E3FCFF9 -FF0039C1A0591AA2703A7F5A4FB40F4E9EB5966F0738FF003FE7FCF7C1F6C5C7 -3C1FF3FE7FC9C2D02C8D51380323FF00D74DF3C023D45661BC1CE3FCFF009FF3 -DF07DB171CF1FE7FCFF9CE15D0591A82618F6FF3FE149E78047A8F535986F073 -8CFF009FF3FE7B2FDAC639041FF3FE7FC9C1743B23484FC0E38FAD1E7E08E064 -7BD66B5D019E0FE5FE7FCFE384FB58C7DD39FF003FE7FC9C175B8591A62E318C -63F3A3ED1D3A1C7BD65B5DFA29FC7FCFF9C7E4BF6B3FDD23F1FF003EFF00E738 -774164690B9C5027E477C7BD508A569072B83FE7FCFF009E26048AA4930B265C -597D29EADBBDF15510E4559847032703DFB7F9E3FCF45615AC48A3071FE7B7BF -F9FE4F58B711C671FE7FCFF9C3D57A6481FD3FCE3F4FCADC51A839181EFF00E7 -FCFF004B5134504568ED4903823D7FCFE1FE7B4A6C411DFD7FCFF9FF00EB5B55 -03A53B8C53B21D919D259919C038EFFE7FCFF8406D8E718FF3FE7FCFA6B900D3 -0AA8F6FC68B215918AD6F9EC7FCFF9FD2A26B724120715B4C917F780EA060F4A -89A2888C6F1F4EDFE7FCFD172F6172F6319A1A8DA007B67DEB5595318DD9C71F -E7FCFF00F5A12AA07AFBE7FCFF009FD25F992F4330DB2F3F28FCBA7F9FE94D6B -65EC02FD2B48AA8EE09F6A632802968C57338DA8FF003DBFCFF9ED83ECC0138E -3FCFF9FF0038C5D6419A632019A2C8AD0A060E99E3BFF9FCBFCF6618F6F7C7D0 -FF009F4FD3B76BE56A378F20FAD271B058A0411C1FF3FE7FA7E4C278FF003FE7 -FCFE56DEDCF6E9FCBFCFF9F684C0E49E071FA7F9FF003ECB4466D10E4E38FF00 -3FE7FCFB1920FBFAE7FCFF009FD1ED032F6FF3FE7FCFA1B0FF009FF3FE7F96AA -29EC637199257BE3D3FCFD3FCF60F071C67EA3FCFF009FC94C67B75C7F9FF3FE -423A3124E7BF03F2FF000FF3DB5505B12E56D842E36E7FCF7FF0FF003D90C801 -207E847F9FF3EDC44F1B839C1FAFF9FF003FD11815EB9033D3FCFD3FCF6D9538 -9CD2AB24F625F354FF003FE7FE7FCF120033D79FF3FE7F0FCA9E31ED4F04F383 -8C7F9FE9FE7B29515D09F6EFAA2D01BB8FF3FE7FCFD00A7391D7D8F3FE7FCFD2 -246214738E9FE7FCFA7B712A310305B91DBA7F9FF3F871CE1634552FD072AE0F -F81A7A8C773C7FF5BFC293F9D2E6B959AF331C0023AFF4F4FF000FF3D80838E7 -F2FC3FCFF9E103629C1B8A9668A637CBE991F87E5FE7FCF09B3078FC483DFF00 -CFF9F497F03FE7FCFF009EC99F7FF3FE7FCFA172EE4450F43D7D3F2FF3F87E49 -8C720FE238E7FCFF002FCA7C74EBFE7FCFF9EC63DFFCFF009FF3E8F98AB95F91 -D783FE7FCFE1EDC3D65C119238EE08FF003FE7F290C63FC9FF003E9FE7B20818 -F7E47A7F9F6FF3DAD4877264B8E3D0FA7F9FF3FD275939383F955216D81C1231 -DFFCFF009FE92C71329E7B76FF003FE7FA6C996996C49F8D4AB27BF1599A8697 -69AC59C9697F6B0DF5A498DF05CC6B246D83919523070403D3A8158FFF000AD3 -C21FF42AE89FF82E87FF0089AD528BDC76B9D7A4A47F853C383D4571C3E1AF84 -07FCCA9A27FE0BA1FF00E26A41F0D7C1DD7FE114D0CFFDC3A1FF00E27FCFF25C -B1EFF87FC126C75A501E8735CB7C3E8B3A0DD9E83FB5B53FFD2F9E9A3E1B783B -FE853D0BFF0005D0FF00F135BFA65959E8B631D9E9F67058DA459D905B44B1C6 -99249C28000C924FE349D946C844AD1647F854463F4AB2650C7278A6B3022A53 -63BB45468783C62A16B60589E9F4FF003FE7F2C5D623DBE9FE7FCFF46363B53B -263D0FAFFC0436F817C383D34DB6FF00D14B452F817FE449F0F7FD83ADFF00F4 -52D15F570F85199F37F8D2FD93C61AEA8ED7F38FFC887FCFF9E301EFDB921B1F -E7FF00D7FE7A4FE3CB90BE36F1080738D46E3A7FD756FF003FFEAAC31213C67F -0CD7CBCDFBCCD2FD0D16BB63C93FD3FCFF009F4E223704F07F9D540734B536B8 -58B06638E334D321151019A7EC145920B24064CD34B135208BA714F11FBD1742 -BA457C134D2B9AB7F67C1E451E49C70697321DCA5E4F071FE7FCFF004A43028C -F007F4FF003C7E557BC920F3479471DA95D0AE51FB38ECA07A71FE7FC8A0C0A3 -3C01FD3FCF1F955FF24F718A045C74A2E82FE450FB38ECA07A71FE7FC8A0C0A3 -3C01FD3FCF1F955F30FB628110C517417F2287D9C76503D38FF3FE45060519E0 -0FE9FE78FCAB40C3ED8A4110C51742BAEC50FB38ECA07A71FE7FC8A5F2147F0E -3FCFF9FCAAFF0093ED8A410F1D3345D0EFE452100038181EDFE7FCE28FB30FEE -E3FA7F9FE9ED578C1ED8FD293CAE28BA0BF9148C3D78347D987F771FD3FCFF00 -4F6ABDE4E3B63EB49E57145D05FC8A461EBC1A516E011F2F4FF3FE7E9ED573CB -C1C7434D2800A2E82E4022C0F4A70400E69E46293A7F9FF3FE7F4AB8EE1FE7FC -FF009FFEB3D65DB8E3A7FF005BFC3FCF684BD35A4FC28B0D1752E768EB8FCFFC -FAFF009E9225E639C9CFBFF9FF003FCB2DE6DBD7351B5E2A773FE7FCFF009C1C -17B751A76370EA38E33DFB7F9FF38FC9A752C7B7E1FE7FCFE985F6C1CE073FE7 -FCFF009383EDAA07F9FF003FE7EB839BCC7CC6DB5FEE1D4E3DBFCFF9FE519BD3 -C8CFE7FE7FCFF2C737A3B039FF003FE7FCF07DB78E98FF003FE7FCF45CDE62BF -99ABF6C38C76F6FF003FE7F934DCF18FE46B2BEDA7FBBFFD6FF3FD3F20DE1F61 -FE7FCFE5F92BA25D8D3F3CFAE3DA9A6739EB9ACD176D9E41FF000FF3FD3F20DD -9CE781FE7FCFF9E8DB485A1A266CD2799ED59EB74491C7F9FF003FE7D2659F3C -9E3EA7A7F9FF003EC5C7A16B7FD693763A715107FF00F5D3C1AA56631DB78A36 -1CD008FA549FE7FCFF009FFEB01723F2CD062FA54CA07AD48001F4A9B93CC533 -6E07600FF9FF003FFEAA63DBF5F4AD028A3B827DA9850007B50A5625D9EE8CE6 -B7E0761D69860DBD31F5AD1651EC698C808AD14C8F6717B19A61C7151B47D38E -073D7FCFF9FD348A290298D1AFA67DAAF9C4E93E8663C5C1EDE9FE7FCF4FCA32 -98271C7E3D3FCF1F97E5A2F12E47F3FA7F9FF3DA07876F7C73F97F9FF3ED3ED0 -8F65E4571C72323BFF003FF3F87B70A1B07FFAFF00E7FCFE8A6300E06723FCFF -009FF385DA3B9FF3FE7FCFA66E772B92C207FF0027FCFF009FE46FC0EBFE7FCF -F9F4360E303EA3FCFF009FE8BB47AE3FCFF9FF003D337CA1C81BE9449839C74F -7A6EC03A0FA8FF003FE7FA28007F163D3FCFF9FF00087141C848920F503FC8FF -003FE7870901C761EA78FF003D3FCF68B278E4FE7D3FCFF4FC900C1CE40F4FF3 -FE7FC25C4BE5B1647E5FE7FCFF009E8F03903A7F4FF3FE7DAA292B8F6ED9FA7F -87E9F94B1CBB78F4FCBFCFF87E42858AB16401C9E9FE7EBFE7F948179A8524F7 -E99C76FF003D3FCF6983035AC628D158705CE69C131DA901A90303FE7FCFF9FD -34B5B60627960FAD288B238A7291E82A40695D917643E57D693663A75AB4BB4F -51CD1B41C76F5A5CC3B954838A424827A0AB0D1E0F230698508E94D30B909626 -937914F2829AC98CFA5515A0C693D7FF00D548640B9CF41DE865CD31E224F071 -FE7FCFF9E92EE80FB1FC0873E08F0F1FFA875BFF00E8A5A293C0636F81BC3A3D -34EB61FF0090968AFAB87C28C8F95FC750FF00C56FE22383CEA3707FF22B7F9F -C2B1C458EDFAD747E374CF8D35FF00FB085C7FE8C6AC61180335F2D36B999772 -01171D0D3D63C638FF003FE7FCFA4C13F3A50BC545C57646B1F4F5A788F0338E -DDAA50319EDD3F9FF9FF003D1A08005485836053838FF38A5E3009FF003FE71F -E7B34C9EFF008530BE31CE280D0901008C1FF3C5216F5E71EA7E95117FF269A6 -4A760270F8E9485FA719C54065F714D327B9FF003FE7FCF6760B32C072293CDE -9CF4F5FF003ED558CB8C9ED4865E71C51CA1CA5A12EDEF4D32FD6AAF998E7347 -99CF5E69D87CA5B12E3B914865F73557CCC739A3CCE7AF3E9458394B625C7F11 -14865F73557CCC739E28F339EBCD1641CA5A1291DF1FE7FCFE5479C7FC9AA9BC -0E7B52F99CF5E68B21F296BCC3EB49E760FA1FAD552E17BD279991EB8ED45907 -2964CD9EF8A61979FEB55CCC3B1E69A66EBEDEBC7F9FF3F81A059161A4C77C0A -617A81A6EFD31EFF00E7FCFE8D331EA48CFA63FCFF00907F03982E899A4E0F3F -E79A8E493071C11C9EBF5F7FF3FCA267E78EDDCFF9FF0038FCA32E0639FA76FF -003FE7F096C2E3DA4383D87F9FF3FE1DA22D93D703D8FF009FF23B63842738F6 -F4EDFE7FA7E4B9EF9C7E9E9FE1FE7B4BF310992473F97F9FF3C7E46707AFE20E -3FCFF9FC13D3FCE3FCFF009F6767BE71FA7A7F87F9EC3B210992473F97F9FF00 -3C7E46707AFE20E3FCFF009FC13D3FCE3FCFF9F6767BE71FA7A7F87F9EC3B201 -3248E7F2FF003FE78FC8CE0F5FC41C7F9FF3F827A7F9C7F9FF003ECECF7CE3F4 -F4FF000FF3D8764026491CFE5FE7FCF1F919C1EBF8838FF3FE7F04F4FF0038FF -003FE7D9D9EF9C7E9E9FE1FE7B0EC80404F07F1C7F9FA7E9F94AAD8E7FCFF9E3 -F4ED8F961F4FF38FF3FE7D9C1B1DC0FF003FE7FC8E1E8981695F1CE31FE7FCFE -5F94A1F83839FC2A92BF3C707F97F9FF003ECF0F85C76FAFF9FF0023F277B0D6 -85C120233FE45383E3A555F3BB6781C74C7F9FF3F8289F2393CFA0E3F9FD3FCF -67CC3B96C49F8D384B83E954FCE03BE31DFF003FF3FE78709C1279031EA71FE7 -BFF9E8EE8342E79BEF4864AABE7003A8CFB5299403C9C7D68D01244E64FC29A5 -AA033003391F876A4338E7FC71FE7FCFE05D0F4262C3D69AC79FE55099872324 -63D7FCFF009FC38699720E71F97F9FF23F2570B9233719FF003DFDFF00CFF285 -8E0761F8F4FF0038FF00F57643273E87FCFF009FC3B7666F031CFD3FCFF9FC3F -864911C71D3FCFF91FA7B70DCE0F5FC41C7F9FF3F82B3671C7FF005BFCFF004F -C8CF7CE3F4F4FF000FF3D96C026491CFE5FE7FCF1F919C1EBF8838FF003FE7F0 -4F4FF38FF3FE7D9D9EF9C7E9E9FE1FE7B0EC8426491CFE5FE7FCF1F919C1EBF8 -838FF3FE7F04F4FF0038FF003FE7D9D9EF9C7E9E9FE1FE7B0EC804C9239FCBFC -FF009E3F23383D7F1071FE7FCFE09E9FE71FE7FCFB3B3DF38FD3D3FC3FCF61D9 -00992473F97F9FF3C7E46707AFE20E3FCFF9FC13D3FCE3FCFF009F6767BE71FA -7A7F87F9EC3B2015246503A8F6FF003FE7FA4D1CDD86303DFA71FE7FCF4ADE9F -E71FE7FCFB38360E738FD3D3FC3FCF66EC87B17D5FF2FF00F5D481AA824A7A93 -CFD7FCFF009FD2C24B9049207E38FF003FE7F0A4EC34FA16439A7ABE3B81FE7F -CFF9E95C3FFF00AE9E1B155A31D8B21FD7F5A787C907AD560F4F0DFE7FCFF9FE -92D10D16548FC0FF00F5A82B919F6F4FF3E9FE7B42AF9EB522B7E55221193151 -94C74AB01F7707BD26D07F2A7B0FD0ACC991CFF9FF003FE7DA32873D2AD3260F -229863C552609D8FAE7C0BFF00224F87BFEC1D6FFF00A2968A5F038C782BC3FF -00F60FB7FF00D16B457D5C3E1449F3378D40FF0084CF5E1FF510B8FF00D187DF -FCFF002C603807FA7F9F43FE7A6B78DE6C78CF5EE7A6A13FFE8C6AC3328E3DAB -E567F1328980DA719FF3C7BFF9FE4D2C001DFF00C8A84CDC9E73C530C9EE6A2C -04E5B8C0A6192A032534BFE155CA3E5266931ED4C3201509703FC69AD263B81F -5346887644CD263BE2A37942F538A85A5EFC8F6CFF009FF3FA42F31EE71F8E3F -CFF9FC13905CB0D70067B7D47F9FF3FA46D7633C118FF3FE7FC9C562C4FD3D07 -6FF3FD3DB833DF38FD3D3FC3FCF696D8AE4A6E4B762BEDFE7FCF1F921B827BF1 -F5FF003FE7D3B4414F1C1FCFFCFF0091F93B69CF5C7F9FFEB7F9C707501E273E -E0FF009FF3FE780DC13DF8FAFF009FF3E9D9823E9D78FF003FE7FCE241092781 -C8F7FF003E9FFEAEC008273EE0FF009FF3FE780DC13DF3F8FF009FF3E9D9DE40 -03D076CFF9FF003FC9C20F700FF9FF000FF3C60EBA01179EDE983FE7FCFF009E -0370C7B8C7D7FCFF009F4ED3792319EC3B8E3FCFFF005BF270839E8303FCFF00 -87E5F9302B89DBD307FCFF009FF3C2999FD3F5FF003FE73D3B4FE4018C0C7BFF -009FF3FD17C95CF4C7E3FE7FC81E9C1A8EC56F39C0E847D7FCFB7F9EC9E69ED8 -C0E3FCFF009FCBB4E6103E9EDFE7E9F97E4BE4F27A0C7F9F5FA7E5F902B15BCE -7EF9F53FE7FCFF00826F3EDF507FCFF9FA71398C0EB903B71FE7DBFC8E1A5303 -AF23F0FF003D3FFD58E1088831FA7B7F9FF3C7B709B8E7AFE471FE7FFADEDC4A -531D87F9FF00F57FFABB3703E9FE7FFADFA76FE10633248E7F2FF3FE78FC8CE0 -F5FC41C7F9FF003F80576E3FCFF9FF003F82E7BE71FA7A7F87F9EC9D9084C923 -9FCBFCFF009E3F23383D7F1071FE7FCFE09E9FE71FE7FCFB3C03D73FD3FCF4FF -0038E076431B92473F97F9FF003C7E40EBC1FC41FF003FE47E522C600FF3FE7B -7F9ECF11E7038CFF009FF3F87E49B486910724720FF9FF00F57E9F92E083FD7A -7F9FFEB7B7168438238E9DC7F9FF003FC9CB081D0E3FCFF9FF003D1392EC3B14 -F071C8C7B7F9FF003C7B706D23FCE3FCFF00F5BDB8BFB06727AD1E58F414B9BB -21F2947CB6239FF3FE7FCFB2885F3C7E9FE7DBFCF6BC17B0A7043E945C2CBA99 -E627EE3A7F9FF3FE70BE4B8F6EFD71FE7A7F9ED7FCB23B51B0FA52E60B233CC6 -DDFF00CFF9FF003EC794C3DBBFF9FF003FFD6BF8A69407A8A77F20E5451DAC3B -E3F4FF003FE7D384C30F5FE5FE7A7E9EDC5F283D29BE5FBE28E6B740E5291DC3 -D47F9FFEB7E9EDC19653FE7FCFFF00ABDB8B4D1639C9FAE7FCFF009FD18D1E0F -4C63B7F9FF003C7E4F99136200C7E9EDFE7FCF1EDC1BCFA8FAE7FCFF0091EDC3 -D9003E9FE7FCFF009E8D3C1CE71FE7FF00ADFE71C55D5C43771F71EDFE7E9FA7 -E46E3EBF8E7FCFF91EDC27A7F9C7F9FF003ECECF7CE3F4F4FF000FF3D9BB2621 -013EE3DBFCFD3F4FC8CE0F5FC41C7F9FF3F827A7F9C7F9FF003ECECF7CE3F4F4 -FF000FF3D93B2013248E7F2FF3FE78FC8CE0F5FC41C7F9FF003F827A7F9C7F9F -F3ECECF7CE3F4F4FF0FF003D8764026491CFE5FE7FCF1F919C1EBF8838FF003F -E7F04F4FF38FF3FE7D9D9EF9C7E9E9FE1FE7B0EC804C9239FCBFCFF9E3F23383 -D7F1071FE7FCFE09E9FE71FE7FCFB3B3DF38FD3D3FC3FCF61D900992473F97F9 -FF003C7E46707AFE20E3FCFF009FC13D3FCE3FCFF9F6767BE71FA7A7F87F9EC3 -B2013248E7F2FF003FE78FC8CE0F5FC41C7F9FF3F827A7F9C7F9FF003ECECF7C -E3F4F4FF000FF3D8764026491CFE5FE7FCF1F919C1EBF8838FF3FE7F04F4FF00 -38FF003FE7D9D9EF9C7E9E9FE1FE7B0EC804C9239FCBFCFF009E3F23383D7F10 -71FE7FCFE09E9FE71FE7FCFB3B3DF38FD3D3FC3FCF61D900992473F97F9FF3C7 -E4E590A91C8FAFF9FF003F970CF4FF0038FF003FE7D9D9EF9C7E9E9FE1FE7B0E -C809926CF278CFE9FE7FCFB4CB371C903FC9FF003FE78A238C633F81E9FE7FCF -B48B2103AE07E5FE7FCFE157B0EF62F09453C3E3A1AA4B2F5E4FB907FCFF009F -D245978393F80E3FCF4FF3D9A9771DCB624FC69CB2F3E95544BC7BFD69E1FAFB -53BA61A32D2CB9F7A7898E467B553DF8EBD3D69DBFB679A2C9EC1CA5C128E948 -587AD560F4A24E7D28E51729F60F823FE44BD03FEC1F6FFF00A2D68A4F031CF8 -2BC3E7FEA1F6FF00FA2D68AFAB87C2883E5AF1D3FF00C56DE20EDFF130B8FF00 -D18D585E61F5AD4F1E4C078E3C43DB1A8DCF7FFA6ADFE7FCF182D3F04E707F4F -F3FE7E9F2F37EF334562C17F7E948CF8CD563375E4F1ED8FF3FF00EBFC1A643F -E49FF3FF00EAFCB3E60B960CBC13FE7BD31A5E3F3EFF005F7FF3FCA03264939E -7F97F9FF003ECDDE07B7E9FE7FFADF94B617266979F43DF1FE7FCE3DB88DA5E4 -E4F3FCBFCFF9F688B13FE03B74FF003F87E4B9EF9C7E9E9FE1FE7B0DD841BCFA -63DBFCFD3F4F6E13383D7F1071FE7FCFE005CE38C0FE5FE7FA7E52AA1FC7F2FF -003D3FCF6181185247391FE7FF00ADFA7B71204C7A7AF5FF003E9FE7B4A23C76 -231DF1FE7DBFCF491630B903F2CFF9FF003FA16EC088563FD3F0FF003D3FCF69 -0458C7383EC3FCFF009FD2509D3DA9D8AAB1497723D99FC7FF00AFEF4BE58C60 -703B0F4A942D3BCBF7A7641A110403B62942E2A511D3C29F7FF3FE7FCF67A05D -2210B4BB08A9F6534AE051717310953498C54C40CF207F9FF3FE7B34AE69DC77 -22C5215C8FF1A795E6928B219115033DBF1E9D6919727D4FAF3FE7FF00D5529A -69EBEFE950D0AC880E477383CFF9FF003FFD68D8639E9F8F4FF38FFF0056389D -F380338FF3FE7FCF485B85F4E7A7F9FF003C76C712491B8E3E9FE7FCFD3DB866 -707AFE20E3FCFF009FC1CFD318FF00EB7F9C7F9C708393D7FCFF0091FE7B2F50 -05C9C13C0F7FF3FE71EDC4CB1F418FCBFCFB7F9EC91AE075C11E9FE7DBFCE38B -28A07D6A1B2A28458F07269C001F4A5029C149FA5417B094BB0E71522C79C7AF -F9FF003FE789447C7503FCFF009FF3D015C80479EBD7FCFF009FF3C4AB111D06 -7FCFF9FF003D2C2C617FCFF9FF0023F29122C74038EC3FCFF9FE5371A8B65710 -60F3D3FCFF009FC3F2912DF04639FC3FCFF9FD2D2404E303B763FE7FCFD2A74B -7153CC5F225B943CAC0E9C01FE7F97F9ECC36E0100F6FF003FE7FCE350DB8ED5 -13C0036714290F962F6331A0FA7E3FE7FCE3F288C5C671818FF3FE7FC8D23091 -8FF3FE7FCFE11B45D7803FCFF9FF003D29321C1A339A3C038FF3FE7FCFB34AE0 -D5E688139E7F3FF3FE47E5032607FF005FFCFF009FD2932762B62908C8A9593D -3FCFF9FF003ECD208A0640C98071C0F4FF003FE7FA42EB83E9FD3FCE3FCF6B78 -A8E45E3DCFA534EC26B429B7048FF3FE7FC3F24CE0F5FC41C7F9FF003F84922F -2739FF003FFEAFF3D999EF9C7E9E9FE1FE7B69A19B13248E7F2FF3FE78FC8CE0 -F5FC41C7F9FF003F827A7F9C7F9FF3ECECF7CE3F4F4FF0FF003D9BB210992473 -F97F9FF3C7E46707AFE20E3FCFF9FC13D3FCE3FCFF009F6767BE71FA7A7F87F9 -EC3B2013248E7F2FF3FE78FC8CE0F5FC41C7F9FF003F827A7F9C7F9FF3ECECF7 -CE3F4F4FF0FF003D8764026491CFE5FE7FCF1F919C1EBF8838FF003FE7F04F4F -F38FF3FE7D9D9EF9C7E9E9FE1FE7B0EC804C9239FCBFCFF9E3F23383D7F1071F -E7FCFE09E9FE71FE7FCFB3B3DF38FD3D3FC3FCF61D900992473F97F9FF003C7E -46707AFE20E3FCFF009FC13D3FCE3FCFF9F6767BE71FA7A7F87F9EC3B2013248 -E7F2FF003FE78FC8CE0F5FC41C7F9FF3F827A7F9C7F9FF003ECECF7CE3F4F4FF -000FF3D8764026491CFE5FE7FCF1F919C1EBF8838FF3FE7F04F4FF0038FF003F -E7D9D9EF9C7E9E9FE1FE7B0EC804C9239FCBFCFF009E3F23383D7F1071FE7FCF -E09E9FE71FE7FCFB3B3DF38FD3D3FC3FCF61D900992473F97F9FF3C7E46707AF -E20E3FCFF9FC13D3FCE3FCFF009F6767BE71FA7A7F87F9EC3B2013278EA0F5FF -003FE7B7E4A1F1E87DF38FF3FF00D6F6E1BE9FE71FE7FCFB3B3DF38FD3D3FC3F -CF67A201EB29031C8F63FE7FCFF270907B71E9DBFCFF009C7683D3FCE3FCFF00 -9F67679CE71FA7A7F87F9EC3D009C4983E9FD3FCFF009E9C384C7E9F8FD7FCFF -009E2A8246319E3DFA74FF003F87E4BBC8EE3F97F9FF003E9C0C7B1704BC7BFF -009FF3FE78779A07F10FF0EBFE7F0AA21CFA7FF5BFCFF4F6E1C24C0EB81F97F9 -FF003F817B05EC7DA7E0439F04787BFEC1D6FF00FA2968A6F804E7C0BE1C27A9 -D36DBAFF00D725A2BEBA1F0A20F92FC7EE7FE13BF11FFD84AE7FF46B7F87F9C7 -181BCFA8FAE7FCFF0091EDC6F78FD33E3BF119FF00A895CFFE8D6FF0FF003DB0 -7A1E4E0FE5FE7A7F9EDF2951DA6CB1371F71EDFE7E9FA7E46707AFE20E3FCFF9 -FC13D3FCE3FCFF009F6767BE71FA7A7F87F9ED9BB5C426491CFE5FE7FCF1F919 -C1EBF8838FF3FE7F04F4FF0038FF003FE7D9C324E73FE7FC8FF38E076431393F -E1FE7FCF1F93D531DFEBDBFCF4FD3F27226381C63FCFF4FD3F29513231D31D40 -CFF9FF00F57E4EC80458F039C7F9FF00F57F9ED288874E3D07F9FF003D294670 -0E7007AFD29E3BD521A40100E9C5380A0528AB48A142E453C0DBFE7FCFF9FD18 -3B1A93FCFF009FF3FF00D64C96285CFF009FF3FE7F4784C5301C7F9FF3FE7F47 -2B6303352C96481734E0A00193EFD3FCFF009FD2307D0D21931EB522242063FA -D30F14D2F4D2C7D7FCFF009FF3E8EC161CC467934CFF003FE7FCFF00F59A5E9A -5FF0AA48A4873104530919A4CD216C7D7D2A8A14D318FA75A477C531E4C139FE -63FCF6FF003DA5BB85C1980C91C7F93EFF00E7F942C70076FC7A7F9C7FFAB1C3 -99FBE790303F3FFEB7F9ED0960BEDFA7F9FF003D3F862E48D7EB8FD3FCFF009F -A638746064E7F4FF003EDFE71C47E9FE71FE7FCFB4C8A7F1E9FE7FCFF2E13027 -8C73D3FCFF009FF3E928A62E42F3C7F4A92B3B1A200335305C7F9FF3FE7F4C81 -E20B3FED9FECD0F9987CACF901164DBBD62C93CC85033ED504855DCDB4326ED8 -EFE9FE7FFADFE7B3E56B71364D18C01FE7D3FCFF009E265C63AFF9FF003FE7D2 -BC6D839EF522BF1E94B904A562CA84CE7A55950A07AE3DFF00CFF9FD28AB01DF -F5FF003FE7F4952624019FD7FCFF009FD21C0DB9D17C7031E94E15512719E3FC -FF009FF3ED32CC3183D6B27162BA2534878A6B4A013ED513CF8FEBFE7FCFF3C2 -482E87498E73FE7FCFF9F6AF21193C631DFB52493679C9F4233FE7FCFE913C84 -9E3AFF009FF3FE78D54039D206C7618FF3FE7FCF48D803EFFE7FFADFE7B2EF04 -F5FF003FE7FCFA33381EF5A28A3394D32271DFF5FF003FE7FA44C99E83FCFF00 -9FF3E93B0C9FCAA3C63FCFF9FF003FA5A89372B9148454CC9DE9ACB834F90BB9 -5A48B2A7B0FF003FE7FCF159E2287D3BF5FF003E9FE7B6815A6B2739A6A3625A -28F96C7AE7FCFF009FF38E13663BE3D7B7F9E9FA76C7174C7923D7D697600381 -81E98A2C2B14BCB3DF3F97F9FF003FA26CC77C7AF6FF003D3F4ED8E2E98F247F -3A5D800E0607A5160B14BCB3DF3F97F9FF003FA0233EB8F5EDFE7A7E9F95C31E -48FE74BB00E8303D28B740B14BCA3DF3FE7FCFF9EC79447703B9C1FF003E9FA7 -E570C79F73EB4BB31D0607A628E5E816297947BE7FCFF9FF003D8F288EE07738 -3FE7D3F4FCAE18F3EE7D697663A0C0F4C51CBD02C52F28F7CFF9FF003FE7B1E5 -11DC0EE707FCFA7E9F95C31E7DCFAD2EC03A0C63B63FCFA51CBD02C52F28F7CF -F9FF003FE7B1B307AE3D71FE7DBF4F6E2E18FF003F5FF3F4A0C608C7207A0E28 -B740B14FCB3DF3F97F9FF3FA26C23BFD7B7F9FFEB7B716CC7839FD49FF003FE7 -F40460718C7B6EFF003FE7F42C2B150A9EFF00E7FCE3F4F6E13691FF00D6E3FC -FF00F5BDB8B4533C93F8FEBFE7FCE13CAE0F0323B0FF00F5FF009C7E4580AD83 -8E463DBFCFF9E3DB8420AFB7BF4FF3FF00D6F6E2C18F1C9C81DBFCFE5FE470D2 -84771C7E1FE7A7E9F92021C9239FCBFCFF009E3F23383D7F1071FE7FCFE1294F -6CFD3FCFB7FF00ABF85A57DF1FE7FF00ADFA7E400CC9239FCBFCFF009E3F2338 -3D7F1071FE7FCFE0A531DBA7F9FE9FA7E467079383F97A7F87F9EC3B2013248E -7F2FF3FE78FC8CE0F5FC41C7F9FF003F827A7F9C7F9FF3ECECF7CE3F4F4FF0FF -003D8764213248E7F2FF003FE78FC819CF1F8907FCFF0091EDC27A7F9C7F9FF3 -ED283C7F9FF3DBF4ED8F95D90CFB43C019FF008413C379183FD9B6DC7FDB25A2 -8F008C7817C39DBFE25B6DFF00A2968AFAE87C0883E4DF1F1FF8AEBC47FF0061 -2B9FFD1ADFE1FA7B7CBCFB376CF4F7C63FCFF4FCB7FC7ED8F1D788FB9FED2B9F -FD1ADFE1FA7B71CFE79CE71FA7A7F87F9EDF2753E377284C9239FCBFCFF9E3F2 -3383D7F1071FE7FCFE09E9FE71FE7FCFB38649CE7A7F9FE9FE71C43B218282C3 -9E3FCFF9FCBDB8900F4E3F4FF3D3F4ED8F953A7F9FF3E9FA76C7CAE51804E791 -DBA76FC3D3F4ED8E180F5F9463A7AFF9FF003FE122A8DB8E3F0E9FE7FC3F28FB -939E7D7F1FFEB7F9C71283BB9C01FE7FFADFE7B0085523071C77FA75A78EA6A3 -C918FF003DBFCFF9E8FCE73CFE1548698EA5A66EC75E9EB4ECD52658EA706E78 -14CCD19A7B8AC4A1B8CFF9FF003FE7E8A1B07AE0FF009FF3FE788B38A379F5A2 -C4D894BE7A938FF3FE7FCF0D2F83D2A327029377BF34683B0F2F91485A985BF2 -F5A4DD9EF4AF61E83F3485AA367EF4D6970C7DBDFF00CFA7F9ECB98571E5F83C -FF009E6918E33CE075C9A8CC9C75C63FCFF9FF0038617E3AF3E9CFBFF9FC3B63 -896C571ECD8CE381EBFE7FCF1F946CE473DFD73D3FCE3FFD5D9A589393FE7FCF -F4ED8F9585C0E840FF003FE7FC8E15C42B39CF3927FCFF009FF3C333CF5FC73F -E7FC8FC93D3FCE3FCFF9F67679EB8FD3D3FC3FCF65B00A9D32720FF9FF000FD3 -F2997B76E3DB8FF38FF3DA241D074FE9FE7FA7B712AF181FA74FF3FF00D6FC9D -BB0AE4C08038C01FFEBFF3FE782E5666B7956DE48E29CA1113CA85D55B0704A8 -20900E380467D4766E7B927233FE7FCFFF00AA4CF5EDEBCFF9F4FF003DAD446A -479DEB16F06A7A343E1CB696F748D5D321B48B39626791CB06172D3CB13B7961 -C6F17230DB89C8336106F69BE12F1045651ADFF8E754B9BB19DF2DB59D9431B7 -27184681C8E31FC47A678E83A7DDD3D69C1C8FC3D2B772D2C905EE608F0AEA9D -478CF5BFFBF363FF00C8DFE7F93878575403FE473D6FFEFCD87FF2356F87C63B -0F7E3B53C107FCFF009FF3FA66DBFE92168607FC227AA7FD0E9AE7FDF9B0FF00 -E46A5FF845355FFA1D75CFFBF361FF00C8D5D0070327F5FF003FE7FA3C38E327 -9A9BBFE9220E747853551D3C6BAE8FFB6361FF00C8B50E9E754D13C6FA7E9F3E -BF7FABD9DD69D7770D15EC56EBB648E5B6552A62890F495C1049EDE95D5039F7 -ACE9F46F3FC4B61AB79DB7ECB69716BE4EDFBDE6BC0DBB39E31E4E318E777518 -A6B5D25F90AE56F1F6A97B67E1E56B1BC92C6E66BEB2B617312A33C6B2DDC31B -950EACB9DAED8C823DB81880F85B55E71E36D77A7FCF1B0FFE46FF0038AD1F10 -E8DFDBD6115B79DE46CBBB5BADDB3767C9B88E6DB8C8EBE5E33DB39C1C62B4A8 -51E58A4BF2F40B9CCFFC229AA83FF23AEBBFF7E6C3FF009168FF00845355E3FE -2B5D778FFA6361FF00C8D5D2D14AEFCBEE417399FF00845355C7FC8E9AE63FEB -8D87FF0022D21F09EA9FF43A6B9FF7E6C3FF0091ABA6C5251CCFFA482E7327C2 -7AA7FD0E7AE7FDF9B0FF00E46A9F4EF0F5FD95E473CDE26D535089339B6B98ED -1637E08E4C702371D7861C81EE2B7C8CD33A01F4A399FF00491498DE9FE7FCFF -009FD0C7E1FE7FCFF9E8FC024FF9EF4D2318FF003FE7FCFE0AE55C632E4D34AE -0FFF005EA5DA7FFD5FE7FCFF0024C63DBFCFF9FF003D1DC7722DA7D29318A970 -3D07F9FF003FE7B18FF3FE7FCFF4771DC8F69F4A4C62A5DA076FF3FE7FCFA18F -F3FE7FCFF42E1723DA7D28DB526D03B7F9FF003FE7D17FCFF9FF003FFD62E172 -2DA7D28DB52EDCF6FF003FE7FCFA18C7B7F9FF003FE7A2B85C8B69F4A369A976 -E7B7F9FF003FE7D0C63DBFCFF9FF003D0B85C8B068DA6A5DB9EDFE7FCFF9F431 -8F6FF3FE7FCF42E1722C1A36E2A5DB9EDFE7FCFF009F4318F6FF003FE7FCF42E -1721DB462A5DA09E9FE7FCFF009F40A82681DC876D359320D4C5290A63FCE28B -20D0876633818A42993DBD8D4B8A314582C88197AF51DFFCF3FE7F931A323031 -9FA76FF3FE7DAC15FCE90AFB0A9B058AA53F0FF3FE7F2F6E1A571D7F43FE7D3F -4EDFC36581C75C81FE7FCFF9C34C7D80DBED9FF3FE7F49B125565C7F87F9FA7E -9EDC37A1EB8F5E71CFF9FF003E965A3C762BE9C7F9F6FF002388D971D78FF3FE -7F2F6F950116491CFE5FE7FCF1F939580E323EB9FF003FE7D31C34A6DC71F976 -FF0038FD3F25CF7CE3F4F4FF000FF3D8D108FB4FC03C7817C39DBFE25B6DFF00 -A2968A4F87FC780FC37DBFE25B6DFF00A2968AFAF87C2893E4AF1F9CF8EFC49D -7FE42573FF00A35BFC3F4FCB07383D7F1071FE7FCFE1BDF103FE47CF1277FF00 -8995CF43FF004D5BFCFF009E30B3DF38FD3D3FC3FCF6F93A96E7650992473F97 -F9FF003C7E4F5E075F7FF3F97E9EDF2C7E9FE71FE7FCFB38363B81FE7FCFF91C -43B201FD3DBFCFFF005BF4ED8F9554ED3FE7FCF6FD3B63E5607F63FE1FE7FA76 -ECBB87AE3F4FF3FE7A7F0B0260D9EFF5FF003FE7FC1338F41F88E3FCE3FCF68C -11EBD3FCFF009FE98F95431C7078FF003FE7FC31F28326DF8ED8FA67FCFF00FA -BF27165FEF81FD3AFF009FC2A0DE739CF3EA7FCFF9C76C7CA6FC0C6303EA7FCF -FF00ABF200B1BF8EBFE79F7FF3FC9C4D56DFCE4F5F5FF3FE78F6E0DE00F4F6FC -FDFF00CE3B6380772CEF18EB8FAF6EB4ECF5AADE6F04648C7F9FF3FE70865C83 -9C67E9FE7D3F4FC9DC772C1938C8FF003D694B73558CA41E09C7D7FCFF009FD1 -BE66D1D80FAFF9FF0023F22E2B960C9819FF003DFF00CFF9E11A4038CFA9FE7E -FF00E7F941E6E4F519FAFF009FF23B766F99818DD81FE7FCFF0087F0A15C9CBF -278FC79FF3FF00EAFC9AD27AF1F43FE7FCFE911933CE493FE7FCFF009E13781E -DFA7F9FF00EB7E45C094C98EE7D7FCFF009FE5C377E3A6063F4FF38FD3B768F7 -FA0FD7A7F9FE9F926F23B81FA7F9FF003E9C17B0890924E49E7DFF00CFF9C76C -7CAD2E0743FAFF009FF23B768FD3AF1EFD3FCFF9F6767BE71FA7A7F87F9ECB60 -1371239E3DBFCFD3F4F6E0CE0F5FC41C7F9FF3F827A7F9C7F9FF003ECECF7CE3 -F4F4FF000FF3D9BB00992473F97F9FF3C7E403CF5E3B907FCFF91DBB2703F0FF -003FE7FCE141C9CFB7F9FE5FFEAECEC26EC3D7A8F5F4FF003F4FD3DB89178C1F -6FF3FCBFCF68F38EF8FF00F5FE1E9FA7B70A080BFA7F9FF3FF00D6D628CDBB13 -838C763FE7FCFF009E1C0F4FE7FE7FCFF48C392719FF0039A407FCE2B551B19B -958977FE07EBFE7FCFE8B9E9E9FE7FCFF9E22DE78A334EC2E725DFD7B1FAFF00 -9FF3FA3FCC27F1EF9FF3FE47E506E39A33F851CB70E72CAC9EDB7F1FF3FE7F47 -EFC73DBAE7FCFF009E3B76A9B8FF004A707208ED8F4FF3ED56A999F396C4C475 -C839F5FF003FE7F4709B8E848F5CFF009F7FF3D29F987D7FCFF9FF003E8F071D -F18FF3FD3FCF6D552443A8CB9E6F273C1F43FE7FCFF23CE18CE78FFF005FBFF9 -FE553767A1FF003FE7FCFA2862BD3FCFF9FF003ED5EC9095468B7BFEBFE7FCFF -009ECA641EBFE7FC8FF3DAA7987AF7FA7F9F4FF3D9C24381DB1EFF00D3FCFF00 -864E91A2A8590C051B8719E3FCFF00F5AA1F33272739F5FC7FCFE5F93B7F1907 -1F4FF3FE7F966E99AA9A25A4C77A6E467DFD73FE7FC8FCA40781CF359381698D -DBEF4817152520151CA3B8CC7BD01714FC518A96AC3B8DC7BE6902E29FB6802A -5AB1571B8F7A40B8A97CBEFDFD0D01695C7A91E3DE902E2A5F2FE9F4A02D170B -323C7BD017152797F4FA50168B85991E334600ED52F97CF349B7E9405AC478CD -1B40EC2A5F2F9E6936FD2985AC478CD1B40EC2A5F2F9E6936FD2905AC478CD21 -4153797CF3498C8A61B10ECA6E08FF003FE7FCFE960C7F81A6EDEF45C362065E -C7FCFF009FF3ECD29539519F7A694C0AAB8D3202B4DC62A72BD7B8FF003FE7FC -F0D233FE7FCFF9FD1DCA4C8714D2B9FE99A999714D2B8A2C8AB909403DA9A621 -9E0E3D303A7F9FF3ED3914D229342B22A15F4E3FCFF9FCBDB863263DBE87FCFA -7E9F95B6040F4C67A530C7D401B71DB3FE7FCFE916158FB23C0231E04F0E0FFA -86DB7FE8A5A297C0600F0378740E9FD9D6DFFA2968AFAE87C08CCF923C7E7FE2 -BBF1275FF9095CFF00E8D6FF003F87E5839C1EBF8838FF003FE7F0E87C7CA0F8 -EFC467FEA2573DFF00E9AB7F87F9ED83B467D3FCFF00F5BF4EDDBE4EA7C6CB31 -FC4D71A8DA68D3DCE9CE8B3DBAB4CD1B59B5D34AAAA4948D1648CEE38007CDDB -18FEEF3577E39BAB1D13438E4BCB2935AD47CC2F25AD9CF2247E5FFADD96E184 -AECAC5232995704B395023655EC355D326D42DD63B7D4AEB4B756DC66B458998 -8C11B4F988C31DFA03F2F51C819DFF00088241616F059EA173A7DCC4F2B9BE86 -385A773236F9B3E646CA03C9F390AAA32AB8C05C0B8B82566845AF0FEA126A9A -3DBDC4CF0C92B6E0CD006552558A9F91BE68CFCBF346794605493B7354F5CD4B -501ACD8695A64D6B6B3DC4135D35CDD42D328589A25D8115D0E49981CEEE3674 -E72B661D01F4ED14D869F76F6D2B333B5DBA2BC9B9E42F2C98385DEC59D871B5 -49FBBB46D06B3A0FF6A5C5BDCC57F75A5DEDBABC497368232DE5B942E9B64565 -C131A1CEDC8D83040C8A9F754AFD004F0C6AB36B3A2413DCAA25DA3496F72220 -4279D13B45214C9CECDE8DB73CE319C1E9AB9C1EBF8838FF003FE7F0A5A36950 -E89A5DB58C05E448530649083248DD59DC8C65D9B2CCDDC927E97B3DF38FD3D3 -FC3FCF6995AFA2D004C9239FCBFCFF009E3F233CF5FC41FF003FE47E49E9FE71 -FE7FCFB3B3DF38FD3D3FC3FCF6976402027DC7B7F9FA7E9F91B8FAFE39FF003F -E47B709E9FE71FE7FCFB3B3DF38FD3D3FC3FCF61D9301013EE3DBFCFD3F4FC8C -F3D7F1CFF9FF0023F24F4FF38FF3FE7D9D9EF9C7E9E9FE1FE7B0EC804C9239FC -BFCFF9E3F23383D7F1071FE7FCFE09E9FE71FE7FCFB3B3DF38FD3D3FC3FCF61D -900992473F97F9FF003C7E46707AFE20E3FCFF009FC13D3FCE3FCFF9F6767BE7 -1FA7A7F87F9EC3B2013248E7F2FF003FE78FC8CE0F5FC41C7F9FF3F827A7F9C7 -F9FF003ECECF7CE3F4F4FF000FF3D8764026491CFE5FE7FCF1F919C1EBF8838F -F3FE7F04F4FF0038FF003FE7D9D9EF9C7E9E9FE1FE7B0EC804C9239FCBFCFF00 -9E3F23383D7F1071FE7FCFE09E9FE71FE7FCFB3B3DF38FD3D3FC3FCF61D90099 -2473F97F9FF3C7E4671DFEB8FF003FE7F927A7F9C7F9FF003EC8C727AE7FCFF9 -FF003D1E80DD85EFCFF9FF003FE7D9471E9FE7FCFF009EC9FE7FCFF9FF00EB28 -FAF4FD3FCE3FCF6D628890E1F5FF003FE7FCFA2AB1073E9FE7FA7F9EC99F7FF3 -FE7FCFA0A707AE3FCFF9FF003D378D8C58FE6954E4526393FE7BD20F940AB321 -F4B49D68A421696928A6988751480D19AD548561C0D381C7438A6519ADE3222C -49BBD697775C7F3151E68CF39AAE6158977F1E9FE7FF00ADFE7B2E707AE08FF3 -FE7FCE21CD3F78CFA543907292A9C639C73FE7FCFF0090F56C01CE07F9FF000F -D3F2855C8239E7EBF4F7FF003FC9EAE001CE08FF003FE7FCE327234489C3E383 -91FE7FCFF91C3C3E01F6FF003FE7FCE200C0639C7E3FE7FCFA76507BF4C7F9FE -9FA7B71849D8DE25ADDCE08C7F9FF3FE7A0181E86AB86C7B1F53D3FA7F9FD1C1 -B031FE7FCFF9FA64D9AA44D9A37545BE977F1D79ACDB1D89734679FA5337668D -C3FF00D750DDC762556031FE7D3DE90B0C7AE3FF00AD51E452E6A4AB8F0D8C63 -F9FD28DDEBCE3DFE951D2E6801E1B1D3FCF4A377E38FFEB5474B9A00786C74FE -7F4A377E38FF00EB5474B9A00786C74FE7F4A377E38FFEB5474B9A00786C74FE -7F4A377E38F7FA5474138EB401206C74FE7F4A377E38FF00EB5479CD04E3AD00 -481B1D3FCF4A427047722999CD04E3AD002D34B6297229A4F1CD304049039A67 -F9FF003FE7FF00AC1393FE7FCFF9FC8FF3FE7FCFFF005A90C461C1FF003FE7FC -FE0D3C66958E7A5239A650DA4A28AA286B0C8A6B0CF19A7D34F5F7F4A8067D8B -E04FF911FC3DFF0060EB7FFD14B451E04FF9123C3DFF0060EB7FFD14B457D5C3 -E14627CA1E3DFF0091EFC44B9EBA95C1FF00C8A7FC7FCF18E7D54315EDB867E9 -D3FC7F4FA60A2BE567F1B36515FD7C8681C27FB583F4E9FE23F2FA61179C76CE -3FF65FF11F97D30515162582F38ED9C7FECBFE23F2FA605E71DB38FF00D97FC4 -7E5F4C1453B0861EA3DF07F97F88FCBE98407A76CE3FA7F8FE9F4C1453E5562A -C801CE3DFF00FADFE23F2FA6007A76CE3FA7F8FE9F4C1451CA876400E71EFF00 -FD6FF11F97D3003D3B671FD3FC7F4FA60A28E5416400E71EFF00FD6FF11F97D3 -003D3B671FD3FC7F4FA60A28E5416400E71EFF00FD6FF11F97D3003D3B671FD3 -FC7F4FA60A28E5416400E71EFF00FD6FF11F97D3003D3B671FD3FC7F4FA60A28 -E5416400E71EFF00FD6FF11F97D3003D3B671FD3FC7F4FA60A28E5416400E71E -FF00FD6FF11F97D3003D3B671FD3FC7F4FA60A28E5416400E71EFF00FD6FF11F -97D3003D3B671FD3FC7F4FA60A28E5416400E71EFF00FD6FF11F97D3080648FC -3FA7F8D1451CA85CA980E71EFF00FD6FF1FF003D96319E7BF5FE5FE3FA7E4515 -6B7339A49683C0E3AF607F3C7F8FE9F4C18208E7D3FA7F8D1456F15A18C850F9 -C7F9F4A40DD38FF3C5145686561CAD9FF3F4A751454B25852D145210668CD145 -002D28A28ADA2890A28A2AEC20A01C1145159C868915483807A60FF2A729231C -FA7F4A28ACA5A1D29214312067FCF4FF00EB7E5F4C381C81DB2323DBFCF1F97E -4515932E290E56E011C7F9FF00F57E54F53B8F1C7A51454335495870E71FE7D2 -81CE3FCFA514548201CE3FCFA50A718C7F9E945140C50C4E33FE7A501BA71FE7 -8A28A560B0A1F38FF3E9481BA71FE78A28A2C164287CE3FCFA5206E9C7F9E28A -28B0590A1F38FF003E9481BA71FE78A28A2C164287CE3FCFA5206E9C7F9E28A2 -8B0590A1F38FF3E9481BA71FE78A28A2C164287CE3FCFA5206E98E3FC8A28A2C -160DC4E3FCFA5018F18FF3D28A280B06E271FE7D290738FF003E945140580738 -FF003E94D638028A2982DC696CD2514551621A28A290D094841F5A28A2C80FB1 -3C0BFF00224787BFEC1D6FFF00A2968A28AFA987C28C0FFFD9> -%%EOF diff --git a/Docs/InstallGuide/SOURCE/building.tex b/Docs/InstallGuide/SOURCE/building.tex deleted file mode 100644 index 5685d0037..000000000 --- a/Docs/InstallGuide/SOURCE/building.tex +++ /dev/null @@ -1,404 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Chapter file -%% -%% Written by Michael Basler % Bernhard Buckel, starting September 1998. -%% -%% Copyright (C) 1999 Michael Basler (pmb@knUUt.de) -%% & Bernhard Buckel (buckel@wmad95.mathematik.uni-wuerzburg.de) -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Building the plane: Compiling\index{compiling} the program\label{building}} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\markboth{\thechapter.\hspace*{1mm} BUILDING THE -PLANE}{\thesection\hspace*{1mm} COMPILING UNDER LINUX} - -This central Chapter describes how to build \FlightGear on several systems. In case you -are on a Win32 (i.\,e. Windows 98 or Windows NT) platform you may not want to go though -that potentially troublesome process but instead skip that Chapter and straightly go to -the next one. (Not everyone wants to build his or her plane himself or herself, right?) -However, there may be good reason at least to try building the simulator: - -\begin{itemize} -\item In case you are on a \Index{UNIX}/\Index{Linux} platform there are supposedly no -pre-compiled binaries\index{binaries, pre-compiled} available for your system. We do not -see any reason why the distribution of pre-compiled binaries (with statically linked -libraries) should not be possible for \Index{UNIX} systems in principle as well, but in -practice it is common to install programs like this one on \Index{UNIX} systems by -recompiling them. - -\item There are several options you can set only during -compile time. One such option is the decision to compile with -hardware or software \Index{OpenGL} rendering enabled. A more -complete list goes beyond this \textit{Installation and Getting -Started} and should be included in a future -\textit{\Index{\FlightGear Programmer's Guide}}. - -\item You may be proud you did. -\end{itemize} - -On the other hand, compiling \FlightGear is not a task for novice users. Thus, if you're -a beginner (we all were once) we recommend postponing this and just starting with the -binary distribution to get you flying. - -Besides, there have been two branches of code starting from version 0.6. For more -details, see Section \ref{branches}. This description generally refers to the stable, -even-numbered branch. It is almost certain, that odd-numbered versions require -modifications to that. - -As you will note, this Chapter is far from being complete. Basically, we describe -compiling for two operating systems only, \Index{Windows 98/NT} and \Index{Linux}. There -is a simple explanation for this: These are just the systems we are working on. We hope -to be able to provide descriptions for more systems based on contributions written by -others. - -\section{Compiling\index{compiling!Linux} under \Index{Linux}} - -If you are running Linux you probably have to build your own -\Index{binaries}. The following is one way to do so. - -\begin{enumerate} - -%%Bernhard 25.06.1999 - -\item \FlightGear needs some supplementary libraries which are usually - not contained in any distribution we know of. These are: - - \begin{itemize} - - \item{{\em plib}} which is absolutely essential for the building - process. Get the latest version of {\em plib} at - \web{http://www.woodsoup.org/projs/plib/} and follow the - instructions contained in README.plib. - - \item{{\em gfc}} is only needed if you want to build the scenery - generation tools but it doesn't hurt to have it installed. It can - be found along with the building instructions at - \web{http://www.geog.psu.edu/~qian/gfc/index.html}. - - \item{{\em gpc}} which is also needed for the scenery generation - tools. Get it from - \web{http://www.cs.man.ac.uk/aig/staff/alan/software/}, building - instructions can be found in README.gpc in your \FlightGear source - directory. - - \end{itemize} - - Now you are ready to proceed to the task of getting, compiling and installing \FlightGear itself: - -\item Get the file \texttt{FlightGear-x.xx.tar.gz} from the - \texttt{source} subdirectory under - - \web{ftp://ftp.flightgear.org/pub/fgfs/Source/} - - \noindent - -\item Unpack it using : - - \texttt{tar xvfz FlightGear-x.xx.tar.gz}. - -\item \texttt{cd} into \texttt{FlightGear-x.xx}. Run: - - \texttt{./configure} - - \noindent -and wait a few minutes. \Index{configure} knows about a lot of -options. Have a look at the file \texttt{INSTALL} in the -\FlightGear source directory to learn about them. If run without -options, configure assumes that you will install the data files -under \texttt{/usr/local/lib/FlightGear}. - - -\item Assuming configure finished successfully, simply run - - \texttt{make} - - \noindent -and wait for the make process to finish. - - -\item Now become root (for example by using the su command) and -type - - \texttt{make install}. - - \noindent -This will install the \Index{binaries} in \texttt{/usr/local/bin}. - -There is a problem concerning permissions under Linux/Glide. All programs accessing the -accelerator board need root permissions. The solution is either to play as root (this is -{\em bad} practice and not always possible) or make the \texttt{/usr/local/bin/fgfs} -binary \texttt{setuid root}, i.e. when this binary is run root privileges are given. Do -this by issuing (as root) - - \texttt{chmod +s /usr/local/bin/fgfs}. - - \noindent - - Again, this is a quick and dirty hack. The perfect solution for this - problem is using a kernel module called {\em 3dfx.o}. It is available - along with documentation at \web{http://www.xs4all.nl/~carlo17/3dfx/index.html} - and it might be a good idea to read some of the Quake-related links there! - - To install this kernel module, just download it, become root and - issue the following commands: - -\texttt{mkdir dev3dfx} - -\texttt{cd dev3dfx} - -\texttt{tar xvfz ../Dev3Dfx-2.7.tar.gz} - -\texttt{make} - -\texttt{cp 3dfx.o /lib/modules/`uname -r`/misc} - -\texttt{mknod /dev/3dfx c 107 0} - -\texttt{insmod 3dfx} - -It is a good idea to put the last line into one of your bootup scripts! After having -installed this module, you can even go ahead and remove the S-bit from {\em all} programs -that need access to your 3D hardware. - - -\end{enumerate} - -\section{Compiling\index{compiling!Windows 98/NT} under \Index{Windows 98/NT}} - -\begin{enumerate} -\item Windows, contrary to Linux which brings its own compiler, comes -not equipped with developmental tools. Several compilers have been shown to work for -compiling {\FlightGear}, including the \Index{Cygnus Win32 port of GNU C}++ and the -\Index{MS Visual C} compiler. Given that the project will be a free one we prefer the -Cygnus Compiler as it provides a free development environment. However, we will be happy -to include a proper description in case those who worked out how to compile with MSVC or -other Compilers provide one. - -\item Install and configure the \Index{Cygnus} Gnu-Win32 development - environment. The latest version is Beta 20. The main - Cygnus Gnu-Win32 page is at: - - \web{http://sourceware.cygnus.com/cygwin/}. - - \noindent - You can download the complete Cygnus Gnu-Win32 compiler from: - - \web{ftp://go.cygnus.com/pub/sourceware.cygnus.com/cygwin/latest/full.exe}. - - Be sure to read this package's README files to be found under the main page, first. - - \noindent - To install the compiler, just run \texttt{full.exe} by double-clicking in - Windows explorer. After doing so you'll find a program group called - \texttt{Cygnus Solutions} in your Start menu. Do not forget making a copy of the - shell under c:/bin, as detailed in the docs. - -\item Open the Cygnus shell via its entry in the Start menu. - Mount the drive where you want to build \FlightGear as follows - (assuming your \FlightGear drive is \texttt{d:}): - - \texttt{mkdir /mnt}\\ - \texttt{mount d: /mnt} - - \noindent - You only have to do this once. The drive stays mounted (until you - umount it) even through reboots and switching off the machine. - - -\item Before actually being able to compile \FlightGear you have to install a hand full -of support libraries required for building the simulator itself. Those go usually into -\texttt{c:/usr/local} and it is highly recommended to choose just that place. - - First, you have to install the free \Index{win32 api library} (the latest - version being 0.1.5). Get the package \texttt{win32api-0.1.5.tar.gz} from: - - \web{http://www.acc.umu.se/~anorland/gnu-win32/w32api.html} - -Conveniently you may unpack the package just onto you \FlightGear drive. Copy the file to -the named drive, open the Cygnus shell via the Start menu entry and change to the -previously mounted drive with - - \texttt{cd /mnt} - - Now, you can unpack the distribution with - - \texttt{gzip -d win32api-0.1.5.tar.gz}\\ - \texttt{tar xvf win32api-0.1.5.tar} - - This provides you with a directory containing the named libraries. For installing them, - change to that directory with - -\texttt{cd win32api-0.1.5} - -and type - - \texttt{make}\\ - \texttt{make install} - -This installs the libraries to their default locations under \texttt{c:/usr/local} - -\item To proceed, you need the \Index{glut libraries}. Get these from the same site named -above - -\web{http://www.acc.umu.se/~anorland/gnu-win32/w32api.html} - -as \texttt{glutlibs-3.7beta.tar.gz}. Just copy the package to your \FlightGear drive and -unpack it in the same way as describes above. There is no need to run \texttt{make} here. -Instead, just copy the two libraries \texttt{libglut.a} and \texttt{libglut32.a} to -\texttt{c:/usr/local/lib}. There is no need for the two accompanying \texttt{*.def} files -here. - -\item Next, get the \Index{Glut header files}, for instance, from - -\web{ftp:://ftp.flightgear.org/pub/fgfs/Win32/Mesa-3.0-includes.zip} - -Unpack these as usual with \texttt{unzip -d} and copy the contents of the resulting -directory \texttt{/gl} to \texttt{c:/usr/local/include/gl} - -\item Finally, you need Steve Backer's \Index{PLIB} being one of the key libraries for \FlightGear\hspace{-1mm}. -Get the most recent version \texttt{plib-X.X.tar.gz} from - -\web{http://www.woodsoup.org/projs/plib/} - -(There are mirrors, but make sure they contain the most recent version!). Copy it to your -\FlightGear drive, open the Cygnus shell and unpack the library as described above. - -Next, change into \Index{PLIB}'s directory. It is recommended to configure \Index{PLIB} -with the following command line (you can make a script as I did if it hurts) - -\begin{ttfamily} -CFLAGS="-O2 -Wall" CXXFLAGS="-O2 -Wall"\\ CPPFLAGS=-I/usr/local/include -LDFLAGS=-L/usr/local/lib ./configure ---prefix=/usr/local\\ - --includedir=/usr/local/include/plib -\end{ttfamily} - -You must write all this \textbf{on one line} without any line breaks in between! - -Finally, build \Index{PLIB} with - - \texttt{make}\\ - \texttt{make install} - -\item Now, you're finally prepared to build \FlightGear itself. - - Fetch the \FlightGear code and special \Index{Win32 libraries}. These -can be found at: - - - \web{ftp://ftp.flightgear.org/pub/fgfs/Source/} - - \noindent - Grab the latest \texttt{FlightGear-X.XX.zip} and - \texttt{win32-libs-X.XX.zip} files. - -(It you're really into adventures, you can try one of the recent snapshots instead.) - -\item Unpack the \FlightGear source code via - - \texttt{pkunzip -d FlightGear-X.XX.zip}. - - \noindent - -\item Change to the newly created \texttt{FlightGear-X.XX directory} with e.\,g. - -\texttt{cd //D/FlightGear-X.XX} - - and unpack the Win32 libraries there: - - \texttt{pkunzip -d win32-libs-X.XX.zip}. - - -\item You will find a file called \texttt{install.exe} in the Win32 -directory after unzipping \texttt{win32-libs-X.XX.zip}. This -version of \texttt{install.exe} should replace the one in your -$\backslash$\texttt{H-i386-cygwin32$\backslash$bin} directory -- -it's sole claim to fame is that it understands that when many -calls to it say \texttt{install foo} they mean \texttt{install -foo.exe}. If you skip this step and attempt an install with the -older version present \texttt{make install} will fail. - -Side Note: We need to make a distinction between the -\texttt{\Index{build tree}} and the \texttt{\Index{install tree}}. -The \texttt{build tree} is what we've been talking about up until -this point. This is where the source code lives and all the -compiling takes place. Once the executables are built, they need -to be installed someplace. We shall call this install location -the \texttt{install tree}. This is where the executables, the -scenery, the textures, and any other run-time files will be -located. - -\item \Index{Configure} the make system for your environment and your -\texttt{install tree}. Tell the configure script where you would like to install the -\Index{binaries} and all the \Index{scenery} and \Index{textures} by using the -\texttt{-$\!$-prefix} option. In the following example the base of the \texttt{install -tree} is \texttt{FlightGear}. Make sure you are within \FlightGear's \texttt{build tree} -root directory. - -\item Run:\index{configure} - - \texttt{./configure -$\!$-prefix=/mnt/FlightGear}. - - \noindent -Side note: The make procedure is designed to link against opengl32.dll, glu32.dll, and -glut32.dll which most accelerated boards require. If this does not apply to yours or if -you installed SGI's \Index{software rendering} as mentioned in Subsection \ref{softrend} -you may have to change these to opengl.dll, glu.dll, and glut.dll. (In case you're in -doubt check your \texttt{$\backslash$windows$\backslash$system} directory what you've -got.) - - If this is the case for your \Index{video card}, you can edit - \texttt{.../Simulator/Main/ Makefile} and rename these three libraries to - their "non-32" counterparts. There is only one place in this - \texttt{Makefile} where these files are listed. - -\item Build the executable. Run: - - \texttt{make}. - -Assuming you have installed the updated version of \texttt{install.exe} (see earlier -instructions) you can now create and populate the \texttt{install tree}. Run: - - \texttt{make install}. - - You can save a significant amount of space by stripping all the - debugging symbols off of the executable. To do this, change to the - directory in the \texttt{install tree} where your binary lives and run: - - \texttt{strip fgfs.exe} resp. \texttt{strip fgfs-sgi.exe}. - \end{enumerate} - -%% Revision 0.00 1998/09/08 michael -%% Initial revision for version 0.53. -%% employing redame.win32/readame.linux -%% by c. olson , b. buckel -%% Revision 0.01 1998/09/20 michael -%% several extensions and corrections -%% revision 0.10 1998/10/01 michael -%% final proofreading for release -%% revision 0.11 1998/11/01 michael -%% deleted some obsolete stuff from the Linux Section -%% revision 0.12 1999/03/07 michael -%% changed Windows to Cygnus b20 -%% revision 0.20 1999/06/04 michael -%% complete rewrite of the windows build Section exploiting Curt's README.win32 -%% revision 0.21 1999/06/30 bernhard -%% complete rewrite of Linux build Section diff --git a/Docs/InstallGuide/SOURCE/flight.tex b/Docs/InstallGuide/SOURCE/flight.tex deleted file mode 100644 index bd0c0c7f5..000000000 --- a/Docs/InstallGuide/SOURCE/flight.tex +++ /dev/null @@ -1,332 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Chapter file -%% -%% Written by Michael Basler, started September 1998. -%% -%% Copyright (C) 1999 Michael Basler (pmb@knUUt.de) -%% -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Flight: All about instruments, keystrokes and menus\label{flight}} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\markboth{\thechapter.\hspace*{1mm} FLIGHT}{\thesection\hspace*{1mm} KEYBOARD COMMANDS} - -This is a description of the main systems for controlling the program and piloting the -plane: Historically, keyboard controls were developed first, and you can still control -most of the simulator via the keyboard alone. Recently, they are becoming supplemented by -several menu entries, making the interface more accessible, particularly for beginners, -and providing additional functionality. A joysticks provides a more realistic alternative -for actual piloting of the plane. Concerning instruments, there are again two -alternatives: You can use the rather advanced HUD or the emerging panel. - -\section{Keyboard commands} - -While \Index{joystick}s or \Index{yoke}s are supported as are rudder pedals, you can fly -\FlightGear using the keyboard alone. For proper controlling via keyboard (i) the -\texttt{\Index{NumLock}} key must be switched on (ii) the \FlightGear window must have -focus (if not, click with the mouse on the graphics window). Some of the keyboard -controls might be helpful even in case you use a joystick. - -After activating \texttt{NumLock} the following \Index{keyboard commands} should work: -\eject - -\noindent - Tab.\,1: \textit{Main \Index{keyboard commands} for \FlightGear}. -\medskip - -\centerline{ -\begin{tabular}{|l|l|}\hline - Key & Action\\\hline - Pg Up/Pg Dn & Throttle\\ - Left Arrow/Right Arrow & Aileron\\ - Up Arrow/Down Arrow & Elevator\\ - Ins/Enter & Rudder\\ - 5 & Center aileron/elevator/rudder\\ - Home/End & Elevator trim\\\hline -\end{tabular} -} -\vskip5mm - -For changing views you have to de-activate \texttt{NumLock}. Now -\texttt{Shift} + $<$\texttt{Numeric Keypad Key}$>$ changes the -view as follows: - -\noindent - Tab.\,2: \textit{View directions\index{view directions} -accessible after de-activating \texttt{NumLock}.} -\medskip - -\centerline{ -\begin{tabular}{|c|l|}\hline - Numeric Key & View direction\\\hline - Shift-8 & forward\\ - Shift-7 & left/forward\\ - Shift-4 & left\\ - Shift-1 & left/back\\ - Shift-2 & back\\ - Shift-3 & right/back\\ - Shift-6 & right\\ - Shift-9 & right/forward\\\hline -\end{tabular} -} -\vskip5mm - -The \Index{autopilot} is controlled via the following controls: -\medskip - -\noindent - Tab.\,3: \textit{Autopilot controls.\index{autopilot controls}} -\medskip - -\centerline{ -\begin{tabular}{|l|l|}\hline - Key & Action\\\hline - Ctrl + A & Altitude hold toggle on/off\\ - Ctrl + H & Heading hold toggle on/off\\ - Ctrl + S & Autothrottle toggle on/off\\ - Ctrl + T & Terrain follow toggle on/off\\ - F11 & Set target altitude\\ - F12 & Set target heading\\ \hline -\end{tabular} -} -\medskip - -The last one is especially interesting as it makes your \Index{Navion} behave like a -cruise missile. - -Besides these basic keys there are some more special ones; most of these you'll probably -not want to try during your first flight: \eject - -\noindent Tab.\,4: \textit{More control commands.} -\medskip - -\centerline{ -\begin{tabular}{|l|l|}\hline -Key & Action\\\hline - H/h & Change color of HUD/toggle HUD off forward/backward \\ - i/I & Minimize/maximize HUD \\ - m/M & Change time offset (warp) used by t/T forward/backward \\ - P & Toggles panel on/off \\ - t/T & Time speed up/slow down forward/backward \\ - x/X & Zoom in/out\\ - z/Z & Change visibility (fog) forward/backward \\ - b & Toggle brakes on/off\\ - p & Toggle pause on/off\\ - W & Toggle fullscreen mode on/off (Mesa/3dfx/Glide only)\\ - F2& Refresh Scenery tile cache\\ - F8 & Toggle fog on/off\\ - F9 & Toggle texturing on/off\\ - F10 & Toggle menu on/off\\ - F11 & Sets heading in autopilot\\ - F12 & Sets altitude in autopilot\\ - ESC & Exit program\\\hline -\end{tabular} -} - -\section{\Index{Menu entries}} - -Albeit the menu being not yet fully operational it provides several useful functions. At -present, the following ones are implemented. - -\begin{itemize} - \item \textbf{File} - \begin{itemize} - \item \textbf{Reset} Resets you to the selected starting position. Comes handy in case you got -lost or something went wrong. - \item \textbf{Save} Not yet operational. - \item \textbf{Print} Not yet operational. - \item \textbf{Close} Removes the menu. (Can be re-activated by hitting F10.) - \item \textbf{Exit} Exits the program. -\end{itemize} - - \item \textbf{Edit} - \begin{itemize} - \item \textbf{Edit text} Not yet operational. - \end{itemize} - - \item \textbf{View} - \begin{itemize} - \item \textbf{Toggle Panel} Toggles \Index{panel} on/off. - \item \textbf{View} Not yet operational. - \item \textbf{Cockpit View} Not yet operational. - \end{itemize} - - \item \textbf{Aircraft} - \begin{itemize} - \item \textbf{Communication} Not yet operational. - \item \textbf{Navigation} Not yet operational. - \item \textbf{Altitude} Not yet operational. - \item \textbf{Autopilot} Sliders for setting limiting values for the autopilot. - \end{itemize} - - \item \textbf{Environment} - \begin{itemize} - \item \textbf{Weather} Not yet operational. - \item \textbf{Terrain} Not yet operational. - \item \textbf{Airport} Typing in an \Index{airport id} beams you to that airport's position. - \FlightGear comes with an extended list of airport ids to be found under - /FlightGear/Aircraft/apt\underline{~}full.gz which you can unpack with gzip -d. - \end{itemize} - - \item \textbf{Options} - \begin{itemize} - \item \textbf{Realism \& Reliability} Not yet operational. - \item \textbf{Preferences} Not yet operational. - \end{itemize} - - \item \textbf{Help} - \begin{itemize} - \item \textbf{Help} Should bring up this \Index{Getting Started Guide}. At present not yet fully - implemented. Under windows you can get it working by placing a file called \textbf{webrun.bat} - like - -\begin{texttt} - c:$\backslash$programme$\backslash$netscape$\backslash$communicator$\backslash$program$\backslash$netscape.exe\\ - d:$\backslash$Flightgear$\backslash$docs$\backslash$installguide$\backslash$html$\backslash$getstart.html -\end{texttt} - -(you may have to substitute your path/browser) somewhere in your path. Under UNIX a -comparable shell script might do. Requires \texttt{fgfs-manual-X.XX.exe} being properly -installed. - - \item \textbf{About...} Not yet operational. - \end{itemize} -\end{itemize} - -\section{The head up display\index{head up display}} - -At current, you have two options for reading off the main flight parameters of the plane: -The \Index{HUD} (\textbf{H}ead \textbf{U}p \textbf{D}isplay \index{head up display} and -the panel. Neither are \Index{HUD}s used in usual general aviation planes nor in civilian -ones. Rather they belong to the equipment of modern military jets. However, in view of -the fact that the \Index{panel} despite recent progress is not yet complete the -\Index{HUD} may well serve as a main instrument for controlling the plane. Besides, it -might be easier to fly using this one than exploiting the \Index{panel} and several of -the real pilots might prefer it because of combining the readouts of critical parameters -with an outside view onto the real world. (Several \Index{Cessna} pilots might love to -have one, but technology is simply too expensive for implementing HUDs in general -aviation aircrafts.) -\medskip - - \centerline{ -\includegraphics[clip,width=12.5cm]{hud.eps} -} - -\smallskip - \noindent -Fig.\,3: \textit{The HUD, or head up display.} -\medskip - -The \Index{HUD} shown in Fig.\,3 displays all main flight parameters of the plane. In -the center you find the \Index{pitch indicator} (in degrees) with the \Index{aileron -indicator} above and the \Index{rudder indicator} below. A corresponding scale for the -elevation\index{elevation indicator} can be found to the left of the pitch scale. On the -bottom there is a simple \Index{turn indicator}. - -There are two scales at the extreme left: The inner one displays the \Index{speed} (in -kts) while the outer one indicates position of the \Index{throttle}. You may recall the -\Index{Navion} taking off at a speed of 100 kts. The two scales on the extreme r.h.s -display your \Index{height}, i.\,e. the left one shows the height above ground while the -right of it gives that above zero, both being displayed in feet. - -Besides this, the \Index{HUD} displays some additions information. On the upper right you -find date and time. Below, you see \Index{latitude} and \Index{longitude} of your current -position on the l.h.s and r.h.s, resp. In the lower left corner there is a number -indicating the \Index{frame rate}, i.e. the number of times the picture being re-drawn -each second. - -You can change color of the \textbf{HUD} using the ''H'' key. Pressing it several times -minimizes the HUD. - -\section{The Panel\index{panel}} - -Besides the \Index{HUD}, \FlightGear has a \Index{panel} which can be activated by -pressing the ''P'' key. (It is recommended disabling the HUD then by pressing ''H'' -several times.) While the panel is not yet fully complete the basic five \Index{flight -instruments} to scan are present and working. -\medskip - - \centerline{ -\includegraphics[clip,width=12.5cm]{panel.eps} -} - -\smallskip - \noindent -Fig.\,4: \textit{The panel.} -\medskip - -In the center you find the \Index{artificial horizon} (attitude indicator) displaying -pitch and bank of your plane. It has pitch marks (hard to be seen in this version) as -well as bank marks at 10, 20, 30, 60, and 90 degrees. - -Left to the artificial horizon, you'll see the \Index{airspeed indicator}. Not only does -it have a speed indication in knots (recall: The Navion takes off at 100 kts) but also -several arcs showing characteristic \Index{velocity rages} you have to consider. At -first, there is a green arc indicating the normal operating range of speed with the flaps -(net yet being implemented in \FlightGear) fully retracted. The white arc indicates the -range of speed with flaps in action. The tiny yellow arc shows a range, which should only -be used in smooth air. The upper end of it has a red radial indicating the speed never to -be exceeded. - -Below the airspeed indicator you can find the \Index{turn indicator}. The airplane in the -middle indicates the roll of your plane. If the left or right wing of the plane is -aligned with one of the marks this indicates a standard turn, in which you make a full -360 degrees turn in exactly two minutes. - -Below the plane, still in the turn indicator, is another instrument, called -\Index{inclinometer}. It indicates if \Index{rudder} and \Index{ailerons} are -coordinated. During turns, you always have to operate aileron and rudder in such a way -that the ball in the tube remains centered; otherwise the plane is skidding. - -To the right of the artificial horizon you find the \Index{altimeter} showing the height -above sea level (not ground!). At present it is not yet working in -\FlightGear\hspace{-1mm}. Below the altimeter is the \Index{vertical speed indicator} -which, on the other hand, is operational. It indicates the rate of climbing or sinking of -your plane in hundreds of feet per minute. - -There is one more instrument working in the panel, i.e. the second one in the column on -the r.h.s. indicating position of \Index{throttle}. - -This completes description of the present main \FlightGear instruments. If you are -looking for some interesting places to discover with \FlightGear (which may or may not -require downloading additional scenery) you may want to check - - \web{http://www.flightgear.org/Downloads/Places}. - -There is now a menu entry for entering directly the \Index{airport code} of the airport -you want to start from. - -Finally, if you're done and are about to leave the plane, just hit the ESC key or use the -corresponding menu entry to exit the program. - -%% Revision 0.00 1998/09/08 michael -%% Initial revision for version 0.53. -%% Revision 0.01 1998/09/20 michael -%% several extensions and corrections, added Fig.1. -%% revision 0.10 1998/10/01 michael -%% final proofreading for release -%% revision 0.11 1998/11/01 michael -%% Complete revision of keyborad controls, interesting places -%% revision 0.12 1999/03/07 michael -%% Corrected rudder key -%% revision 0.20 1999/06/04 michael -%% HUD completely rewritten, added panel section with picture, and menu section -%% updated keystrokes diff --git a/Docs/InstallGuide/SOURCE/free.tex b/Docs/InstallGuide/SOURCE/free.tex deleted file mode 100644 index 7853c3139..000000000 --- a/Docs/InstallGuide/SOURCE/free.tex +++ /dev/null @@ -1,456 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Chapter file -%% -%% Written by Michael Basler, started September 1998. -%% -%% Copyright (C) 1999 Michael Basler (pmb@knUUt.de) -%% -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Want to have a free flight? Take {\FlightGear}!\label{free}} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\section{Yet another Flight Simulator?} -\markboth{\thechapter.\hspace*{1mm} WANT TO HAVE A FREE -FLIGHT?}{\thesection\hspace*{1mm} YET ANOTHER FLIGHT SIMULATOR?} - -Did you ever want to fly a plane yourself, but lacked the money or -skills to do so? Do you belong to those real pilots, who want to -improve their skills without having to take off? Do you want to -try some dangerous maneuvers without risking your life? Or do you -just want to have fun with a more serious game not killing any -people? If any of these questions applies, PC flight simulators -are just for you. - -If you are reading this you might have got already some experience either using -\Index{Microsoft}'s {\copyright} \Index{FS98}, \Index{Looking Glass}' {\copyright} -\Index{Flight Unlimited II} or any other of the commercially available PC flight -simulators. As the price tag of those is usually within the 50\$ range buying one of them -should not be a serious problem given the fact, that running any serious PC flight -simulator requires a hardware within the 1500\$ range, despite dropping prices, at least. - -Why then that effort of spending hundreds or thousands of hours of -programming to build a free simulator? Obviously there must be -good reason to do so: - -\begin{itemize} - \item All of the commercial programs have a serious drawback: They are made - by a small group of developers defining their properties - often - quite inert and not listening too much to the customer. - Anyone ever trying to contact \Index{Microsoft} will - immediately agree. - \item Commercial PC flight simulators usually try to cover a market - segment as broad as possible. For obvious reason, most of them want - to serve the serious pilot as well as the beginner and the gamer. - The result are compromises. As \FlightGear is free, there is no need - for such compromises; it just can be given the properties its users - want. It defines itself via building. - \item Building a flight simulator is a challenge to the art of - programming. Contributing to that project makes you belong to - those being able to contribute to serious, ambitious and - advanced software projects. - \item It is fun. Not only is it fun to write the code (\ldots or - documentation\ldots) but also to belong to that -- temporarily changing - -- club of clever people on the net having discussed, struggled and finally - succeeded in creating that project. Even reading the \FlightGear - mailing lists is informative and fun for itself. -\end{itemize} - -The above-mentioned points make \FlightGear different from its competitors in several -respect. \FlightGear aims to be a civilian,\index{Flight simulator!civilian} -multi-platform,\index{Flight simulator!multi-platform} open,\index{Flight simulator!open} -user-supported,\index{Flight simulator!user-sported} user-extensible\index{Flight -simulator!user-extensible} simulator. - -\begin{itemize} - \item \textbf{Civilian:}\index{Flight simulator!civilian} The - project is primarily aimed to civilian flight simulation. - It should be appropriate for simulating - general aviation as well as civilian aircraft. However, according to - the open concept of development that sure does not exclude someone - taking the code and integrating \Index{military components}. - - \item\textbf{Multi-platform:}\index{Flight simulator!multi-platform} The - developers are attempting to keep the code as platform-independent - as possible. This is based on their observation that - people interested in flight simulations run quite - a variety of computer hardware and operating systems. The present code - supports the following \Index{Operating Systems}: - \begin{itemize} - \item\Index{Linux} (any platform), - \item\Index{Windows NT} (i86 platform), - \item\Index{Windows 98(95)}, - \item\Index{BSD UNIX}, - \item\Index{SGI IRIX}, - \item\Index{SunOS}, - \item{MacIntosh (experimental).} - \end{itemize} - -There is no known flight simulator, neither commercially nor free, supporting such a -broad range of platforms. - - \item\textbf{Open:}\index{Flight simulator!open} The project is not - restricted to a closed club of developers. Anyone who feels he or she - being able to contribute is highly welcome. - The code (including documentation) is copyrighted under the - terms of the \Index{Gnu Public License}. - - The Gnu Public License is often misunderstood. In simple terms it - states that you can copy and freely distribute the program(s) licensed - to it. You can modify them, if you like. You are even allowed to charge - as much money for the distribution of the modified or original program as you want. - However, you must distribute it complete with the entire source code - and it must retain the original copyrights. In short: -\medskip - -\centerline{\textit{''You can do anything with the software except -making it non-free''}.} - -The full text of the \Index{Gnu Public License} can be obtained from - -\web{http://www.gnu.org/copyleft/gpl.html}. - -\item\textbf{User-supported, user-extensible:}\index{Flight simulator!user-supported} - \index{Flight simulator!user-extensible} Contrary to various - commercial simulators available, scenery and aircraft format, - internal variables, etc. are user accessible and documented - from the beginning. Even without an explicit developmental \Index{documentation}, - which sure has to be written at some point, this is guaranteed by supplying the - \Index{source code}. It is the goal of the developers to build a basic - engine to which scenery designers, panel engineers, maybe adventure - or ATC routine writers, sound capturers and others can (and are asked to) - add. It is our hope, that the project will finally gain from the creativeness - and ideas of the hundreds of talented simmers across the world. -\end{itemize} - - Without doubt, the success of the \Index{Linux} project initiated by Linus - Torvalds\index{Torvalds, Linus} inspired several of the developers. - Not only has it shown that distributed development of even highly sophisticated - software projects over the Internet is possible. It led to a product which, - in several respect, is better than its commercial competitors. - - -\section{A short \Index{history} of \FlightGear} - -This project goes back to a discussion of a group of net-citizens in 1996 resulting in a -proposal written by David Murr\index{Murr, David} who, unfortunately, dropped out from -the project (as well as the net) later. The original \Index{proposal} is still available -from the \FlightGear web site and can be found under - -\web{http://www.flightgear.org/proposal-3.0.1} - -Although the names of the people and several of the details -naturally changed in time, the spirit of that proposal was clearly -retained up to the present status of the project. - -Actual coding started in summer 1996 and by the end of that year essential graphics -routines were completed. At that time, programming was mainly done and coordinated by -Eric Korpela\index{Korpela, Eric} from Berkeley University -(\mail{korpela@ssl.Berkeley.EDU}). Early code was running under \Index{Linux} as well as -under \Index{DOS}, \Index{OS/2}, \Index{Windows 95/NT}, and \Index{Sun-OS}. This was -quite an ambitious project, as it involved, among others, writing all the \Index{graphics -routines} in a system-independent way just from scratch. - -Development slowed down and finally stopped at the beginning of 1997 when Eric had to -complete his thesis. At this point, the project seemed to be dead and traffic on the -mailing list went down to nearly nothing. - -It was Curt Olson\index{Olson, Curt} from the University of Minnesota -(\mail{curt@flightgear.org}) who re-started the project in the middle of 1997. His idea -was as simple as successful: Why invent the wheel a second time? There have been several -free flight simulators\index{Flight simulator!free} available running on -\Index{workstation}s under different flavors of \Index{UNIX}. One of these, -\Index{LaRCsim}, having been developed by Bruce Jackson\index{Jackson, Bruce} from NASA -(\mail{jackson@larc.nasa.gov}) seemed to be well-adapted for the present approach. Curt -took this one apart and re-wrote several of the routines in a way making them build-able -as well as run-able on the intended target platforms. The key idea in doing so was -selecting a system-independent graphics platform, i.\,e. \Index{OpenGL}, for the basic -\Index{graphics routines}. -\medskip - - \centerline{ -\includegraphics[clip,width=12.5cm]{navion.eps} -} - -\smallskip - \noindent -Fig.\,1: \textit{The \Index{Navion} flight model is one of the features \FlightGear -inherited from \Index{LaRCsim}. Until now it is the only one plane being fully realized -in \FlightGear\hspace{-1mm}.} -\medskip - -In addition, a clever decision on the selection of the basic \Index{scenery} data was -already made in this very first version. \FlightGear Scenery is created based on -satellite data published by the \Index{U.\,S. Geological Survey}. These terrain data are -available for the whole world over the Internet for free from - - \web{http://edcwww.cr.usgs.gov/doc/edchome/ndcdb/ndcdb.html} - -\noindent - for the US resp. - - \web{http://edcwww.cr.usgs.gov/landdaac/gtopo30/gtopo30.html} - -\noindent - for other countries. Those freely accessible scenery data in - conjunction with scenery building tools provided with - \FlightGear are an important prerequisite enabling anyone to - create his or her own scenery, at least in principle. - -This new \FlightGear code - still largely being based on original \Index{LaRCsim} code - -was released in July 1997. From that moment the project gained momentum again. Here are -some milestones from the more recent history of development: - -\begin{itemize} - -\item Sun, moon and stars are a field where PC flight simulators - have been notoriously weak for ages. It is one of the great - achievements of \FlightGear that it includes accurate sun (watch, Microsoft!), - moon, and planets, being moreover placed on their proper positions. - The corresponding \Index{astronomy code} was implemented in fall 1997 by Durk - Talsma\index{Talsma, Durk} - (\href{mailto:pn_talsma@macmail.psy.uva.nl}{pn\_talsma@macmail.psy.uva.nl}). - -\item Texture support\index{textures} was added by Curt -Olson\index{Olson, Curt} - (\mail{curt@flightgear.org}) in spring 1998. This marked a - significant improvement in terms of reality. You may recall: MSFS had - untextured scenery up to version 4.0. For this purpose, some high-quality - textures were submitted by Eric Mitchell\index{Mitchell, Eric} - (\href{mailto:mitchell@mars.ark.com}{mitchell@mars. ark.com}. - -\item A \Index{HUD} (\Index{head up display}) was added based on code - provided by Michele America\index{America, Michele} - (\mail{nomimarketing@mail.telepac.pt}) and - Charlie Hotch\-kiss\index{Hotchkiss, Charlie} -(\href{mailto:chotchkiss@namg.us.anritsu.com}{chotch kiss@namg.us.anritsu.com}) - in fall 1997 and continuously improved later, mainly by Norman Vine -(\mail{nhv@laserplot.com}). - While being probably not a substitute for a \Index{panel} and moreover - possibly being a bit odd in that tiny \Index{Navion}, this \Index{HUD} has proven - extremely useful in navigation until now. - -\item After improving scenery\index{scenery} and -texture\index{textures} support and adding some more - features there was a disappointing side-effect in spring 1998: Frame - rates\index{frame rate} dropped down to a point where \FlightGear became inflyable. There - were two main achievements overcoming this problem. First, with the advent - of hardware \Index{OpenGL} support and corresponding drivers for most of - the graphics cards these features could be exploited in - \FlightGear as well, leading to a \Index{frame rate} boost by a - factor up to 10. Second, Curt Olson\index{Olson, Curt} (\mail{curt@flightgear.org}) - implemented so-called \Index{view frustrum culling} (a procedure to except part of - the scenery not required from rendering) which gave another 20\% or so of - frame rate boost in May 1998. - - With these two achievements \FlightGear became flyable again even on weaker - machines as long as they included a 3D graphics board with - hardware \Index{OpenGL} support. With respect to this point one should keep in mind that code - at present is in no way optimized leaving a lot of room for further - improvements of frame rate. - -\item A rudimentary \Index{autopilot} implementing heading hold was -contributed by Jeff Goeke-Smith\index{Goeke-Smith, Jeff} (\mail{jgoeke@voyager.net}) in -April 1998. The autopilot was improved, included adding an altitude hold and a terrain -follow switch, in October 1998. - -\item The basics for selectable \Index{menu}s were laid based on Steve Baker's\index{Baker, Steve} - (\mail{sjbaker@ hti.com}) portable library \Index{PLIB} in June 1998. After having been idle for a - long time, first working menu entries came to life in spring 1999. - -\item Friedemann Reinhard \index{Reinhard, Friedemann} -(\mail{mpt218@faupt212.physik.uni-erlangen.de}) - developed early \Index{panel code}, including a working \Index{airspeed - indicator}, which was added in June 1998 and has been considerably improved until today. - -\item There was basic \Index{audio support}, i.\,e. an audio library and some basic background engine sound, contributed by Steve -Baker (\mail{sjbaker@hti.com})\index{Baker, Steve} in Summer 1998. Today, the audio -library is part of Steves's above-mentioned portable library \Index{PLIB}. This same -library was extended to support joystick /yoke/rudder later which brought \FlightGear -joystick support in October 1989, again marking a huge improvement in terms of realism. - -\item In September 1998 Curt Olson\index{Olson, Curt} -(\mail{curt@flightgear.org}) succeeded in creating first complete terrain Scenery for the -USA, which is available for download from - -\web{ftp://ftp.kingmont.com/pub/kingmont/} - -Scenery was further improved by Curt via adding features like lakes, rivers, coastlines -and the like in spring 1999. - -\item In June 1999 there was a split of the source tree into a stable and a developmental -branch. Even version numbers as 0.6, 0.8, and (hopefully) 1.0 refer to stable versions -being intended for general use while odd versions as 0.7 and so on refer to developmental -versions. Policy is to do only bug fixes in the even versions, while new features are -generally added to odd-numbered versions, which finally after things stabilized will turn -into the next stable version by adding 0.1. At present (and probably in the future), this -guide refers to the stable branch. \label{branches} - -\end{itemize} - -\longpage - -This is by no way a complete history and a lot of people making even important -contributions were left out here. Besides the named achievements being more on the -surface there was a lot of work done concerning the internal structure, by Steve -Baker\index{Baker, Steve} (\mail{sjbaker@hti.com})\index{Baker, Steve}, Norman -Vine\index{Vine, Norman} (\mail{nhv@laserplot.com}), Gary R. Van Sickle\index{Van Sickle, -Gary, R.} (\mail{tiberius@braemarinc.com}), and others. A more complete list of -contributors to the project can be found in \textit{Landing: Some further thoughts before -leaving the plane}, Chapter \ref{landing}, as well as in the file \texttt{Thanks} -provided with the code. Moreover, the \Index{\FlightGear Website} contains a detailed -history of all of the development under - -\web{http://www.flightgear.org/News/} - -\section{System requirements}\index{system requirements} -Compared to other recent flight simulators the system requirements -for \FlightGear are rather decent. A P100 is already sufficient, -given you have a proper 3D graphics card, but of course for -getting good performance we recommend a P200 or better, if you run -it on a PC. On the other hand, any not too ancient \Index{UNIX} -\Index{workstation} will run \FlightGear as well. - -While in principle you can run \FlightGear on 3D boards without OpenGL support or even on -systems without 3D graphics hardware at all, missing hardware OpenGL support can force -even the fastest PIII to its knees (\Index{frame rate}s typically below 1 fps). Any cheap -3D graphics card will do as long as it features hardware \Index{OpenGL} support. For -\Index{Windows 98/NT} drivers, you may contact the home page of the manufacturer. -Moreover, you should have in mind that several OpenGL drivers\index{OpenGL!drivers} are -still marked as beta and moreover, and sometimes these drivers are provided by the makers -of the graphics chip instead of the makers of the board. More detail on OpenGL drivers -can be found under - -\web{http://www.x-plane.com/v4ibm.html} - -\noindent - as well as under - -\web{http://www.flightgear.org/Hardware}. - -Next, you need around 16MB of free disk space for installing the executable including -basic scenery. In case you want to compile the program yourself you need around 50MB for -the source code and for temporary files created during compilation, independent of the -operating system. - -If you want to hear the \Index{sound effects} any decent \Index{sound card} should serve. -Besides, \FlightGear supports a \Index{joystick} or \Index{yoke} as well as \Index{rudder -pedals} under \Index{Linux} as well as under \Index{Windows}. - -With respect to operating systems, \FlightGear is being primarily developed under -\Index{Linux}, a free UNIX clone developed cooperatively over the net in much the same -way as the \FlightGear project itself. Moreover, \FlightGear runs under \Index{Windows -95}, \Index{Windows 98} and \Index{Windows NT} and given you have a proper -\Index{compiler} installed can be build under all of these platforms as well. The primary -compiler for all platforms is the free \Index{GNU C++} (i.\,e. the \Index{Cygnus} -compiler under Win32), however there is some support for \Index{MSVC} as well. Moreover, -\FlightGear runs and can be build on several \Index{UNIX}/X11 platforms with GNU C++ -installed. - -\section{Whom this guide is addressed to and how it is organized} - -At first: There is not much of the material in this Guide being originally invented by -ourself. You could even say with Montaigne that we ''merely gathered here a big bunch of -other men's flowers, having furnished nothing of my own but the strip to hold them -together''. Most (but fortunately not all) of the information can as well be grabbed from -the \Index{\FlightGear home page} being situated at - -\web{http://www.flightgear.org/} - - \noindent - and its various sub pages. However, there still seems to -be a small group of people preferring neatly printed manuals over -loosely scattered Readmes and those may acknowledge our effort. - -This \textit{Installation and Getting Started} is intended as being a first step towards -a more complete \Index{\FlightGear documentation} (with the other parts, supposedly, to -be written by others). Its main addressee is the end-user who is not interested in the -internal workings of \Index{OpenGL} or in building his or her own scenery, for instance. -It is our hope, that sometime there will be an accompanying \textit{\Index{\FlightGear -Programmer's Guide}}, which could be based on some of the documentation under - -\web{http://www.flightgear.org/Docs}, - - \noindent -a \textit{\Index{\FlightGear Scenery Design Guide}}, and a -\textit{\Index{\FlightGear Flight School}}, at least. - -This \textit{Installation and Getting Started} is organized as -follows: - -The first Chapter \ref{opengl}, \textit{Getting the engine: Installing OpenGL graphics -drivers}, describes how to prepare the computer for handling \FlightGear's graphics -routines. \FlightGear is based on a graphics library called OpenGL, thus you must install -either hardware or software OpenGL support for your graphics board (except, you did so -before). - -Chapter \ref{building}, \textit{Building the plane: Compiling the program}, explains how -to build, i.\,e. compile the simulator. Depending on your platform this may or may not be -required for you. There will at least be binaries available for those working on a Win32 -(i.\,e. Windows 98 {\copyright} or Windows NT {\copyright}) platform. For those on such -systems, who want to take off immediately without going through the potentially -troublesome process of compiling, we recommend just skipping that Chapter and going -directly to the next one. - -In Chapter \ref{prefligh}, \textit{Preflight: Installing \FlightGear}, you find -instructions for installing the binaries in case you did not so by building them in the -previous Chapter. Moreover, you'll have to install scenery and texture files, which will -be described there, too. - -The following Chapter \ref{takeoff}, \textit{Takeoff: How to start the program}, -describes how to start the program including an overview on the command line options. - -Chapter \ref{flight}, \textit{Flight: All about instruments, keystrokes and menus}, -describes how to operate the program, i.\,e. to actually fly with -\FlightGear\hspace{-1mm}. This includes a (hopefully) complete list of key strokes, an -overview on the menu entries, as well as a detailed description of the HUD (head up -display) and the panel. - -In Chapter \ref{landing}, \textit{Landing: Some further thoughts before leaving the -plane}, we would like to give credits to those who did the hard work, and give an outlook -on what remains to be done. - -Finally: \textbf{We kindly ask others to help us improving this document by submitting -corrections, improvements, and more. Notably, we invite others to contribute descriptions -referring to alternative setups (graphics cards, operating systems, and compilers etc.). -We will be more than happy to include those into forthcoming versions of this -\textit{Installation and Getting Started} (of course not without giving credit to the -authors).} - -We hope to continuously maintain this document at least for a foreseeable future, but -probably will not be able to produce a new one for any single release of {\FlightGear}. -While we are both watching the mailing lists, it might help, if developers adding new -functionality could send us a short note. - - -%% Revision 0.00 1998/09/08 michael -%% Initial revision for version 0.53. -%% Revision 0.01 1998/09/20 michael -%% several extensions and corrections -%% revision 0.10 1998/10/01 michael -%% final proofreading for release -%% revision 0.11 1998/11/01 michael -%% minor corrections on platforms, satellite data, OpenGL (S. Baker) -%% added Navion pic -%% revision 0.12 1999/03/07 michael -%% update on recent development -%% revision 0.20 1999/06/04 michael -%% updates on recent development, corrections of links diff --git a/Docs/InstallGuide/SOURCE/getstart.tex b/Docs/InstallGuide/SOURCE/getstart.tex deleted file mode 100644 index f47f3b6e7..000000000 --- a/Docs/InstallGuide/SOURCE/getstart.tex +++ /dev/null @@ -1,83 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Master file -%% -%% Written by Michael Basler % Bernhard Buckel, starting September 1998. -%% -%% Copyright (C) 1999 Michael Basler (pmb@knUUt.de) -%% & Bernhard Buckel (buckel@wmad95.mathematik.uni-wuerzburg.de) -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - -\documentclass[11pt,openany]{book} -\usepackage{makeidx} -\usepackage[dvips]{graphicx} -\usepackage{times} -\usepackage{hyperref} - -\newcommand{\Index}[1]{#1\index{#1}} -\newcommand{\FlightGear}{{\itshape FlightGear }} -\newcommand{\web}[1]{\href{#1}{#1}} -\newcommand{\mail}[1]{\href{mailto:#1}{#1}} - -\newcommand{\longpage}{\enlargethispage{\baselineskip}} -\newcommand{\shortpage}{\enlargethispage{-\baselineskip}} - -\makeindex - -\begin{document} - -\include{title} - -\include{free} -\include{opengl} -\include{building} -\include{prefligh} -\include{takeoff} -\include{flight} -\include{landing} -\include{missed} - -\include{index} - -\end{document} - -%% Revision 0.00 1998/09/08 michael -%% Initial revision for version 0.53. -%% incl. Linux stuff from b buckel -%% Revision 0.01 1998/09/20 michael -%% several extensions and corrections, added Fig.1. -%% Revision 0.02 1998/09/29 michael -%% added Chapter takeoff from b buckel -%% revision 0.10 1998/10/01 michael -%% added Chapter missed approach from b buckel -%% inclusion file splitting -%% final proofreading for release -%% revision 0.11 1998/11/01 michael -%% corrected ~, _ ind URLs -%% revision 0.12 1999/03/07 michael -%% changed Font to Times in print version -%% dropped .ps file -%% working URLs in .html version -%% corrected misspellings -%% revision 0.20 1999/06/04 michael -%% updated for fgfs 0.6 -%% added sections on menu and panel -%% smaller and updated pix for faster download -%% revision 0.21 1999/06/30 michael -%% Linux update by Bernhard diff --git a/Docs/InstallGuide/SOURCE/hud.eps b/Docs/InstallGuide/SOURCE/hud.eps deleted file mode 100644 index 0562b40ef..000000000 --- a/Docs/InstallGuide/SOURCE/hud.eps +++ /dev/null @@ -1,1908 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: jpeg2ps V1.5 by Thomas Merz -%%Title: hud.jpg -%%CreationDate: Wed Jun 02 03:07:31 1999 -%%BoundingBox: 20 20 665 524 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -%%EndProlog -%%Page: 1 1 -/languagelevel where {pop languagelevel 2 lt}{true} ifelse { - (JPEG file 'hud.jpg' needs PostScript Level 2!\n) dup print flush - /Helvetica findfont 20 scalefont setfont 100 100 moveto show showpage stop -} if -save -/RawData currentfile /ASCIIHexDecode filter def -/Data RawData << >> /DCTDecode filter def -20 20 translate -645.00 504.00 scale -/DeviceRGB setcolorspace -{ << /ImageType 1 - /Width 645 - /Height 504 - /ImageMatrix [ 645 0 0 -504 0 504 ] - /DataSource Data - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - >> image - Data closefile - RawData flushfile - showpage - restore -} exec -FFD8FFE000104A46494600010100000100010000FFDB00430003020203020203 -03030304030304050805050404050A070706080C0A0C0C0B0A0B0B0D0E12100D -0E110E0B0B1016101113141515150C0F171816141812141514FFDB0043010304 -0405040509050509140D0B0D1414141414141414141414141414141414141414 -141414141414141414141414141414141414141414141414141414141414FFC0 -00110801F8028503012200021101031101FFC4001F0000010501010101010100 -000000000000000102030405060708090A0BFFC400B510000201030302040305 -0504040000017D01020300041105122131410613516107227114328191A10823 -42B1C11552D1F02433627282090A161718191A25262728292A3435363738393A -434445464748494A535455565758595A636465666768696A737475767778797A -838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7 -B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1 -F2F3F4F5F6F7F8F9FAFFC4001F01000301010101010101010100000000000001 -02030405060708090A0BFFC400B5110002010204040304070504040001027700 -0102031104052131061241510761711322328108144291A1B1C109233352F015 -6272D10A162434E125F11718191A262728292A35363738393A43444546474849 -4A535455565758595A636465666768696A737475767778797A82838485868788 -898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4 -C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9 -FAFFDA000C03010002110311003F00E2FE257ED51E28F08FC45F11E887C616BA -647697B3A4105CC16CB8844D222619D3E6C6C23A93C73D46787BCFDB87C631DF -A59E9DAE5EF882E0BA465748D2ADA70ACE55635CEC0096660A0293CF1D78AF23 -FDABEF8DB7C72F19A116D22B9B81E55C9C06FF004E73C7CEA4F4071F37DD1C77 -1E73F0CB573378DF498EEEEF50B5D285FE9F35F9F0D5A2F9F15BC53AB3CB18F2 -C8DE809604820B919DD5F37472AC5D7A13C67B66A2949EB52C9F2A72B2EADB4A -CA2B572715D4FDFF0038E23C0E5F6CB709965075B9528BF611949BE57CB7BE96 -72E5E696AF9799A8DEC7DC3F0C3E377C5EF8C7AC69BA3F8575296F358D43CD58 -6C67B3B4B7903C4AED2A3191155597CB7CE4F55E33C67A44F147C76B9FED0FB1 -6BDA46ABFD9FA6DCEAF77FD95A8E8D7BE45A41B3CD91FC966C63CC5C29F99B9D -A0ED38E5BF61FF0015F87B47FDA3F43D767F13452F86FF00B575C963F106AEC9 -66B7113FDB047349B822C6D26E53B70B82D8C0E95BDF023C77E1F17FF156E26B -1D0BC1515DFC3AD574FB6B5B7BB9963BAB963194553753C8CD2B7408ADC84E17 -3927E66956AB25EFD69A6E5256E66AC924F66AFD6DADBD0FD328E1B0F5B07471 -1FD95876DE1F0F5656A1169CEAF329A4EE9D9593568B7AFBCD5D1CE6BBF1FBE2 -97877559F4EBBF145A4B710EDDCF60B617909CA861B65855D1B8233B58E0E41C -10456A6A7F16FE32685E13F0FF0089350D57C8D1B5FF00B47F66DD7D9ACDBCFF -0021C472FCAA85976B103E6033DB22BE89BED3FE176ADF14B50B1F03DB7802F2 -F6E7C77A2C3716D247A7496F2E86D6308952D167FDD331B8330616DFBE2C467F -86B4F51F12FC3A4D7FC05F0EF5C8FC183C323C41E31B7D5E1BE16C9269300BAB -AFB3448E48366AE5A32A576313147B580041EA74B11EF5F132DEC9F33B5F992D -FD1EBD8F3A78FC9DC68BA792D3BB5CF35ECA0A5CBECA751DA36D1F34528DDB52 -5A68DA6BE59D57E39FC5AD07EC5FDA7A8DDE9DF6DB64BCB5FB5E950C5E7C0F9D -92A6E886E46C1C30C8383835D8E9FAA7ED07AC69FA75CD9DD42F36A564DA958E -9CEFA647A85E5B2876F361B36C4F22911B95DB19DC172B918AC2FDA47C5961E2 -EF0DFC1F9749BFD3AFECAC3C1D69A6CE20317DAA0BC87293C532FF00AE551842 -9BC6C39668F3B9C9F66D0AC7E1C7C58F117C2DB8F155FF00832EFC1D63E06B0D -33529F59F10B69F7B69796E2756821852E237DC5DE325A4428510946C91BAA8C -AB4EA387B693DADEF35BFDFA1DF9850CB70B97D2C5BCAE8C5BF69CDFB98C9AE4 -BD925EE7BCEDB37D1A573E6EFF008697F893FF00431FFE48DB7FF1BA921FDA57 -E243B107C47918FF009F1B6FFE375EC7F07EF7E185A7C1AF097DAF47F08EAD7E -DFDB1FF0957F6FEAB6B632C7C7FA3E3CCB69AF5F316DF2FEC3B712039CB16C3F -C13A1FC3387E08EA1697DA8F8775979BC1377A8477F7773A5DA5E5B6B425674B -348444B7ECE85401234CD1C8B9010AB2814BEB328AB577AABEEFC9FEB6F27731 -ADFD874A538CB2985A33E5FE1D3D7DE945B5A68FDDE65176728CA325D6DE3A7F -692F88D9FF00918BFF00246DBFF8DD393F691F88C5B9F117FE48DB7FF1BAD2FD -AD2F7C3975F1DB5E8BC22BA1AF866DA3B68AC4F87A1B74B520C08F210D080AED -E63C80B124F1B738500790C7F7AB89E27114EB3A7ED64ECEDBBFF33E87039264 -B8DC252C53CBE9479E2A5674E175757B3F7775D7CCF4C9BF691F88C8A08F1160 -E7FE7C6DBFF8DD43FF000D2BF11FFE863FFC91B6FF00E375E7571F707D6ABD76 -AC4D7B7C6FEF62A9C3B93296982A5FF82E1FE47AA2FED21F114A83FF0009176F -F9F1B6FF00E374BFF0D21F117FE862FF00C92B6FFE375E669F717E94B51F59AF -FF003F1FDECE27C3F93FFD01D2FF00C171FF0023D307ED1FF114FF00CCC3FF00 -9256DFFC6E9927ED23F1195B8F117FE48DB7FF001BAF385E951CBF787D2B7A38 -8ACE76737F7B39EB64194285D60E9FFE011FF23D322FDA43E22B3107C459E3FE -7C6DBFF8DD4BFF000D1BF113FE861FFC92B7FF00E375E5F07DF3F4A9EBB5D6AB -7F89FDECF2E591E557FF0075A7FF008047FC8F49FF00868DF889FF00430FFE49 -5BFF00F1BA3FE1A37E227FD0C3FF009256FF00FC6EBCDA8A1D6ABFCCFEF643C9 -32AFFA05A7FF008047FC8F431FB48FC45F340FF848B8DD8FF8F1B6FF00E3756B -FE1A2BE21FFD0C1FF9256FFF00C6EBCA87FAF1FEF7F5ABB5D94EAD46B593FBCF -26A64F96A7A61A1FF8047FC8F473FB45FC431FF330FF00E495BFFF001BA51FB4 -5FC43FFA183FF24ADFFF008DD79B374A51D2B5F693EECC5E51977FD0343FF008 -FF0091E91FF0D15F10FF00E860FF00C92B7FFE374D4FDA33E219DD9F10F438FF -008F2B7FFE375E734C8FF8BFDE34FDA4FBB393119565F18AB61E1FF80C7FC8F4 -C1FB457C423FF3307FE495BFFF001BA70FDA27E2113FF2307FE495BFFF001BAF -365E94E5EB5DD0937157679AF2CC0FFCF887FE02BFC8F48FF8688F883FF4307F -E495BFFF001BA0FED11F107FE860FF00C92B7FFE375E7141E95A5D99CB2DC0D9 -FEE21FF80AFF0023D17FE1A27E217FD0C1FF009256FF00FC6E957F689F884587 -FC541FF9256FFF00C6EBCDE957EF0FAD34DDCF1FEA184FF9F51FFC057F91E967 -F686F8800FFC87FF00F24ADFFF008DD27FC343FC41FF00A183FF0024ADFF00F8 -DD79D375A4AF4B957633781C27FCFA8FFE02BFC8F4B93F683F1FAC4A46BFC9C7 -FCB9DBFF00F1BA8BFE1A1FE20FFD0C1FF9256FFF00C6EB8097FD427E1FCAA0A2 -3156D8F32AE130EA5A538FDC8F471FB437C403FF0031FF00FC92B7FF00E374AB -FB42FC402C7FE27FFF009256FF00FC6EBCE57A509F78D6908C5CD2B183C2E1FF -00E7DAFB91E9717ED05E3F6620EBD9E3FE7CEDFF00F8DD3A5FDA07C7CAA08D7B -1CFF00CF9DBFFF001BAF3983EF9FA53E7FB83EB5D9ECE17F851C9570F4527682 -FB91DF0FDA13C7F9FF0090FF00FE49DBFF00F1BA71FDA0FC7FFF0041FF00FC93 -B7FF00E375E723AD38F4AB74A9FF002AFB8F3BD8D3FE55F71E85FF000D09E3FF -00FA0FFF00E49DBFFF001BAB49F1F7C785149D77923FE7CE0FFE375E6157A3FF -0056BF415AD2A54DB778AFB8C274A9AFB2BEE3BE97F680F1EAB0035EC71FF3E7 -6FFF00C6E99FF0D03E3EFF00A0F7FE49DBFF00F1BAE027FBE3E951D762A14ADF -02FB91E6548C549D91E87FF0D03E3EFF00A0F7FE49DBFF00F1BA962F8FDE3D65 -24EBD9E7FE7CEDFF00F8DD79BD4D07DC3F5A1D0A56F817DC8C24958F464F8F7E -3B279D77FF0024E0FF00E37511F8FF00E3D0EC3FB7B807FE7CEDFF00F8DD7089 -D6A06FF58DF535D7430D41C7582FB91C15DB56B1E85FF0BFFC7BFF0041EFFC93 -B7FF00E374ABF1FBC7A580FEDEEFFF003E76FF00FC6EBCF2953EFAFD6BA7EAB8 -7FF9F6BEE471B9CADB9E93FF000BEBC77FF41DFF00C9483FF88A3FE17D78EFFE -83BFF92907FF00115C051597D5A87FCFB5F7239FDA4FF999DD7FC2FDF1E64FFC -4F7BFF00CF9C1FFC6E97FE17E78F3FE83BFF0092707FF1BAF3E1D5BEB457A94F -07867157A51FB91E64ABD5BBF7DFDECF458FE3D78ED979D77FF2520FFE22A41F -1DFC73FF0041CFFC9483FF0088AF3B8BEE9FAD4C3A50F0786BFF000A3F723965 -88AD7F8DFDECEF5BE3C78E8293FDB9DBFE7D20FF00E22A01F1F3C799FF0090EF -FE49C1FF00C6EB887FB8DF4AAC3AD54305856FF851FB97F91C75B15884D5AA3F -BD9E8B17C79F1D331075CCF1FF003E907FF1152FFC2F6F1CFF00D073FF002520 -FF00E22BCEE0FBE7E953D7A2F0184BFF00063FF80AFF00238258DC4DFF008B2F -BDFF0099DE8F8EDE39CFFC873FF2520FFE229B37C77F1CA28235CC1CFF00CFA4 -1FFC457083AD32E3EE0FAD2580C25FF831FF00C057F91854C6E2945DAACBFF00 -027FE6771FF0BEFC77FF0041DFFC9383FF0088AB317C75F1C320275BE7FEBD20 -FF00E22BCDAAEC3FEAC57453CBF06E5AD18FFE02BFC8F367986312FE34BFF027 -FE677FFF000BCFC6FF00F41BFF00C9483FF88A3FE179F8DFFE837FF92907FF00 -115C1D15D5FD9B82FF009F10FF00C057F91CFF00DA38DFF9FF003FFC09FF0099 -DD4DF1D7C70A808D6F073FF3E907FF00114C8BE3BF8E59883AE678FF009F483F -F88AE16E3FD58FAD4707DF3F4AB596E0797F810FFC057F91C35F33C7A7A579FF -00E052FF0033D0C7C73F1BE47FC4EFFF002520FF00E22BD17E0AEB9E30F8B7E2 -1D4F4EB8F19B6890D8E9CFA83DC269505C960B2C51EDDBF27FCF5CE73FC3D39A -F9FC7515EF9FB207FC8E3E2FFF00B16A7FFD29B6AE0CC30785C3E02B56A5460A -515A3E48BFCD1D594E3B198AC7D1A35ABCDC64ECD73C97E4CF58FF008577AAFF -00D15FB8FF00C2561FFE3B5CE2E8FAECFF00156D3C196FF132E6547F0F5E6BF3 -EA2DE1C81444B05CDA40B12C7E6658B7DA9989C8DBE580036E3B79EFF868DFF8 -AFBFE116FF008561F123FE427FD99FDB5FF08FFF00C4B7FD6F97F68F3BCCFF00 -51FC7BF1F779C5755A27FC9CF0FF00B273AB7FE9CB4CAFCA3FB46B7F2C3FF05D -3FFE44FD93FB3287F34FFF000654FF00E48F1AFF0086B1F83DFF00473371FF00 -86FAE7FF0089AE9353F1CEA937C46F863E1AF0DFC439F5FD3FC716A97D0EAF26 -810DAAC104935B471308989672C2E0B10DB31B40E4B1DB3FC1CF8A5A5F857E10 -F81F44D5346F185AEA7A6E8563677507FC21BABBF973476E88EBB96D48386523 -20907B1AF3CF03E9D75A47C63FD94AC6FADA6B2BEB5F0DE9F04F6D71198E4864 -5B8D38323A9C156041041E4115DD81C6D4AD888D3A90834EFF00F2EE9F67FDD3 -CFC7E0A9D1C34AA539CD356FF97953BAFEF1F454DE17683C48FE1E7F8E31AEBC -96E6EDB4BFF8476DBED2200FB0CBE5F9DBB66FF9776319E339AF3DF8B5E3197E -1F7816F35FD0BE2C278C6E6D759B6D0A6B2B3D1AD63582E649E38A44964123F9 -6F187DC50A96CED042EEDC25FDA7BE187893E3078AF48D134087FE11796C66B8 -BE1F10D2722EB4B277466DAD238A54959E604090B9588463F8DF684F32F8A3A3 -5FF85FF658F0FE81A8F84ACFC1B71A3F8874BB1FB16993ACD65384BD8FFD26DD -B719364A497C4D897716DFB8FCED861F1F5675A10946166D7FCBBA7DFF00C274 -6232FA50A339C653BA4FFE5E54EDFE23C1FF00E0A497D3EA83E12DE5CBF9B737 -1A2C934AF80373B79249C0E0724F4A2A0FF828A7FC83FE0E7FD805BF94345799 -894A35E696D77F99EA615B950A6DBBB697E47D3BE37FD8F2C7C6BE25D5F53BCD -7E165BFBA9A7F226D2566082493CC29932F23217B0C95071C566D9FEC5769A75 -BA5B5A78A23B58133B6287495455C9C9C0137A9CD7D29A9DC0B3B3BAB92A5C42 -8D26DCE3760138FD2B9ED03C51A8EBF69677B168DE5D95C107CD6BA5CAAEEC13 -B71CF4E957FEAD657522B9E9BD75F8A5BFDE7E9547C48E29C3B4E962926928A7 -ECE95F956CAFC976B4EE7897FC31C232FF00C8E0DCFF00D42FFF00B7545FF0C6 -280E3FE1323FF82B1FFC7FDEBDFBC45AC4BA558B359C705D5F1C6DB796E162DC -38E72C7EB59DE33F136A7E17896F23B4B59AC0C91C59699C4BB98819DBB718FC -68FF0055B288FF00CBA7FF00814BFCCE87E29717CB7C6FFE53A5FF00C81E73E1 -8F801E2FF05E9EF65E1DF8BDAF683652CA667B6D3126B68DA42002E552E402C4 -2A8CFA01E82B9B5FD8DD2218FF0084C18F3FF40BFF00EDD5F464F7705A8533CD -1C21B81E63800F038E4D4EAC1D43AB654E0823F0E4735A3E17CAA492953765FD -E97F99CD1F1278A69CA538629272DDAA74937EBEE6BF33E6E1FB1EA7FD0DEDFF -0082BFFEDD4D7FD8E91C01FF0009830FFB85FF00F6EAFA2352BC5D3F4EB9BB64 -F30410B4A501FBDB5738CF358DE1EF10DFF886DAD2ED74910595C0DC267BA524 -2FFBB8CF5E29FF00AB5952D3D9BFBE5FE65BF1338B24ACF19FF9253FFE40F0DF -F86364FF00A1C5BFF055FF00DBA9F1FEC7291B67FE13063FF70BFF00EDD5F416 -AFA8AE97A7DCCE4A3491C2F2A465B97DAA5B03FCFF00F5EA681E218F56F0F58E -A771E5DA0B940DB5DC601E7804FD3FCF7AFF0056B2BDBD9BFF00C09FF998FF00 -C448E296BFDEFF00F24A7FFC81E17FF0C7A87FE66F6FFC15FF00F6EA55FD8FD1 -4E7FE12F6FFC15FF00F6EAF6EB6F121B7F0F3EA7ABC71D8842F958E55943004E -369048248EDFE4DED2759B3D6ED21B8B49924596359766E059430C80C067079F -F3DC8F0D6569E94DDFFC4FFCC5FF00111B8A3FE82BFF0024A7FF00C81E0727EC -7E92281FF097B0FF00B85FFF006EA8BFE18E93FE86F63FF70B1FFC7ABE8FFF00 -3FE7FCFF00F5F9BD37C6B05F787350D5A580DB0B26952585DC13B906719F5391 -F9F7EFB7FABF972D393F17FE664FC42E2696AF15FF009253FF00E44F191FB20C -6001FF0009737A7FC82FFF00B7527FC32247FF0043737FE0B07FF1EAF7BB7D51 -25D22DEFA544B733C4B208E570304AE42E4F7FF3F566897D3DEE8F15D5EC51DA -4A4317449448AA03100EE048E983F8D2FF0057B2DFE47F7BFF00323FD7EE23EB -89FF00C929FF00F227848FD90E31C7FC25CDFF0082BFFEDD4C6FD90A3739FF00 -84B987FDC307FF001EAFA123BA82585A649A37897AC8AC0A8C75E79A77989E48 -9378F2CAEEDD9E318CE73F8D5C787F2F8BBA83FBDFF992F8F388A4ACF13FF924 -3FF913E7B4FD906346FF0091B98F6FF905FF00F6EA77FC323C7FF436B7FE0B07 -FF001EAFA140049EFF00FEBACBF12EB8BE1BD12E2FDA33398946D894E0B92700 -03F8FA55BC8F01BB8BFBD98FFAEF9FBFF988FF00C921FF00C89E1FFF000C8B1F -FD0DADFF0082BFFEDD49FF000C911E3FE46D6FFC160FFE3D5EEBE1FD622F10E8 -D69A8C48512E103EC6E4A9CE08F7E45436DABCD75AE35AC490C9602DF78B949D -598BE47CBB41CE307AE28FEC3C035F0BFBD87FAED9FF00FD047FE4B0FF00E44F -0C1FB21C61F77FC25CFD738FECB1FF00C7AA6FF864C8FF00E86C7FFC160FFE3D -5EF8D796CAACCD3C4177F964971F7B3F77AF5F6A5B89E1B58C3CD2A44A4E3323 -0519F4C9AD63936096D17F7B317C619DCB7AFF00F92C3FF913C08FEC9719FF00 -99B1FF00F0583FF8F51FF0C991FF00D0D8FF00F82C1FFC7ABDEBED507D9FCFF3 -A3F23FE7AEF1B7AE3AF4EBC5385C44D334225432A8C98C30DC07AE3F1AAFEC7C -1FF2BFBD8BFD6ECEBFE7FF00FE4B0FFE44F03FF864C8FF00E86C7FFC160FFE3D -48BFB2546B9FF8AB5F939FF9060FFE3D5EF697704B33449346F2AFDE4560587D -456278AFC563C3D2585B451472DDDECBE5C7E749B2341DD98E0903F0A4F28C1A -5769FDEC897156713D255BFF00258FFF00227908FD93631FF3363FFE0B07FF00 -1EA51FB27463FE66C7FF00C160FF00E3D5ED561A9CABA64B75A9FD96058C9FDE -DB4C6489978E41201EB918F6F7A5D07C4563E23B18EEACA60CB202423101C007 -1CAF6FFEB8AD23966156893FBCCBFD65CD7FE7EFFE4B1FF23C57FE19423FFA1A -DFFF000583FF008F51FF000C9F1FFD0D6FFF0082C1FF00C7ABDF2B9B9BC5972D -E23BCD22CB4C3752DAC6923C8D388C618023191EF4DE5B865BA7F78BFD64CD5F -FCBDFF00C963FE4792FF00C32747FF004363FF00E0B07FF1EA51FB2746083FF0 -963FFE0B07FF001EAF778AE488216B9096D2C981E597070C7F841EE6817B6E61 -6984F11854E0C9BC6D07EB54B2CC3767F7987F6F663FF3F3F08FF91E167F6528 -CFFCCD6FFF0082D1FF00C7A93FE19463FF00A1ADFF00F0583FF8F57BCF9A9B15 -F7AEC6C61B3C1CF4FCF3597E20D664D32CA4366905D5E8236DBCB3AC5904F272 -C476AD3EA3457717F6EE60FF00E5E7E11FF23C75BF6568D902FF00C254E31DFF -00B347FF001EA67FC328C7FF00435BFF00E0B07FF1EAF7879A38D955E4556604 -80C70481D7F2A48AE619E332472A4918EAEAC081F8D3581A3E662F38C6C9DDCF -F05FE47848FD94E31FF335BFFE0B47FF001EA07ECA71839FF84ADFFF0005A3FF -008F57BB41730DD21786549941C168D830CFE14DFB6DBEF0BF688B7162806F19 -2C3A8FAF3D29AC1524EEAE4FF6B633F9FF0005FE4787A7ECB11A1CFF00C252E7 -FEE1A3FF008F52BFECB51B8C7FC252E3FEE1A3FF008F57B835DC092F96D346B2 -70361619E7A71EF4F49525DDB1D5F692A769CE08EA2AFEAB0EEC896658A96F2F -C17F91E13FF0CAB1FF00D0D4FF00F82D1FFC7A97FE195E3FFA1A9FFF0005A3FF -008F57B9417705D02619A3982F531B06C7E5486F6DC30537116E2FE581BC64B7 -F77EBED4FEAF0EE65F5EC47F37E08F0DFF0086558FFE86A7FF00C168FF00E3D5 -3AFECBF1AA81FF000943F031FF0020E1FF00C7ABD775AF1369FA04B691DE4C12 -4BA95628D46339271B8FA2FBD68C3347711AC913AC91B74643907F1A71A114F4 -6C978CAEF77F823C39FF0065B8DCE7FE12971FF70D1FFC7A9BFF000CB31FFD0D -2FFF0082D1FF00C7ABDAF56D52DF45D36E2FAE98AC102EE620649F403DC9C0AC -68BC612C773A72DFE972D841A830482769038DE4655580FBA4F6FC7D2AF912D1 -C9FE1FE464EB5496AD9E5BFF000CB31FFD0D2FFF0082D1FF00C7AA44FD976341 -8FF84A1CFF00DC387FF1EAF6D7BB823F337CD1AF978DFB9C0DB9E99F4CD41ABE -AF6BA1E9F35EDE49E5C110C9EE4FB01DCD3F67DE5F97F913ED66CF1C5FD98635 -3FF233BFFE0B87FF001DA8CFECB919627FE1287E7FEA1A3FF8F57B3E99ABDA6A -D6315DDBCCAD1BC6B2905865030C8DDCF06AB5B6AF35DEBCF6B1450BD82C1E60 -B949D598BEE036ED072060F5AB8F3457BB27F87F91949F36E790FF00C32E47FF -004343FF00E0B47FF1EA51FB2EC6083FF0943F1FF50E1FFC7ABDB45DC0673009 -A3330EB1EE1BBD7A75A24BA82162B24D1A305DE4330042E719FA66AEF3FE77F8 -7F911C91EC78B7FC33247FF433BFFE0B87FF001DA3FE19923FFA19DFFF0005C3 -FF008ED7B60911A2F343A98F1BB783C63D73E94DB7BA82E81304D1CC075F2DC3 -63F2A9F7BF99FE1FE44FB28763C4BFE197E3C9FF008AA1F939FF009070FF00E3 -B4BFF0CC11FF00D0D0FF00F82E1FFC76BDC8267BF35CE378C621A36B7A87D99C -AE97712DBB47BB990A639071C67756AABD58AB73BFB97F918FD568BFB3F8BFF3 -3CC93F6638D463FE12773FF70E1FFC769FFF000CCF1FFD0CCFFF0082E1FF00C7 -6BD82C35582F347B4D42465B68AE228E51E6381B770CE33F8D49772CF2581934 -FF00B3CF39C18FCD72233CF39600F6F41D68F6D577E77F72FF00221E0F0EFECF -E2FF00CCF1B3FB3346C08FF8499F9E3FE41C3FF8ED443F6608FF00E8686FFC17 -0FFE3B5EA3E16F153EB2BAA8BE8A1B492C2E8DB48E92128483824161D33FD3F1 -DF59A36668D645674C6E50795C8C8CD11C456DD4DFDCBFC8CE597E1A5BC3F17F -E6786CDFB36C364CA5FC4B21DD9031A70F6FFA6D51FF00C33F5AFF00D0C737FE -0B87FF001EAF67D63AC5F8FF004ACEAF7284AAD4A6A529BBFA2FF23079660EFF -0007E2FF00CCF29FF867EB5FFA18E6FF00C170FF00E3D4927ECF96B22E3FE124 -987FDC387FF1EAF57A2B7B54FE77F87F912F2BC1B5674FF17FE67927FC33B5AF -FD0CB37FE0B47FF1EA993F67FB54503FE12398FF00DC387FF1EAF55A2A93AA9D -D547FF0092FF009193C9B00F7A5F8CBFCCF2CFF85036BFF431CDFF0082E1FF00 -C7A8FF0085036BFF00431CDFF82E1FFC7ABD4E8ABF695FFE7E3FBA3FE44FF61E -5DFF003EBF197F99E5727ECFF6AEA07FC24730FF00B870FF00E3D4D4FD9F2D50 -E7FE12498FFDC387FF001EAF56A28F6B5F6F68FEE8FF00919CB87F2C96F4BFF2 -697F99E583E00DA83FF231CDFF0082E1FF00C7A9B75FB3FC3756935B2F8BF55B -28A60166FECF596D1A550C1823B4570A59772AB6D248CAA9C65411EAC064D3D5 -42F39E41EBE9FE7FCFB4CA7567074E73BA7BA6A2D3FBE22864196D29A9D3A566 -B66A534D7CF98F121FB2B69C47FC8EBE25FF00C185F7FF0026509FB2B69D0CF2 -4A9E35F1224AF0B5B3C8BA8DE866899E3768C9FB672A5E2898AF4CC687AA8C7B -671C7AE3A7E14FCF7CE307F2E9EFEDFE7B70FD528FF247FF0000A7FF00C89E8F -D4697F34FF00F0654FFE48F101FB2B69C47FC8EBE25FFC185F7FF2654DA6FECC -361A3EAD1EA76BE30D7575282368E0BC7B9BA926B70CC8C4C4ED744C4DB910EE -42181504118AF66E38F5C74FC29F9EF9C60FE5D3DFDBFCF6A8E1E9C25CD18C53 -FF00043FF9122797509AE59B9B5E752A7FF247880FD95B4E23FE475F12FF00E0 -C2FBFF009329AFFB2869333C5E778B35DBB58A58E758AEAEAEE68CBA3874251E -ECAB61954E083C8F6AF7111FAFCBD88FF27EBFE7A3874E9DBFCFF9FF00212C35 -28BBC631BFF829FF00F2254B0145AB4A5369FF00D3CA9FFC91F06FFC14BF4E1A -45CFC2BB1121985AE91340242BB4BED310CE32719C74CD156FFE0A8BC6BDF0E3 -FEC1F73FFA1C7457E575DB7566DF77F99EF422A11508EC8FD01F117FC81754FF -00AF797FF4135C9FC33D1193C2FA3DF0BFBDCF964FD9FCC1E575618DB8E9DFAD -77CD73A72B10FA86C707E6530B7CA73D33FE7A5345CE9791FF00132FC7C86FF0 -FF0038AFAFA74A6E317CAF6ECCC1E9A1E7BF1874DB6B8F094F77F658A4BB5288 -9398C1902EE3C06C671C9FCEAC7C5A567F0AAAAA966FB5C3D393F7BFFAF5DBB4 -DA583FF211E3A63C87FD7F5A5FB4699BB8D4F03AFF00A87E3A569EC67ABE57AF -932763C93C652CD69E399E6D52786DB4D92DC259C9796ED3423E51BC003A3673 -F8115D87C3B8D2DFC371A45A88D4E3591B64CB198C004821406E7033D7DEBABF -374AC0CEA3CF43FB87FEBFE7AD06E34CDDC6A5C7FD707E3A7F9FCE854669DF95 -FDCC6F6B191E2739F0C6ADD71F649BFF004035C47C35BFD16D749D240D5E417E -C029B437276173918D9D3B8FD2BD30CFA5A919D47048E9E43FF9F5A5FB4E979C -8D4F03DE071E94DD1A8DDF95FDCC4BB1E41E2D6D28789BC50BAA595C5CDE496C -9FD9E563661FEA7E6C6381839249EC0FD0F5BE09D2AD354F00E916F7D6915CC6 -22CEC9D030072467047079EBD7935D87DA34AC8FF8990E4723C87F414EFB4E97 -9C8D4F03DE071E94951A89DF95FDCC6DDF43CAFC3BA57DBFE12DF41F6712B069 -DA38CAE48218E31EF8FF003EBB7F0DAFF47B9D0ED20B058C5F416D1A5D0588AB -870A01DC71CF39EE7FC7B7FB469591FF001321C8E4790FE829DF69D2F391A9E0 -7BC0E3D28546A26BDD7F7306EE57FF003FE7FCFF00F5FC8B5CB69E1F1CDEF872 -388B59EBB736F74E7BEC525A5238EE54FAF4FCFD8BCFD28E3FE2643A7681FD05 -1E6E95FF00413E3DE06FF3EB552A5395BDD7F7312D0CBD72C2DB51D3274BAB78 -AE51519D5658C380DB4E08041E793F9FBF3E4EF1DF45F0DFC32E81934D8AE656 -BDCC65801E6B6D2CA392BD723DC7B67DABED1A571FF1331EFF00B87FF3FE7F35 -F3F49CFF00C84F8FFAF77A254272D795FDCFFC813B1E53A15BC1ABBF8856C355 -82F56F74E9226B5B2B568A356DA155B078CFCC781D73F9F39A1B6AF3A68F24CC -ED67ABEDD3D55F242AC65707F1C1FCBF3F78FB4695C7FC4CC7BFEE1FFCFF009F -CD7CFD273FF213E3FEBDDEA3EAF51FD97F731DC8B1EF9FF3FE7FCF5E57C546E6 -F354D32CADAC92F8445AEE68A590468401B572DB4F724E31CE2BAEFB4695C7FC -4CC7BFEE1FFCFF009FCD7CFD273FF213E3FEBDDEB674EA356E57F73FF2251C0F -C2D3716769AA6917308865B2BA38456DCA15F9001C74183FE7AB34AD3ADB4CF8 -A7709696B15AC274B276431845CF989E8319E2BBF3369279FED219EFFB87A3CD -D2874D538FFAF77FF3DEA1519A4972BD3C9957DCF32F0E78234EF10DD6BF757E -2595FF00B56E110072047B64CE476C9CD5CF14DEE9FA678DAD2E75C88B6966CB -64324885E249B79DD9183C95C0E9DEBD03CED2B3FF002121CF5FDC3D1E76958F -F90A7FE4BBD1EC2696917F730BEA79DF8E2E74DBDF85BA9CBA488FEC6CD19062 -8CA293E72648040AD5F0DF856C3C3D651EA76B14D35EB59E1CB4996989C373EF -9181F5AEBFCED2B3FF00212073D7F70F479DA563FE429FF92EF4FD8CEFCCE2FE -E617E8785C7AE4173A9E83A995B6B2315D85BA8ED6DE456806EC6247FE2CFA57 -67E3FD3A0BBF11F854CB6B1CE1EE9A3937C61B72F1C1F6E4F5AF41F3B4ACFF00 -C8481CF5FDC3D636BBE25D2346D4FC3966DAAA83AB5FBD9286B4909245ACF3E0 -1070BC424E4E470463241A8F6338A774F5B7463E6B85EE916C743B8D3E0B4856 -0689952DD11553272460741CF3F5AE47E12DEE989A25B582AAA6B30AC9F694F2 -0AC8A3CC246E6C7A15EFE95E8FE76959FF00909039EBFB87AE5ACBE25785AFB5 -3B5B54BEB9582F2FAE74BB5BE7B43E55C5DC1E779D0A80DBC15FB3DC7CCCAAA7 -CA3863B93754A12524DC5FDCC133A1AF31BA934E8BE27EB4FA85FC9A78104223 -78E631163B57B8AED34AF1DE81AD5F08AD25BE96CDAEA7B15D456C98C06781DD -2543825D02BC52AEF75542C80063BD37D4D0FE2778635DD42C2DE2B9BCB7B5D4 -BCFF00ECED4AE2D42DB5FF009479F258392DBD374B1E40F3234675DCAA4D4C93 -95B47F73FEBAA04ED732FC68B6BAC693E198E0B86B8B49754862132484B30DAE -A4EEF5E3AFAD41E16F0FDA36A5E34D1913658B3451AC7D426E8CE48CF7C9CFE0 -2BD1FCDD2B8FF8997FE407E297CDD271FF00213FFC977ABF633BF372BFB98731 -E5DE05BABCD665B4D1AF9083A048FE7B750EEA76C233EC371F7DA2AEFC5CD2AD -5BC2F7378B6709BDF3231E788819319C6376335B765F12BC2D7FAA5A5AA5EDCA -C1797F71A5DADF35A910CF77079DE742A325C15FB3DC7CCC8AA7CA3863B9374F -A4F8EFC3FAD5F7956B35FC9666EAE2C5351162C6069E06912543825D02BC52AE -F755425000C77A6ECD45CA3CB66FE4FF00AEDF7F985F530FC6FA3C5AEF8AFC31 -693BBAC2C2E99C21C16004671F4351F8BB414D03C2B1DB6991CC9A7FDB565BA8 -E2258884E7701DF19DB5ABE0FF008A3E13F1CEB1ACE9DA56A4659348B996D2F1 -BF764C32C72BC455A3591A54DCD1C854BA2860848E319EB7CDD271FF00213FFC -977AA8D375139462F5EB6617E879E6906D6E7C716D3787F6FF006625A30BC680 -1116EFE01E9BBA1E2B95D6347B76D0FC45AAE1C5EC3AE4891C81C8D83CD00E07 -BE7F415ED9E6E95C7FC4CBFF00203F15CBD97C4AF0B5F6A76B6A97D72B05E5F5 -CE976B7CF687CAB8BB83CEF3A1501B782BF67B8F999554F9470C7726E995292D -1A6BE4C699E6FF00116DD65F166AF212DBA31681707D48AB7A4C1723C09E2C82 -CCCC5D6F06D54CB305CA17C0FF007735DFC5E3DD286BFA5E91776BA969F75A8F -9A6132C314802C6BB9DD8452BB2A0CAA97236869235272EA0C3A1FC4EF0C6BBA -8585BC573796F6BA979FFD9DA95C5A85B6BFF28F3E4B0725B7A6E963C81E6468 -CEBB9549A9E4777A3D7C9FF979A1DF4396F07CF6775E27D3A6B3D5AD4B2C2D0C -9676966F1EF5DA4FCE7A64100E7DAB2353D16DA5F0FF008B75565737B6DADC8B -0B863F27EF501C0F53B8FE42BDB3CDD2B8FF008997FE407E297CDD271FF213FF -00C977AD3D84DAB38BFB98B9B53CF3E285A40B2683A84F6EAF05BDFC7F6994C7 -BB6C59C9DD8E4AF07FC9E7ACD0EEB4FBDD3A39B4C082C98928628F629E792060 -77EF59B7BF12BC2D61AA5CDABDF5CB41677F6DA65DDEADA9F26DEEE7F27C9858 -13BD8B7DA60F99519479832C36BED76A9E3ED2B44D42CEDAEEDB538D2F2F52C2 -DEE16189C4CEC4805516632150A1A46F932A88ECC005620B34DBB3FB9FF9084F -881A6DC6ADE0ED4ED6D6369A76456545192DB58310077381D2B9EF11EAF6DE36 -3A0D9E985E6B85BE8AEAE15509FB32286DDBFD0E5B1EF8ADCD3BE29785355F1F -6A7E10B5D48CBABE9BB4DDA62306253147287F2CC9E6B26268D77842BB8E33C1 -AEB7CED2B1FF00214FFC977A392552EE29F6D9F40BD8F1AF1047A31F1DF8A0EB -4CE104117928A18867F2971D3BFA678ADEFECCBBD43E0F086E6069EF56D19D12 -419718276E01E73B7FC3BD76767A268563AEEA1AAC7AAC8D737C104AAD0B6C5D -A0018E33DBB935977BF12FC2F61A9DD5A3DFDD35BD9DF5BE97777CB687CAB7BB -9FC9F26161BB792DF6983E655651E68CB0C3ED8F65285DCA2D5EFD185FB157E1 -FDCE8FA8F87ADEDACD227992D628EF15612B96D8010E76E18E777AD6347A61D3 -BE226AA9A45AC56929D19CC0B1A2A47E6EE5C1C631D715B5A87C55F0DE9FAA5F -5AB35FCB058EA969A45D5F25B2F9315CDCFD9FCA5C17DE47FA5C3921081B8FA1 -A93FE1687867FB5BEC9F69BDFB07F68FF64FF6C7D97FD0BED5B7FD5EFDF9FF00 -587C8DDB76F9DFBACEFF00968B3D134EEBC988E213EC7FF0875959DAA3AF8B96 -E14EDDA45CACBE67CC58E338DB9EA71C8AE9358D16D35EF89D1417B199605D23 -798C3ED0C44D8C1C751C938FA7E3D3F8B3C4BA4786B4C82F1B545512DFD959E5 -AD647199EEA2800C03EB2E33DBA904020ECF9DA563FE429FF92EF54A8CEFCBCA -FA746173C7F42B68B56F8516D6F79AA1D3A35BA658E6705938C908DFEC9C9FC7 -1F43BFF0DB559A7BABEB47B5B3648517FE261609B239B938078009C13FFD7AF4 -1F3B4ACFFC8481CF5FDC3D1E76958FF90A7FE4BBD52A15159F2BFB985EE47CF7 -E7FC8F6AF21BAD1E1B9F0EF8DEF5E49D658B52B9011252A840DA795EFD7F97E3 -EC5E76959FF909039EBFB87A3CED2B1FF214FF00C977FF003DE9CA8CE5F65FDC -C49D8F1FD5CDC5BC7E10BABB9122D1134C8577CF0996159B60FBEA3D46DC67DF -DEBAAF86C204B4BF6B6D4A3D42079F7AAC30B4491647206EEB9C76FEB5DB79DA -567FE42439EBFB87A512E95D3FB53FF25DFF00CF7A51A134EFCAFEE655F4B1E2 -FA8A32F847C7E5948CEAD9CE3AFF00A42FB7F9FE7A1E134D3C78D34A6D0DA692 -3166E35173BB96C71B89EF9FE9F8FA3F88348D0BC49A4CFA75D6AAE90CFB4B34 -50B061B5830C1208EA3D2AFC1FD910431C4BAA12A8A141303E7038A8FABD4BDF -95FDCC2FB995ACE7F739F7FE959B5ABAE35A3F906D6E7ED07E6DFF00BB2BB7A6 -3AF5EFF956557D2E15354629AFEAE64C28A28AEA10514514005145382E793C0A -0040326942E339FE74B81C7AE3A7E14FCF7CE307F2E9EFEDFE7B2B80DCE47B7F -9FF3FE783254F1D47B8A4E38F5C74FC29F9EF9C60FE5D3DFDBFCF64037391EDF -E7FCFF009E0C953C751EE2938E3D71D3F0A90039FD460F4FF38FF3D801A32C3D -BDCFF9FF003FA3D54019FE9FE7D0FF009E8EE99EDCFD3BFE1E9FA7E4D1D3A76F -F3FE7FC840F4140DA7D3FC8F7FF3FC8C02067F91FF003DBFCF65C91EDCFF005F -C3D3F4F6E1A3A74EDFE7FCFF009081E87C31FF00054418D7BE1B8F4D3AE7FF00 -428A8A3FE0A8BC6BDF0E3FEC1F73FF00A1C7457E435BF8B2F5677AD8FBBAF702 -F67EDFBC6EFEFF005FF3FCA1C02067F91FF3DBFCF69EF09FB5CFCFFCB43FFA11 -FF000FD3F2AE3A74EDFE7FCFF91FAC50FE147D17E470BDC50369F4FF0023DFFC -FF002300819FE47FCF6FF3D97247B73FD7F0F4FD3DB868E9D3B7F9FF003FE46C -27A0A06D3E9FE47BFF009FE4601033FC8FF9EDFE7B2E48F6E7FAFE1E9FA7B70D -1D3A76FF003FE7FC801E82E00E0E3D0FE9EFFE7F92051C1071F41FE7D0FF009E -8EC91EDCFF005FC3D3F4F6E1A3A74EDFE7FCFF009003D06B291919C81EBFE7FC -FF0026E4A9E3A8F7153648F6E7FAFE1E9FA7B70D1C63D7FCFF009FF3C306479C -8F6FF3FE7FCF064A9E3A8F714FF2C7B8EDCFF9FF003FCB9BB3F893E11D47C447 -40B4F1568B75AEACB24274B835185EE95E304C8BE507DDB942B6E18E369CE307 -09CA31B5DEE163A1CE47B7F9FF003FE783254F1D47B8AE72CFE24784750F11B7 -87ED7C53A2DCEBCB2490B6950EA30BDC878C12E8620C5832ED6C8C646D39C60E -3A5CF7CE307F2E9EFEDFE7B119465F0BB83D06E723DBFCFF009FF3C215193FE2 -2B0F4AF1D786B5DD72EF45D37C43A56A1ACD987FB4E9D697D14B7106C608FBE3 -562CBB588539030480706B612FEDA4BE96CD2E623790C693496EB20F323472CA -8E5739018C72007A1D8D8FBA702945EA980FDBC02293A53B8E3D71D3F0AA779A -EE99A78BEFB5EA3696A2C6DC5DDD89A754FB3407762593246D43E549F31C0FDD -B7F74E29B4B702CD15CF7873E247843C657CF65A078AB44D6EF522333DB69BA8 -C37122A02A0B9546240CB019E9923D6A6F0CF8E7C37E351727C3BE22D275F16B -B7CFFECCBE8AE3CADD9DBBB631DB9DAD8CF5DA7D0D4AA9095AD25A8ECCDBA2A8 -CDAEE9B6D6FA94F36A369141A667EDD2BCEA16D311ACA7CD24E1311B2BFCD8F9 -581E841A9DEFEDA3BE86C9EE225BC9A379A3B72E048E88543B2AF52AA644048E -0175CF515774227A28A298051451400570DF10BFE46EF863FF006314DFFA69D4 -6BB9AE1FE217FC8DDF0C7FEC629BFF004D3A8D635BE15EABF34347715E7FE1CD -1FC5DAA78D5F56F17E99A2C3676919FEC98B4DD566B9168E542BB98DEDA20D2B -869479DBB2A988D1177CCD27576DE23B6BAF156A3A0224A2F2C6CADAFA472079 -6527927440A739DC0DB3E7200C15C139382DBC476D75E29D474044945E58D95B -5F48E40F2CA4EF3A20539CEE06D9F390060AE09C9C12E59B8BBF5FBDAFF2B01E -63E03F82F2F8335FD0058E8FA568F63A1EE87FB6E2D464BCD5758B6581E08A0B -A2D6F1ED4F9A2976F98E886DE2444DAAA52F7847E1F78974E8BC07A3EA51E950 -E8FE0CDBF66D42D6F6496E350F2ECA6B34DF03428B06E598C8712C9B4A041B81 -DE3A4D2EFAE64F8C3E27B27B895ACE1D0B499A3B767263477B8D443BAAF40CC2 -38C123921173D056E5B788EDAEBC53A8E808928BCB1B2B6BE91C81E5949DE744 -0A739DC0DB3E7200C15C13938E7A7469A4ADA6AFF0FF00F646DB3568ACAB6F11 -DB5D78AB51D0123945E58D95B5F48EC0796527927440A739DC0DB3E7200C15C1 -39382DBC476D75E29D474044945E58D95B5F48E40F2CA4EF3A20539CEE06D9F3 -90060AE09C9C7673C7B9272BE1CD1FC5DAA78D5F56F17E99A2C5676919FEC98B -4DD566BA168E542BB98DEDA20D2B869479DBB2A984445DF3349CDF80FE0C4BE0 -CD7F40163A3E95A3D8E87BA1FEDB8B5192EF55D62D960782282E8B5BC7B53E68 -A5DBE63A21B7891136AA94F4EB6F11DB5D78AB51D0123945E58D95B5F48EC079 -6527927440A739DC0DB3E7200C15C13938C3D2EFAE64F8C1E27B27B895ACE1D0 -7499A3B72E4C68EF71A887655E819847182472422E7A0AE474E178B7ABBBD74D -F7EDE5FA6C55D9462F0B6B977E35D2AEDF4AD17C3FA4E917B79731DCE997AF2D -CDF24EB2078A58BECF1AC6B249225C3E249019204C863875EFEB2ADBC476D75E -2AD474048E517963656D7D23B01E5949E49D1029CE77036CF9C80305704E4E0B -6F11DB5D78A751D0112517963656D7D23903CB293BCE8814E73B81B67CE40182 -B827271BC3961B3DDFF5F908D5AF3FF0E68FE2ED53C6AFAB78BF4CD161B3B48C -FF0064C5A6EAB35C8B472A15DCC6F6D10695C34A3CEDD954C4688BBE6693ABB6 -F11DB5D78AB51D0123945E58D95B5F48EC0796527927440A739DC0DB3E7200C1 -5C13938C3F16FC49B6F0CB6BB69159CB7BAB69D65677105B1611C77735E4F35B -DA5BAC9CEC2F343B0B32ED50EAC4E0361547076937A2FD3FCAC08D5B4F0CF97E -2FBFF105D5CFDAA792DE3B2B387CBC2D9C00EF902E493BE490E5D86D0CB140A5 -7316E6E1BC23F0FBC4BA745E03D1F528F4A8747F066DFB36A16B7B24B71A8797 -65359A6F81A1458372CC6438964DA5020DC0EF195F0AADEE7C07F187C47E0BD4 -FC4F2EB57175A158EB96B6E6D8C31ABB5C5D0D4265505955A5B9904A46410265 -451B2218F55B6F11DB5D78A751D0112517963656D7D23903CB293BCE8814E73B -81B67CE40182B8272718C392AA526ACEEF4F3BDFF4BFA0DE86AD159573E23B6B -5F1569FA03C729BCBEB2B9BE8DC01E584824811C31CE7713731E3008C06C9181 -92E7C476D6BE29D3B407494DE5F595CDF46EA07961207811C31CE7713731E300 -8C06C91819EBE78AEBE449CADC68FE2EF1078F6D5F5AD33453E0EB290CB6D0C1 -AACCF33CCACCD15C4D09B60AE5711148FCC0B1B6E9332BAC463E8AEFC33FDA1E -2FB0D6AEAE7CD834EB7923B3B2D9F2A4F21C4970C4920B88D7CB420295596704 -B0970B62E7C476D6BE2AD3F4078E53797D65737D1B803CB090490238639CEE26 -E63C601180D92303387AA5F5CC7F183C31649712AD9CDA0EAD3496EAE446EE97 -1A704665E859448E013C80ED8EA6B06A314EFAEABF4B7DC328F897C2DAE6B9E2 -1862B4D2B45D2F4C4D56D3556D761BD7FED0678BCBDF9805B81BA4891AD4B79F -9F29CE723F767BFACAB9F11DB5AF8AB4ED01D253797D65737D1B803CB0904902 -38639CEE26E63C601180D9230325CF88EDAD7C53A7680E929BCBEB2B9BE8DC01 -E58481E0470C739DC4DCA63008C06C91819B8F2C1B77EBFD7E606AD79FDC68FE -2EF1078F6D5F5AD3345FF843ACA432DB4306AB33CCF32B3345713426D82BB2E2 -2291F981636DD26657588C7D5DCF88EDAD7C55A7680F1CA6F2FACAE6FA370079 -61207811C31CE7713731E3008C06C918192E7C476D6BE29D3B406494DE5F595C -DF46EA07961207811C31CE77137298C02301B2460649F2CB77B35FF0C0798EB3 -F0CBC4B7BE2C8F515D37C3F797C9ACC1791F8B6E2FA58F53B7B15BA491AD2288 -5B308D3C80F6E5526559373C8E034B2037BFE15F7897C8FF008473CAD2BFE11D -FF00848BFB7FFB5FEDB27DAFFE427FDA3E57D97C9D9F7FF73BBCFF00BBFBCC67 -F775D26A97F731FC61F0C5925C4AB673683AB4D25B87223774B8D382332F42CA -247009E4076C7535B973E23B6B5F14E9DA03A4A6F2FACAE6FA37007961207811 -C31CE77137298C02301B2460679D52A7796BE5F7DB4F9DF7DFCC776739F18FFE -451D3FFEC62D0BFF004ED695DC570FF18FFE451D3FFEC62D0BFF004ED695DC57 -42FE2CBD17E6C5D028A28AD847997C7BF0BF867C51A0E82BE2DF12E9FE18D26C -B55173E7EA4968D1DC3FD9AE235880BB578B77EF0BFCC8E7119C0070CB0681E2 -9FEC2F83B62FA0691A5586A375713699A25969F6DE5585DCED7124715D470A1C -8B69154DE36C2E5602EE1A4DBB8FAA551BBD12CAFF0054B0D42E21F3AEAC3CC3 -6C5DD8AC4CEBB59C2676EFDBB943E37057914101DC1E59517CEEA45D9B56FC8A -BF4387F893E1FF000ADA7C347D2BC59ADE95146FE625A6B3E3116F74B1DFBA48 -567D93E2267059D846A1542828AAA8368F38D2E1F06DA691F0FAD7C4FA6F87F4 -BF87D6BA76AF6B0A6A4A8BA3DC5CC7776C96B749E79652F3C2B733C6599DCA4D -290F202EEDF46D51FEDDD37FB0FF00B6BFB46D3FB1FECFF6CFED0F3D7ECFE46D -DFE6F999DBB36FCDBB38C739C5454C3C652E6BA5A76ECD3EFE4099E65E0DF11D -CF87BE15E8361A424535CDEEAB71A2F8716605A1FB125CCE2DA60411E6C51D84 -3E7825C199620049BA40C60F899E158B49B7F080D561D2BC5DE1DD2B4EB9B19E -D3C63A8C6A6E2E4470B4578E658DA391E38EDEE5E59301D6379DD15CE636EFFC -53A8F85BC2B7D61E24F116A7A7E8B2C11CBA75B5F6A57AB6F1E2631C8F18DEC1 -4B37D990F7388CE303767557FB37C4DA5DACEBF64D574E9FC9BCB7946D9A1930 -CB2C52A1E41C3047561DC020F434BD8F345D372D5256F95B75E6FF0000BF53E7 -9F974DF86FF0D6E7E29DCE8BA9DCAE833AC9A278D7528236B9BE924B4F266905 -C4683741179C247D8F2C625651E7B312FED5F09FFB4BFE1567837FB6BED7FDB1 -FD8D67F6DFB7EEFB479FE42799E6EEF9B7EECEEDDCE739E6BA4BEBEB6D2ECAE2 -F2F2E22B4B3B78DA69AE277091C51A8259D98F0AA002493C002A8F88FC55A278 -3AC52F75FD634FD0ECDE410A5C6A5751DBC6D2104840CE402D85638EB853E869 -D3A2A8CB99CBA25F92BB7F206EE729F1EFC2EDE2DF83DE2EB28A3D42E2F174AB -C92D6DF4DB89E29269BECF2048CAC4C0CAAC5B1E536E5638CA9E2B8EF8DB1C57 -BE37D3E0F12EABE0AD1BC2D169C5EC8F8D047756F7778D291362D1E6883BC51A -41B66DCBE589E55DB279A4C5EE5B6B27C49E2BD13C1B64979AFEB3A7E8766F20 -852E352BA4B78D9C8242867201385638EB807D29D6A319DE4DDAF6FC2FBEDDFB -827630B46D6AFC780BC217BE445E1E6BA8EC05DC1AFDCCB2CD6824541E4167C3 -CB70CEC90832329DCFBCEF65F2DF87F8FCBE2BD4B53F0E5BE99E1BD6B53D174D -D574AD55A5D166B7CDD4C97E9BA09924991844918F33EEB29768D99E25818BFA -EEA834C84D9DDEA7F644FB3DC27D9A7BA2A3CB9E4CC29B19BEEBB79A6318E4F9 -857F8B156AF2FEDB4D8566BAB98AD2132C70ABCD204064775445049196676550 -3A92C00E4D3A94B9E0E9CA5615EC785FC5BF061F19FC45D6A0D4AC745D5F49B6 -F0C41736FA66BBA5CF7725C1135D8BB163244FE65BC9B4DAABC91472B82F6C76 -92115BDCEC2E64BAB2B7B896D65B19A48D647B69D90C90B10094628CCBB949C1 -DAC4641C1239AA1AED8687A94DA4C5ACDBE9F7532DE2CDA7477C91B917488CEA -D086CE2554591815F980563C007167FB7B4CFB67D97FB4AD45D0B9FB1F91E7AE -F13F9426F2B6E73BFCAFDE6DEBB3E6C639053A6A9CE52BEFFD7FC303773C6FE3 -15D781F5FF00170F0ECDAEE94FE3DD46DD34ED312FEEE0DDE1F9096617B006F9 -E2B963710945422499A2B7C6D58DE58F9CFDA261B1D27C45E24BA36DE1AD63C5 -7A8E8291F879AF350862D6F4EBA4FB4795F6388A6F20B9DD1343999AE18213B3 -6B5BFD19657D6BA8C465B4B886EA35924859E1903A874628E8482795756523A8 -2A41C11C5A193D33C7E9D39EBEDFE7B63530DED14B55AF97FC1D77DC77B0DCE4 -7B7F9FF3FE7870521BB81D723FCFF9C7E4A230339F61DFFCF6FF003D9474E9DB -FCFF009FF23B89D85036F19E87FC3FCFF9E0C02067F91FF3DBFCF65C91EDCFF5 -FC3D3F4F6E1A3A74EDFE7FCFF9081E8281B4FA7F91EFFE7F918040CFF23FE7B7 -F9ECB923DB9FEBF87A7E9EDC205E06781EBC7F9FF3F900006D38EFFF00EAF7FF -003FC94283827047D7FCFA7F9ECF51F8E3F4E7FF00ADFA7E403803271E9DBFAF -F9FE4AE3D0F84FFE0A8831AEFC3707A8D3AE7FF428A8A3FE0A8DC6BFF0E3B7FC -4BEE7FF438E8AFC8AB7F165EAFF33B96C8FBBAF702F67EDFBC6EFEFF005FF3FC -A10030EBD3D7FCFB7F9ED6AEF9BC9FBFEF0F43FED7D7DBF4FCA1070064E3D3B7 -F5FF003FCBF57A0FF751F45F91C4F7635632A4763FFEAFF3FE78005E3B81EFFE -7D3FCF6781CF4E9EFD39FF00EB7E9F9203803271E9DBFAFF009FE5B5C900B8C0 -2307DBF0FF003FE7866D040E4607A9FF003E9FE7B48073D3A7BF4E7FFADFA7E4 -80E00C9C7A76FEBFE7F92019B0A9E98FF23DFF00CFF24C02067F91FF003DBFCF -6940E7A74F7E9CFF00F5BF4FC9B81804E33EB8FF003FE7F47701806D3E9FE47B -FF009FE4601033FC8FF9EDFE7B3F69E707BFE5CFF9FCBF28F0401918E3FCFF00 -9FF21868281B4FA7F91EFF00E7F9798497CDA9FC64D36FB488F5B9E4863974AD -521D4B489E0B1B5B44599CCF6D3CB0A0695EE16DA36F2A4659230AC508895E3F -50C91EDCFF005FC3D3F4F6E1A3A74EDFE7FCFF00919CE0E76D76771E88F3092F -8EA7F19B4EBDD222D6A79618E5D2B558752D267B7B1B6B5512B99EDA79A140D2 -BDC2DB23795232C9185628444AF1EAF863C2FE2DB1F897E27D6356F107DB3C35 -35B416FA3E9D1B0CAE1E596579D7CB015D5A4F291A36F9A244F3373A861DE648 -F6E7FAFE1E9FA7B70D1D3A76FF003FE7FC888D2D6EDF5BFE16FEBCC1BB1E41F0 -EE7D33C4DACE95610693ADE89A3784E331E83A66A5A35F5A80238DAD7ED124F3 -C4A1898A4748E10E4EC767932E42DBF47E19F049F0E7C55F16EB36D67E4D96AD -A769FBAEDA60EF717493DF34BB8962FF002A4D02AE7854088B858C2AF7D923DB -9FEBF87A7E9EDC37B01E9CF07FCFF91F910A295B9B74EFF85BF206CA96DA85B5 -ECB750C17314F25AC821B88E370C6190A2B84703EE9D8E8D83838653D08AE3BC -33E078BC33F153C5BAC5869169A6E9FAB69DA7979AD1228BED37893DF3CEEE17 -04BE26849761939EA769C776D1F5238ED83DFF00CE3FCF6307AFF2EDD3DFFCFF -002D5C149A6FA7FC37EA1B1C559595D59F8B3C59E27D6ADE630DA46967A52C11 -9B83F625852699E389033F9924ED2232A805C5ADB8D84A06387F0D2EE1F15F8A -EF759167ADD841A2D92E8DA55BEBB63796F3884C999AE1A5B84532B4C60B7E0B -48C8B0233323CCE8BE9BC71EB8E9F853F3DF38C1FCBA7BFB7F9ED1ECB55AE9AB -0B9C67C50F0B49AE7C30F1DE99A358C4DAAEB5A55E44A91848DAE6E5ED4C285D -8E0670B1A6E63C055190071CD7853C0DAD7867E2669368B67BBC21A168B7B61A -55EF9D1931C12BE9E61B571B83B3C66DAE006D98F2C43B9DE4321AF55E38F5C7 -4FC29F9EF9C60FE5D3DFDBFCF6254632929F5D3F077FCC2F622DA719A4A7F1C7 -AE3A7E14E201E4FF009FF3FE7DBA2E222A29DB7DF9A361C76A6036B80F8AB74D -A5EABE01D55ECF50BCB3D3F5E926BA3A6D84F7B2448DA6DF4418C70A3BEDDF22 -2E40C02C335DFD159CE3CF1B7A7E0EE3478EE9DF1234E83E29F887589349F152 -E9D77A3699690CDFF089EA8774B14F7ED22EDFB364616788E48C1DDC6707069D -F1234E83E29F887589349F152E9D77A3699690CDFF00089EA8774B14F7ED22ED -FB364616788E48C1DDC67071EC54560A95456F7968DBDBBDFCFCC77478EE9DF1 -234E83E29F887589349F152E9D77A3699690CDFF00089EA8774B14F7ED22EDFB -364616788E48C1DDC6707069DF1234E83E29F887589349F152E9D77A3699690C -DFF089EA8774B14F7ED22EDFB364616788E48C1DDC67071EC5450A95456F7968 -DBDBBDFCFCC2E8F1DD3BE2469D07C53F10EB12693E2A5D3AEF46D32D219BFE11 -3D50EE9629EFDA45DBF66C8C2CF11C9183BB8CE0E0D3BE2469D07C53F10EB126 -93E2A5D3AEF46D32D219BFE113D50EE9629EFDA45DBF66C8C2CF11C9183BB8CE -0E3D8A8A152A8ADEF2D1B7B77BF9F985D1E3BA77C48D3A0F8A7E21D624D27C54 -BA75DE8DA65A4337FC227AA1DD2C53DFB48BB7ECD91859E23923077719C1C1A7 -7C48D3A0F8A7E21D624D27C54BA75DE8DA65A4337FC227AA1DD2C53DFB48BB7E -CD91859E23923077719C1C7B15142A5515BDE5A36F6EF7F3F30BA3C774EF891A -741F14FC43AC49A4F8A974EBBD1B4CB4866FF844F543BA58A7BF69176FD9B230 -B3C472460EEE3383834EF891A741F14FC43AC49A4F8A974EBBD1B4CB4866FF00 -844F543BA58A7BF69176FD9B230B3C472460EEE33838F62A2854AA2B7BCB46DE -DDEFE7E617478EE9DF1234E83E29F887589349F152E9D77A3699690CDFF089EA -8774B14F7ED22EDFB364616788E48C1DDC67071872F88B4ED47E3D3F8AEEACBC -54344B2D1AD23B487FE10FD53F797EB25F299770B7DC3CB82EA45DA4156FB4E7 -EF4631EFD454BA13692725A3BEDD7EFF0030B9F3978D7C5B1DDF8DF5AF13E97A -1F8AA6BED3F4ED2EE747FF008A57535FB4DD5BCBA8F9F6DF35BE13CD82E8C3E6 -382A9F68DE32D1F1D5E9DF1234E83E29F887589349F152E9D77A3699690CDFF0 -89EA8774B14F7ED22EDFB364616788E48C1DDC67071EC54528D09C65CCA4B7BE -DEBE7E7F820BA3C7751F891A74FF0014FC3DAC47A4F8A9B4EB4D1B53B49A6FF8 -44F541B65967B068D76FD9B272B04A720606DE71919351F891A74FF14FC3DAC4 -7A4F8A9B4EB4D1B53B49A6FF00844F541B65967B068D76FD9B272B04A720606D -E71919F62A2ADD1A8EFEF2D5A7B76B79F905D1E3BA8FC48D3A7F8A7E1ED623D2 -7C54DA75A68DA9DA4D37FC227AA0DB2CB3D8346BB7ECD93958253903036F38C8 -C9A8FC48D3A7F8A7E1ED623D27C54DA75A68DA9DA4D37FC227AA0DB2CB3D8346 -BB7ECD93958253903036F38C8CFB15143A351DFDE5AB4F6ED6F3F20BA3C7751F -891A74FF0014FC3DAC47A4F8A9B4EB4D1B53B49A6FF844F541B65967B068D76F -D9B272B04A720606DE71919351F891A74FF14FC3DAC47A4F8A9B4EB4D1B53B49 -A6FF00844F541B65967B068D76FD9B272B04A720606DE71919F62A28746A3BFB -CB569EDDADE7E417478EEA3F1234E9FE29F87B588F49F15369D69A36A76934DF -F089EA836CB2CF60D1AEDFB364E56094E40C0DBCE32326A3F1234E9FE29F87B5 -88F49F15369D69A36A76934DFF00089EA836CB2CF60D1AEDFB364E56094E40C0 -DBCE3233EC6064D2EC38CF4FAD274AA3BFBCB569EDDADE7E417478DEA3F1234E -9FE29F87B588F49F15369D69A36A76934DFF00089EA836CB2CF60D1AEDFB364E -56094E40C0DBCE32326A3F1234E9FE29F87B588F49F15369D69A36A76934DFF0 -89EA836CB2CF60D1AEDFB364E56094E40C0DBCE3233EC9B7DF9A5D83AE78CD0E -95477F796AD3DBB5BCFC82E8F21F1E78F2C7C63A5697A5695A5F8965BC935ED1 -E6027F0CEA56F1AA45A95B4B2334925BAA2AAA23B12C40C0AF5BA7E071EBE9F8 -53B001CF4E7F2FD7FCFF002DA116A4E52776FE5FABEE2647460F3EDEB4EE38F5 -C74FC29F9EF9C60FE5D3DFDBFCF6D6E2230A48AC3F13D8F896E8DBFF00C23DAB -E93A5EDDDE7FF69E9925EF999DBB76ECB987663E6CE776723A60E7778E3D71D3 -F0A7E7BE7183F974F7F6FF003DA64B995986C73E3C3435FF000BFF006578BE2D -2BC47E77FC7D47FD9DB2D26C3EE4FDC4AF2E36E13AB37CCB918E8380BDF871A8 -6A3FB29AF82AEF4A8AEB5E5F0847A78D3E6789D45EA5A2AA2EE27665665521F3 -80543023191EB9C71EB8E9F853F3DF38C1FCBA7BFB7F9ED94E8C67BF66BE4C77 -B1E7BE35BA3E1DF88BE1AF11DCD96A171A45BE93A969F2C9A6D84F7D224D34D6 -5246A62811E4DA56DE6F9F6ED054024165079C8FC29E33BCF8376F69E14BEFF8 -4775CB6D6A4D434BB7D40BDBDBB582EA4F2DB5ACEAA8658A1FB29897C9508CA1 -5636DAA1D2BD8B8E3D71D3F0A7E7BE7183F974F7F6FF003DA25414A526DEFF00 -ADBAFC82F63C4FF683F00F8DBC7BE01BAF0B6956DA7EBFA3BE9520B86BFD4BEC -97D7B7AAB981B096FE56D57459480D107708098E357593ABD4A4B9D33E23F857 -5BD7228AD20934A9F4A12DB4C5E0B5BD9E6B56F25E42A0BACA615589CAC40344 -54EE7B88913BEE38F5C74FC29F9EF9C60FE5D3DFDBFCF65EC17339DF576FC36F -EBE7B85FA1C67C1CB1B9D3BE16F866DEEADE6B13F62478B4EB842B269F0B7CD0 -D9BE406630465212EC03398B7300490394F897657F65F11ECB5BB8D7F5BD234D -4D28D9D81F0D6832EA5789334DBEE77916D3C71C4EA96980E85CB43F23461641 -27ADF1C7AE3A7E14FCF7CE307F2E9EFEDFE7B54A8DE9A827B5BF0F4682FA9E0B -E36F097C49D7FC33F0EE2D3742D16D2DB4B8F4ABBD434283547B18E2BD8AEAD6 -428A91C4E86DE1486650BE6302240C11DE18F77A3FC54F0AC9E2AD134A8EDAC6 -1BEBDB0D7B49D461326C0D0086FA17964466C6D610F9C38E482CA339C5762460 -E0F07A11F853B3DF38C1FCBA7BFB7F9ED2B0F14A49B6F995BEE1DCAD71636D7B -25ACB3DBC53C96B219ADDE540C6190A32164247CA763BAE460E1987426BC3BC7 -9F0F3C6371F16A5BFD16D6593C390CB69E291345791C33C9AAC525ADB4B6D1FC -EADB5B4E8268D55F1196B97DEE06DF2FDE02E791E9CF3C7F9FF3F4781FCBD7DB -FCFF009E975A8C6B2E57EBA093E539BF869E1ABAF07FC39F0AF87EFA48A4BBD2 -B4AB5B19DE06263692285118AEE00EDCA9C1201C761DBA600607A7D0FF009EDF -E7B2E48F6E7FAFE1E9FA7B70D1D3A76FF3FE7FC8D231518A8AE826281B4FA7F9 -1EFF00E7F918040CFF0023FE7B7F9ECB923DB9FEBF87A7E9EDC3474E9DBFCFF9 -FF002183D050369F4FF23DFF00CFF2382067F5FF003EDFE7B394127D81FCB9FF -003F97E4AA0201C807D7A67F5FF3FC8B802C7B5BDFDBF0FF003FE7850D8C1C8C -7720E3D3FC3FCF65039E9D3DFA73FF00D6FD3F24070064E3D3B7F5FF003FCA46 -2F3C039CFA7E5FE7FCF081B183918EE41C7A7F87F9ECA073D3A7BF4E7FFADFA7 -E483381CF3DBFCE7FCFF00200F84FF00E0A8B9FEDEF8719EBFD9F739FF00BEE3 -A28FF82A371AFF00C38EDFF12FB9FF00D0E3A2BF23ADFC597AB3B96C7DE7787F -D326EBFEB0FF003FF3FE7A401B183918EE41C7A7F87F9ED3DDAE6F263FED9E7F -1FFEB7F9ED1AA90393F971FE7FCFE1FAB51FE147D17E4713DD8DE780739F4FCB -FCFF009E117270473EA47E1FE1FE7B48140FF3FE7FC8FC97FCFF009FF3FF00D6 -D6E223E7BE7B67F4FF003FE7840D8C1C8C7720E3D3FC3FCF697FCFF9FF003FFD -64DA3E9F8FF9FF003FA17019CF00E73E9F97F9FF003C206C60E463B9071E9FE1 -FE7B3B663DFF00CFFF005BF4FC9BF74609C1FCBFAFF9FE4C05E780739F4FCBFC -FF009E1036307231DC838F4FF0FF003D940E7A74F7E9CFFF005BF4FC901C0193 -8F4EDFD7FCFF0020036F232307BE38F4FF003FE7866D071C8C7D7FCFA7F9ED20 -1CF4E9EFD39FFEB7E9F9203803271E9DBFAFF9FE408615D87D3FC8F7FF003FC9 -300819FE47FCF6FF003DA5039E9D3DFA73FF00D6FD3F26951B79C027BE3FCFF9 -FD1DC0601B4FA7F91EFF00E7F918040CFF0023FE7B7F9ECFDA7B738FD39FF3F9 -7E51E0803231C7F9FF003FE430D050369F4FF23DFF00CFF2300819FE47FCF6FF -003D97247B73FD7F0F4FD3DB868E9D3B7F9FF3FE400F402A3EE9FF003D3FCFF9 -E136E0641E7AF4FF003FE7F47E48F6E7FAFE1E9FA7B70D1D3A76FF003FE7FC86 -0F418411C1FC8FF9FF003FC93254F1D47B8A9B247B73FD7F0F4FD3DB8663A75E -3D0FF9FF0023F2018CCE47B7BFF9FF003FC8C953C751EE29C63C12474E983FE7 -DBFCF65C1EBFCBB74F7FF3FC980CCE47B7F9FF003FE783254F1D47B8A38C8F5C -74FC29D9EF9C73F974F7F6FF003D801B9C8F6FF3FE7FCF01EA7A71EE28E323D7 -1D3F0A767BE71CFE5D3DFDBFCF6006E011D290A8C9FF001A5EE3D71D3F0A767B -E71CFE5D3DFDBFCF6006050474A0A804FB7BD2F71EB8E9F853B3DF38C1FCBA7B -FB7F9EC00CDA08EF415009FF0011471C7AE3A7E14FCF7CE307F2E9EFEDFE7B00 -336823BD054027FC451C71EB8E9F853F3DF38C1FCBA7BFB7F9EC00CDA08EF415 -009FF11471C7AE3A7E14FCF7CE307F2E9EFEDFE7B00336823BD054027FC451C7 -1EB8E9F853F3DF38C1FCBA7BFB7F9EC00CDA08EF415009FF0011471C7AE3A7E1 -4FCF7CE307F2E9EFEDFE7B00336823BD054027FC451C71EB8E9F853F3DF38C1F -CBA7BFB7F9EC00CDA08EF415009F6F7A38E3D71D3F0A7E7BE7183F974F7F6FF3 -D801A00C74FCE8C953C751EE28EE3D71D3F0A767BE71CFE5D3DFDBFCF6006E72 -3DBFCFF9FF003C192A78EA3DC51C647AE3A7E14ECF7CE39FCBA7BFB7F9EC00DC -E47B7F9FF3FE783254F1D47B8A38C8F5C74FC29C327919E3F4E9CF5F6FF3D801 -B9C8F6FF003FE7FCF064A9E3A8F714BB0F718E39CF4FF3FE1F9380391CE3BF1D -BA7F87F9EC00CCE47B7F9FF3FE783254F1D47B8A7F97CF27DBFCE7E9FE7B007D -477E0F4FF38FF3D80199C8F6FF003FE7FCF064A9E3A8F7152796A33C7B73F5FC -3D3FCF6074C7F9FF003FE1F92023CE47B7F9FF003FE785C303900FAE7FCFF9E2 -A5C91EDCFF005FC3D3F4F6E1A3A74EDFE7FCFF009003D06956C60FE44FF9FF00 -3F4E1553A1C907D87F9FF3FA3F247B73FD7F0F4FD3DB868E9D3B7F9FF3FE400F -410A7627FCFF009FE5F92AA8183DFD71FE7D0FF9E8EC91EDCFF5FC3D3F4F6E1A -3A74EDFE7FCFF9003D05207438FF0038F7FF003FC8C02067F91FF3DBFCF65C91 -EDCFF5FC3D3F4F6E1A3A74EDFE7FCFF9081832F18F4EDFE7FCFF004455C61B27 -D7A7F9FF003FA3F247B73FD7F0F4FD3DB868E9D3B7F9FF003FE4307A0A06D3E9 -FE47BFF9FE4601033FC8FF009EDFE7B2E48F6E7FAFE1E9FA7B70D1D3A76FF3FE -7FC840F4140DA7D3FC8F7FF3FC8C02067F91FF003DBFCF65E7F5FEBF87A7E9ED -C0ABC0CE07D7BFF9FF003EC002AFCD81D7DBF0FF003FE78550060F5C77CFF9F4 -FF00F57678033D3A7A76E7FF00ADFA7E480E00C9C7A76FEBFE7F92B8F4179E01 -CE7D3F2FF3FE7840D8C1C8C7720E3D3FC3FCF65039E9D3DFA73FFD6FD3F24070 -064E3D3B7F5FF3FC900BCF00E73E9F97F9FF003C206C60E463B9071E9FE1FE7B -28193D3A7BF4E7FF00ADFA7E4E55C0193C8F4FF3FE7F90022827AF1EBFA7F9FF -003C38285FF3FE7D3FCF65FF003FE7FCFF00F58FF3FE7FCFFF005A40F83FFE0A -8FFF002307C39FFB07DCFF00E871D147FC151FFE460F873FF60FB9FF00D0E3A2 -BF25ADFC597AB3B96C7DEB77FF001F537FBEDFCFFCFF009E917F9FF3FE7FFAD2 -DDFF00C7D4DFEFB7F3FF003FE7A45FE7FCFF009FFEB7EA947F851F44713DC3FC -FF009FF3FF00D63FCFF9FF003FFD63FCFF009FF3FF00D65C75F6FF003FE7FCE3 -6013FCFF009FF3FF00D63FCFF9FF003FFD63A7F9FF003FE7F43FCFF9FF003FFD -6041FE7FCFF9FF00EB1FE7FCFF009FFEB1FE7FCFF9FF00EB1FE7FCFF009FFEB0 -0215CFF9FF003E9FE7B37695FF00EB71E9FE1FE7B3FF00CFF9FF003FFD63FCFF -009FF3FF00D66047CF00E73E9F97F9FF003C206C60E463B9071E9FE1FE7B4BFE -7FCFF9FF00EB34AFA71FE7FCFF009E85C06F3C039CFA7E5FE7FCF081B183918E -E41C7A7F87F9ECE2B83EBFFEBFF3F97E4DCED032707F2FEBFE7F930179E01CE7 -D3F2FF003FE7868231DB1DF91FE7B7F9ECE039E9D3DFA73FFD6FD3F24070064E -3D3B7F5FF3FC8013660F4C1F6FC3FCFF009E1BB7207208FAFF00F5FDBFCF6900 -E7A74F7E9CFF00F5BF4FC901C01938F4EDFD7FCFF277023C6C3E9FA7A7BFF9FE -4601033FC8FF009EDFE7B4A073D3A7BF4E7FFADFA7E4CD831C903F0C7F9FF3F8 -1710D0369F4FF23DFF00CFF2300819FE47FCF6FF003D9DB4F3EC7D7A73FE7F2F -C99D0631DBFCFF009FF21868281B4FA7F91EFF00E7F918040CFF0023FE7B7F9E -CB923DB9FEBF87A7E9EDC3474E9DBFCFF9FF002007A01503838FF38F7FF3FC80 -A3820E3E83FCFA1FF3D1D923DB9FEBF87A7E9EDC3474E9DBFCFF009FF2183D04 -65C0C673EC78FF003FFD6FC80A4723EBFCFF00C3FCF67E48F6E7FAFE1E9FA7B7 -0D1D3A76FF003FE7FC801E82152323238F53FE7FCFD386E181C807EBFE7FCF15 -2E48F6E7FAFE1E9FA7B70D1D3A76FF003FE7FC8018DDA7183F913FE7FCFD384C -303900FD7FCFF9E2A5C91EDCFF005FC3D3F4F6E1A3A74EDFE7FCFF009003D067 -38C1CFD0FF009FF3FC970C0E403C739FF3FE78FCA4C91EDCFF005FC3D3F4F6E1 -A3A74EDFE7FCFF009003D06738C1CFD0FF009FF3FC970C0E403C739FF3FE78FC -A4C91EDCFF005FC3D3F4F6E1A3A74EDFE7FCFF009003D06738C1CFD0FF009FF3 -FC970C0E403C739FF3FE78FCA4C91EDCFF005FC3D3F4F6E1A3A74EDFE7FCFF00 -9003D06738C1CFD0FF009FF3FC970C0E403C739FF3FE78FCA4C91EDCFF005FC3 -D3F4F6E1A3A74EDFE7FCFF009003D06738C1CFD0FF009FF3FC970C0E403C739F -F3FE78FCA4C91EDCFF005FC3D3F4F6E1A3A74EDFE7FCFF009003D06738C1CFD0 -FF009FF3FC970C0E403C739FF3FE78FCA4C91EDCFF005FC3D3F4F6E1A3A74EDF -E7FCFF009003D06738C1CFD0FF009FF3FC970C0E403C739FF3FE78FCA4C91EDC -FF005FC3D3F4F6E1A3A74EDFE7FCFF009003D06ED38C1FC89FF3FE7E9C2AAF39 -CE3BE71FE7D3FCF67E48F6E7FAFE1E9FA7B70D1D3A76FF003FE7FC801E8053B1 -3DFF00CFF9F6FC8550307BFAE3FCFA1FF3D1D923DB9FEBF87A7E9EDC3474E9DB -FCFF009FF2007A0B8DA71E9FFD6F7FF3FC8C02067F91FF003DBFCF65C91EDCFF -005FC3D3F4F6E1A3A74EDFE7FCFF0090818A06D3E9FE47BFF9FE4601033FC8FF -009EDFE7B2E48F6E7FAFE1E9FA7B70D1D3A76FF3FE7FC801E8281B4FA7F91EFF -00E7F918040CFF0023FE7B7F9ECB923DB9FEBF87A7E9EDC37A0FF3FE7FCFE403 -B2140DA7D3FC8F7FF3FC8C02067F91FF003DBFCF670C9CE3B1FCB9FC3D3FCF66 -85C28CE07D7FCFF9FE40001B4FA7F91EFF00E7F918040CFF0023FE7B7F9ECF0A -48EBCFA7A73FE7F2FC9BB001CB63F0FF003FE7F40040369F4FF23DFF00CFF230 -0819FE47FCF6FF003DA4001E31D31D3B7F9FE9EDC2000004E01EC718FF003FE7 -F05718C030D81D7DBF0F7FF3FC8182073F9FF9F6FF003DA5039E9D3DFA73FF00 -D6FD3F24070064E3D3B7F5FF003FC8B88688CAB6318FF23FCFF9E136E40E411F -5FFEBFB7F9ED201CF4E9EFD39FFEB7E9F9203803271E9DBFAFF9FE45C0458F69 -E460FB7E1FE7FCF0DC0C0E723FCFF87F9ED201CF4E9EFD39FF00EB7E9F927F08 -C91FD3F9FF009FE45C08C0DA7D3FC8F7FF003FC80030EA38F5FF003EDFE7B480 -73DCE3B71C73FE7F2FC8070064E3D3B7F5FF003FC8B8F4054DB8E3078CFE9FE7 -FCF006C60E463B9071E9FE1FE7B281CF4E9EFD39FF00EB7E9F9203803271E9DB -FAFF009FE4805E780739F4FCBFCFF9E1036307231DC838F4FF000FF3D940E7A7 -4F7E9CFF00F5BF4FC850481CFF003C7F9FF3F40039E01CE7D3F2FF003FE78555 -3C76FF0023FC3FCF670500E7FCFF009FF3F45FF3FE7FCFFF00595C03FCFF009F -F3FF00D63FCFF9FF003FFD63FCFF009FF3FF00D63FCFF9FF003FFD6401FE7FCF -F9FF00EB1FE7FCFF009FFEB1FE7FCFF9FF00EB18FF003FE7FCFF00400F83FF00 -E0A8FF00F2307C39FF00B07DCFFE871D147FC151FF00E460F873FF0060FB9FFD -0E3A2BF25ADFC597AB3B96C7DEB77FF1F531CFF1B7F33FE7FCF1191F87F4FF00 -3FE7DA5BB3FE953738F9DBA7D4FF009FF3C45EBD07B67FCFF9FD3F53A3FC28FA -2391EE19EBCE3FCFF9FF003D03FE7DBFCFF9F609F73FE7FCFF009EC7AF41ED9F -F3FE7F4D8419EBCE3FCFF9FF003D03FE7DBFCFF9F609F73FE7FCFF009EC7AF41 -ED9FF3FE7F40038EBD3FCFF9FF003D108C7F9FF3FE7F4527DCFF009FF3FE7B1E -BD07B67FCFF9FD00B09FE7FCFF009FFEB1FE7FCFF9FF00EB29C7AFF9FF003FE7 -D0C75F6FF3FE7FCE18AC27F9FF003FE7FF00AC7F9FF3FE7FFAC74FF3FE7FCFE8 -7F9FF3FE7FFAC083FCFF009FF3FF00D63FCFF9FF003FFD63FCFF009FF3FF00D6 -3FCFF9FF003FFD60042BEE7D7FCFE5FE7B30295238FAE3F0FF000FF3DA4FF3FE -7FCFFF0058FF003FE7FCFF00F59811F3C039CFA7E5FE7FCF081B183918EE41C7 -A7F87F9ED2100FF9FF003FE7F442BE9C7F9FF3FE7A1701BCF00E73E9F97F9FF3 -C206C60E463B9071E9FE1FE7B2EDC1E87FC9FF00EB7E9F9203803271E9DBFAFF -009FE4C05E780739F4FCBFCFF9E1A08C76C77E47B7F87F9ECE039E9D3DFA73FF -00D6FD3F24070064E3D3B7F5FF003FC80102608E307BE38F4FF3FE786ED040E4 -607A9FF3E9FE7B48073D3A7BF4E7FF00ADFA7E480E00C9C7A76FEBFE7F900302 -15238E7DBF0FF3FE7841823E9EC7FCF6FF003DA5039E9D3DFA73FF00D6FD3F24 -070064E3D3B7F5FF003FC9DC44606D3E9FE47BFF009FE4601033FC8FF9EDFE7B -4A073D3A7BF4E7FF00ADFA7E4DDAA00CE33F4C7F9FF3F81701806D3E9FE47BFF -009FE4601033FC8FF9EDFE7B4800E98E98E87A7F9FE9F920550A338FAE3FCFF9 -FD0B80C0369F4FF23DFF00CFF2300819FE47FCF6FF003DA5C03DBBF6EDFE7FA7 -B70CD8001C81F87F9FF3FA1701A06D3E9FE47BFF009FE4601033FC8FF9EDFE7B -481793C93EDD31CFF9FCBDB866C0072D8FC3FCFF009FD1DC040369F4FF0023DF -FCFF002300819FE47FCF6FF3D9FB7D09FF000E7DBFCF1F926C50064E3F0FF3FE -7F42E0340DA7D3FC8F7FF3FC8C02067F91FF003DBFCF67EDF427FC39F6FF003C -7E49B1401938FC3FCFF9FD0B80D0369F4FF23DFF00CFF2300819FE47FCF6FF00 -3D9FB7D09FF0E7DBFCF1F926C50064E3F0FF003FE7F42E0340DA7D3FC8F7FF00 -3FC8C02067F91FF3DBFCF67EDF427FC39F6FF3C7E49B1401938FC3FCFF009FD0 -B80D0369F4FF0023DFFCFF002300819FE47FCF6FF3D9FB7D09FF000E7DBFCF1F -926C50064E3F0FF3FE7F42E0340DA7D3FC8F7FF3FC8C02067F91FF003DBFCF67 -EDF427FC39F6FF003C7E49B1401938FC3FCFF9FD0B80D0369F4FF23DFF00CFF2 -300819FE47FCF6FF003DA40BC9E49F6E98E7FCFE5EDC342A80338CFD3FCFF9FD -15C0681B4FA7F91EFF00E7F903040C9FCFFCFB7F9ED2803D3A7A76E7FF00ADFA -7E480E00C9C7A76FEBFE7F91701810AB6318FF0023FCFF009E0DB9039047D7FF -00AFEDFE7B48073D3A7BF4E7FF00ADFA7E480E00C9C7A76FEBFE7F917188B1ED -C7041F6FC3FCFF009E1005E3B81EFF00E7D3FCF6781CF4E9EFD39FFEB7E9F920 -3803271E9DBFAFF9FE4AE200B8238C1EFF00A7F9FF003C01B183918EE41C7A7F -87F9ECA073D3A7BF4E7FFADFA7E480E00C9C7A76FEBFE7F903179E01CE7D3F2F -F3FE7840D8C1C8C7720E3D3FC3FCF65039E9D3DFA73FFD6FD3F24070064E3D3B -7F5FF3FC80179E01CE7D3F2FF3FE7840D8C1C8C7720E3D3FC3FCF65039E9D3DF -A73FFD6FD3F2419C0E79EDFE73FE7F9002F3C039CFA7E5FE7FCF081B183918EE -41C7A7F87F9ECA17D8FF0093FF00D6FD3F250A40EB823FCFF9FF0038004E7807 -39F4FCBFCFF9E1036307231DC838F4FF000FF3D9E139FF003FE7B7F9EC05C019 -3D3D38FF003FE7F02E0379E01CE7D3F2FF003FE7840D8C1C8C7720E3D3FC3FCF -67EC03FF00D7FE7D3FCF6774F6FF003FE7FCF457023E780739F4FCBFCFF9E000 -8C71FD3D3FC3FCF693FCFF009FF3FF00D63FCFF9FF003FFD62E047CF00E73E9F -97F9FF003C206C60E463B9071E9FE1FE7B48541FC3FCFF004FF3DA3FBA304E0F -E5FD7FCFF2602F3C039CFA7E5FE7FCF08A7A63F43FE7D3FCF6705E79047F9FFE -B7F9ECE03031FE7FCFF9FA2B821003819FCBFCFD3FCF6774F6FF003FE7FCF43F -CFF9FF003FFD63FCFF009FF3FF00D6401FE7FCFF009FFEB1FE7FCFF9FF00EB1F -E7FCFF009FFEB1FE7FCFF9FF00EB001FE7FCFF009FFEB1FE7FCFF9FF00EB18F5 -FF003FE7FCFB2FAF41ED9FF3FE7F4434838C7F9FF3FE7F20FF009F6FF3FE7D82 -7DCFF9FF003FE7B1EBD07B67FCFF009FD019F077FC151F9F10FC39FF00B07DD7 -FE871D147FC151FF00E461F873FF0060FBAFFD0E3A2BF26ADFC597AB3B16C7DE -D747173373FC67F99FF3FE788F6E4E3A7F4FF3FE7DA6BB27ED32F3C6F6A8BAB1 -E3BFF9FE55FA951FE147D11CD6D44F5E719E7F9FF9FF003C2951FE41A09200EC -31FD3F0A3AB1E3BFF9FE55B0B413D707AF3FCFFCFF009E0231D78FE9FE7FCFB2 -92401D863FA7E147563C77FF003FCA801B9EBCE3FCFF009FF3D03FE7DBFCFF00 -9F6539E0E48E3FA7F9FF003D0C75C7E43FCFF9FE4084CF5E71FE7FCFF9E81FF3 -EDFE7FCFB29C8E4923D0FF009FF3FD13D7A0F6CFF9FF003FA31067AF38FF003F -E7FCF408FC3FA7F9FF003EC13EE7FCFF009FF3D8F5E83DB3FE7FCFE8009DBFCF -F9FF003F90463FCFF9FF003FA293EE7FCFF9FF003D8F5E83DB3FE7FCFE80584F -F3FE7FCFFF0058FF003FE7FCFF00F5978FF3FE7FCFF24C7E9EFF00E7FCFE8C41 -FE7FCFF9FF00EB1FE7FCFF009FFEB1FE7FCFF9FF00EB1FE7FCFF009FFEB020FF -003FE7FCFF00F59303FCFF009F6FF3D97FCFF9FF003FFD63FCFF009FF3FF00D6 -0042BEE7D7FCFE5FE7B37691FE71E9FE1FE7B3FF00CFF9FF003FFD63FCFF009F -F3FF00D66047F3719CF6FE9FE7FCF081B183918EE41C7A7F87F9ED2FF9FF003F -E7FF00AC7F9FF3FE7FFAC5C08F9E01CE7D3F2FF3FE7840D8C1C8C7720E3D3FC3 -FCF67EC1FE4FF9F4FF003D902103AF4FF3FE7FCE1DC04E780739F4FCBFCFF9E1 -036307231DC838F4FF000FF3D9DB31FE7FCFA7F9EC6D60073CFB7FFAFF00CFF2 -004E780739F4FCBFCFF9E1036307231DC838F4FF000FF3D942FB1FF27FFADFA7 -E405603DC7A7FF00AFFCFF0020039E01CE7D3F2FF3FE7840D8C1C8C7720E3D3F -C3FCF65DB8EC7FC9FF003F97E40071EE3DB1FE7FCFE00073C039CFA7E5FE7FCF -081B183918EE41C7A7F87F9ECBB71D8FF93FE7F2FC8E40E4E31F80FE7FE7F900 -1CF00E73E9F97F9FF3C206C60E463B9071E9FE1FE7B281CF4E9EFD39FF00EB7E -9F9203803271E9DBFAFF009FE400BCF00E73E9F97F9FF3C206C60E463B9071E9 -FE1FE7B281CF4E9EFD39FF00EB7E9F9203803271E9DBFAFF009FE400BCF00E73 -E9F97F9FF3C206C60E463B9071E9FE1FE7B281CF4E9EFD39FF00EB7E9F920380 -3271E9DBFAFF009FE400BCF00E73E9F97F9FF3C206C60E463B9071E9FE1FE7B2 -81CF4E9EFD39FF00EB7E9F9203803271E9DBFAFF009FE400BCF00E73E9F97F9F -F3C206C60E463B9071E9FE1FE7B281CF4E9EFD39FF00EB7E9F9203803271E9DB -FAFF009FE400BCF00E73E9F97F9FF3C206C60E463B9071E9FE1FE7B281CF4E9E -FD39FF00EB7E9F9203803271E9DBFAFF009FE400BCF00E73E9F97F9FF3C206C6 -0E463B9071E9FE1FE7B281CF4E9EFD39FF00EB7E9F9001C7B8FC3FAFF9FE4007 -3C039CFA7E5FE7FCF081B183918EE41C7A7F87F9ECE09DFF00CFF9E3F4FC9429 -1D4F4F4E3FCFF9FC0B80DE780739F4FCBFCFF9E1036307231DC838F4FF000FF3 -D9FB00FF00F5FF009F4FF3D940C7F9FF003FE7F457019CF00E73E9F97F9FF3C0 -0118E3FA7A7F87F9ED27F9FF003FE7FF00AC7F9FF3FE7FFAC5C0600C7AFE3FA7 -F87F9EC04C77C7D3F0FF000FF3D9FF00E7FCFF009FFEB1FE7FCFF9FF00EB1701 -BB78E49FF3FF00EAFF003D97681EDFE7FF00ADFE7B2FF9FF003FE7FF00AC7F9F -F3FE7FFAC803FCFF009FF3FF00D63FCFF9FF003FFD63FCFF009FF3FF00D63FCF -F9FF003FFD6003FCFF009FF3FF00D63FCFF9FF003FFD63FCFF009FF3FF00D63F -CFF9FF003FFD6003FCFF009FF3FF00D63FCFF9FF003FFD63FCFF009FF3FF00D6 -3FCFF9FF003FFD6003FCFF009FF3FF00D63FCFF9FF003FFD63FCFF009FF3FF00 -D631FA7BFF009FF3FA030FF3FE7FCFFF0058FF003FE7FCFF00F58C7AFF009FF3 -FE7D971D7DBFCFF9FF0038004FF3FE7FCFFF0058FF003FE7FCFF00F5978FF3FE -7FCFF2423AF6FF003FE7FCF4003FCFF9FF003FFD63FCFF009FF3FF00D63FCFF9 -FF003FFD63FCFF009FF3FF00D6041FE7FCFF009FFEB1FE7FCFF9FF00EB1FE7FC -FF009FFEB2818CFB7F9FF3FE700C4FF3FE7FCFFF0059718E3FCFF9FF003F4338 -EF8F4FF3FE7FC0F5E83DB3FE7FCFE88760CF5E71FE7FCFF9E81FF3EDFE7FCFB0 -4FB9FF003FE7FCF63D7A0F6CFF009FF3FA0019EBCE3FCFF9FF003D03FE7DBFCF -F9F653EB93DF9FF3FE7FA281CF038FAFBD21DAE7C19FF0547E7C43F0E7FEC1F7 -5FFA1C7451FF000547FF009183E1CFFD83EE7FF438E8AFC9EB7F165EACEB5B1F -7BDD63ED331EFBDBF99F7A6119FF00F51A92EB26E66E78DED519039CF5F4AFD4 -A8FF000E3E88E7B0DE3B71FE4FBD388CF7FE74BD3F0EFDA83CF5EBE95A824338 -EDC7F93EF4E233FF00EA341E9EC3D3A5717A87C6BF879A56A173657DE3CF0C59 -DE5B4AD0CF6F71AC5B249148A70C8CA5F2AC082083C822A6538C7E276158ECB8 -EDC7F93EF4E233FF00EA35C1FF00C2FBF867803FE163784FA7FD072D7D3FDFA5 -3F1EFE19673FF0B17C25D7FE8396BFFC5D47B6A7FCCBEF048EE78EDC7F93EF4A -57B7F435CD786BE27783FC677CF63E1FF16687AEDE471199EDB4CD4A1B891631 -805CAA3121416519E9923D6BA5EAC78EFF00E7F9568A4A4AF17716827AE0F5E7 -F9FF009FF3C046383C7F4FF3FE7D949200EC31FD3F0A3AB1E3BFF9FE554161B9 -EBCE3FCFF9FF003D03FE7DBFCFF9F653D8E4FF009FF3FE7B0475C0FC07F9FF00 -3FC81099EBCE3FCFF9FF003D03FE7DBFCFF9F609F73FE7FCFF009EC7AF41ED9F -F3FE7F4620CF5E71FE7FCFF9E811F87F4FF3FE7D827DCFF9FF003FE7B1EBD07B -67FCFF009FD0013B7F9FF3FE7F208C7F9FF3FE7F4527DCFF009FF3FE7B1EBD07 -B67FCFF9FD00B09FE7FCFF009FFEB1FE7FCFF9FF00EB2939EA7FCFF9FF003E81 -1D7A0C7F9FF3FE700AC27F9FF3FE7FFAC7F9FF003FE7FF00ACB803BFF9FF003F -E7D131FA7BFF009FF3FA300FF3FE7FCFFF0058FF003FE7FCFF00F58FF3FE7FCF -FF0058FF003FE7FCFF00F58107F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003F -E7FF00AC7F9FF3FE7FFAC007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7 -FF00AC7F9FF3FE7FFAC007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF -00AC7F9FF3FE7FFAC007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF00 -AC7F9FF3FE7FFAC007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF00AC -7F9FF3FE7FFAC007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF00AC7F -9FF3FE7FFAC007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF00AC7F9F -F3FE7FFAC007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF00AC7F9FF3 -FE7FFAC007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF00AC7F9FF3FE -7FFAC007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF00AC7F9FF3FE7F -FAC007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF00AC7F9FF3FE7FFA -C007F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF00AC7F9FF3FE7FFAC0 -07F9FF003FE7FF00AC7F9FF3FE7FFAC7F9FF003FE7FF00AC63FCFF009FF3FD00 -0FF3FE7FCFFF0058FF003FE7FCFF00F58E9FE7FCFF009FD171D7DBFCFF009FF3 -80627F9FF3FE7FFAC7F9FF003FE7FF00ACB803BFF9FF003FE7D0F5E00C7F9FF3 -FE700584FF003FE7FCFF00F58FF3FE7FCFFF005949F73FE7FCFF009EC7AF41ED -9FF3FE7F441613FCFF009FF3FF00D65C63BFF9FF003FE7D027DCFF009FF3FE7B -1EBD07B67FCFF9FD01D84C7F9FF3FE7FA2E31C7F9FF3FE7E813EE7FCFF009FF3 -D8F5E83DB3FE7FCFE80071F4FE9FE7FCFB07FCFB7F9FF3EC13EE7FCFF9FF003D -8F5E83DB3FE7FCFE80067AF38FF3FE7FCF40FF009F6FF3FE7D827DCFF9FF003F -E7B1EBD07B67FCFF009FD000CF5E71FE7FCFF9E81FF3EDFE7FCFB04FB9FF003F -E7FCF65F5007E1FE7FCFF4004CF5E71FE7FCFF009E81FF003EDFE7FCFB29CF72 -47A1FF003FE7FA00673D07B0FF003FE7F9218D3EBD3FCFF9FF003D003FCFF9FF -003FD296BBAFE99E18D2E6D4F59D4AD748D3A0DBE6DE5F4EB0C51EE60ABB9D88 -0B96200C9EA45727FF000BEBE19F3FF1717C243DBFB72D7FF8E7F9FE512A9083 -B49A42B1DD6700F6FF003FE7FCF40FF9F6FF003FE7DB853F1EFE19FF00D146F0 -A7B7FC4F2D7FF8E7F9FE47FC2FAF867CFF00C5C5F090F6FEDCB5FF00E39FE7F9 -4FB6A5FCCBEF1D99DD67AF38FF003FE7FCF40FF9F6FF003FE7DB853F1EFE19FF -00D146F0A7B7FC4F2D7FF8E7F9FE5DA69F7D6BAB58DBDED8DC437765731ACD05 -C5BC8248A58D8655D581C329041047045546A425F0B4C2CC9B3D79C7F9FF003F -E7A3B6FF009C1E282481D4FF009147563C77FF003FCAAC684E393FE7BFBD388C -FF00FA8D212401D863FA7E147563C77FF3FCA81A3E0CFF0082A3FF00C8C3F0E7 -1D3FB3EEBFF438E8A3FE0A8FFF002307C39FFB07DCFF00E871D15F93D6FE2CBD -59D2B63EF9B9FF008F997FDF3FCCD479F4FC3EB525CFFC7CCA7FDB3CF6EA6A3E -715FA8D1FE147D1180519F4FC3EB4B8FCE939C56C160AF26F82FE23D43C8D434 -AFF845B56FB07FC249AFE35CF36CFEC7FF00214BC6FBBF68F3FAFC9FEABEF7FB -3F357ACFBFEBDAB84F831FF227EA3FF631EBFC7FDC5EF2B9E4AF563AF47FA0FA -1DD9FF003ED4846697DFF5ED41FD7D2BA04376E33818FF003F5A5233FF00EA34 -BEFF00AF6A0F5E7AFA502B0CE3B71FE4FBD388CFFF00A8D18E3AF03BF6A43F7B -A77FF3FCA816C271DB8FF27DE9C467FF00D46909200EC31FD3F0A3AB1E3BFF00 -9FE54C484E0038E3FC9F7A529EFF004E3A5049007618FE9F851D58F1DFFCFF00 -2A034133D79C679EBFE7FCFE8118EBC7F4FF003FE7D949200EC31FD3F0A3AB1E -3BFF009FE540586E7AF38FF3FE7FCF40FF009F6FF3FE7D9C49E33E9FD28C64E0 -0C0FAD02B0DCF5E71FE7FCFF009E81FF003EDFE7FCFB29CF5279FF003FE7FCF0 -7AF18C76FF003FE7FA30133D79C7F9FF003FE7A07FCFB7F9FF003EC13EE7FCFF -009FF3D8F5E83DB3FE7FCFE80833D79C7F9FF3FE7A047E1FD3FCFF009F609F73 -FE7FCFF9EC7AF41ED9FF003FE7F40038FA7F4FF3FE7D823F0FE9FE7FCFB04FB9 -FF003FE7FCF63D7A0F6CFF009FF3FA001C7D3FA7F9FF003EC11F87F4FF003FE7 -D827DCFF009FF3FE7B1EBD07B67FCFF9FD000E3AF4FF003FE7FCF4318EFF00E7 -FCFF009F409F73FE7FCFF9EC7AF41ED9FF003FE7F4004C7F9FF3FE7FA2E31DFF -00CFF9FF003E813EE7FCFF009FF3DB93F8B7AE5F7863E14F8D358D326FB2EA5A -768B7B776D36D57F2E58E07746C3020E1941C10471C8A994B922E4FA0247578F -F3FE7FCFF45C63BFF9FF003FE7D3853F0EFC41FF00454BC5BEDFE8BA47FF0020 -FF009FE49FF0AE7C4183FF00174BC583FEDDB48FFE40FF003FCB3F692FE47F87 -F9858EEBB7F9FF003FE7F2318FFF005FF9FF003FA70C7E1DF883FE8A978B7DBF -D1748FFE41FF003FC93FE15CF88307FE2E978B07FDBB691FFC81FE7F91ED25FC -8FF0FF0030B1DD7F9FF3FE7FFAC631FF00EBFF003FE7F4E18FC3BF107FD152F1 -6FB7FA2E91FF00C83FE7F9733E2FF0F78ABC2B7DA15C3FC4EF133689757C9A75 -F39B4D27CCB7926212DA5522C7E653318E12814F370AE591627CCCAB38ABB83F -C3FCC2C7AFFF009FF3FE7FFAC631FF00EBFF003FE7F4F9F34497C67AF4BA469F -07C4BF108D56FB5AD5E090FD8F4AD9069B617D2C0F36D364373B62D62C06187B -9F302B246C95E93FF0AE7C4183FF00174BC583FEDDB48FFE40FF003FC942BB9A -BC60FF000F5EE3E5B1DD7F9FF3FE7FFAC631FF00EBFF003FE7F4E18FC3BF107F -D152F16FB7FA2E91FF00C83FE7F927FC2B9F1060FF00C5D2F160FF00B76D23FF -00903FCFF2BF692FE47F87F98AC775FE7FCFF9FF00EB18C7FF00AFFCFF009FD3 -863F0EFC41FF00454BC5BEDFE8BA47FF0020FF009FE49FF0AE7C4183FF00174B -C583FEDDB48FFE40FF003FC8F692FE47F87F9858EEBFCFF9FF003FFD65C63BFF -009FF3FE7D3CF7477D6BC2BF1274CF0FDE789B51F13596A9A4DF5F9935586D52 -4B77B79AD114466DE1846D6174FB83863F226D2B86CFA17AF41ED9FF003FE7F4 -B8CF9AFA5AC160E3E9FD3FCFF9F608FC3FA7F9FF003EC13EE7FCFF009FF3D8F5 -E83DB3FE7FCFE96019EBCE3FCFF9FF003D03FE7DBFCFF9F609F73FE7FCFF009E -C7AF41ED9FF3FE7F40033D79C7F9FF003FE7A07FCFB7F9FF003EC13EE7FCFF00 -9FF3D8F5E83DB3FE7FCFE80067AF38FF003FE7FCF40FF9F6FF003FE7D949EF93 -EC7FCFF9FE863DBF01FE7FCFF206267AF38FF3FE7FCF40FF009F6FF3FE7D94FD -4FF9FF003FE7B281C9E38F63FE7FCFE882C373D79C7F9FF3FE7A07FCFB7F9FF3 -ECA78E79E9DFE9FE7FCF45EE7038CD0161B9EBCE3FCFF9FF003D14A9F4FCBB7F -9FF3ECA49007618FE9F851D58F1DFF00CFF2A076133D79C679EBFE7FCFE8BB7F -CE3A5049007618FE9F851D58F1DFFCFF002A004F5E719E7F9FF9FF003C2951FE -41A09200EC31FD3F0A3AB1E3BFF9FE5406819EBFE7D7DE948CFF00FA8D212401 -D863FA7E147563C77FF3FCA90C4E3B71FE4FBD388CFF00FA8D212401D863FA7E -147563C77FF3FCA98909C638E3FC9F7A08C7078FE9FE7FCFB292401D863FA7E1 -41E49A02C373D79C7F9FF3FE7A2E3B7F2EDFE7FCFB073EA475FF003FE7FF00D4 -B8E781FE7FC8A04203D4E7AFFF005EB86F83033E0FD47FEC64D7FB1FFA0BDE57 -7449007618FE9F8570BF05C7FC523A8FFD8C9AF7FE9E2EEB17FC58FA3FCD14B6 -3B9E3B71FE4FBD388CFF00FA8D212401D863FA7E14756FC7FCFF002AD84AC271 -DB8FF27DE9C475E681C01CF4FCA94FEBE948691F057FC15238F10FC39FFB07DD -7FE871D14BFF000548FF009187E1D7FD785D7FE871D15F9456FE24BD59D47DF5 -73FF001F12FF00BE7F9D4552DCFF00C7CCBFEF9FE75157E9F47F871F44641457 -09FF000A13E18FFD139F097FE08ED7FF008DD417FF00B3B7C2DD4AC2E6D26F87 -7E1848AE23689DADF49821902B02095911432373C329041E41068BD5FE55F7BF -F20377C35E25BAF175FBDFD84712F8544656D6F1C1326A32123F7D0F385B7001 -0AE413316DEBB635479F23E0BFFC89FA8FFD8C7AFF00FE9DEF2B8CF0278457E1 -C7C66D2740B3D174ED2ECA6D035299F50D22D20B38F5611DC582C2F710C2147D -A21124AA4EDD844C5A3D9E63C516B7C16F05E9FE46A1E20FB46ADF6FFF008493 -5FFDCFF6CDE7D8FF00E429789FF1EBE6F91D39FB9F7BE6FBDCD73D39CE53575A -EB7FC3FAFD7A858F58FD28CFA7E1F5A5A315DF726C2519F4FC3EB4B8FCE90D31 -0519F4FC3EB47BFEBDA83FAFA50021039ED4119FF3DE97DFF5ED41FD7D281586 -E319E31FE7EB4A467FFD4697DFF5ED49819CF19F4A02C378EDC7F93EF4E233FF -00EA341E9EC3D3A50473EFE9FE7E940AD61BC76E3FC9F7A7119FFF0051A43900 -7A7B51D58F1DFF00CFF2A0109C76E3FC9F7A7119FF00F51A424803B0C7F4FC28 -EAC78EFF00E7F9531213800E38FF0027DE94AF6FE86824803B0C7F4FC28EAC78 -EFFE7F9501A09EB83D79FE7FE7FCF0BB7FCF3C5049007618FE9F851D58F1DFFC -FF002A004CF5E719E7AFF9FF003FA041F43FE1FE7FCFB292401D863FA7E14756 -3C77FF003FCA80B099EBCE33CF5FF3FE7F43693C63FF00ADFE7FCFB292401D86 -3FA7E147563C77FF003FCA80B0DCF5E71FE7FCFF009E8A54FA7FF5BFCFF9F652 -4803B0C7F4FC28EAC78EFF00E7F950161B9EBCE3FCFF009FF3D385F8F63FE2C6 -FC451FF52E6A5F87FA349FE7FCF1DE12401D863FA7E15C67C6CD3EEB56F837E3 -EB2B1B696F2F6E740BF860B7B7432492C8D6EEAA8AA012CC4E00039248ACAB6B -4E5E8C11D8E7AF38FF003FE7FCF40FF9F6FF003FE7D9C49007618FE9F851D58F -1DFF00CFF2AD4561B9EBCE3FCFF9FF003D03FE7DBFCFF9F671278CFA7F4A3B9C -0E3340586E7AF38FF3FE7FCF4A3AFE8563E27D0F51D1B5383ED3A6EA16D2DA5C -C1BD977C4EA55D7729046412320823B63B681278CFA7F4A3B9C0E3349D9AB30B -1E5BF023E146AFF0CF4CD666F12EBB0F893C43A95ECF249A8C16C2DC7D9CDC4F -3C68501DB9325CDCCA481F299CA02CB1A1AF503FE7DBFCFF009F671278CFA7F4 -A3B9C0E33514E11A50508EC87B8DCF5E71FE7FCFF9E81FF3EDFE7FCFB3893C67 -D3FA51DCE0719AD0561B9EBCE3FCFF009FF3D03FE7DBFCFF009F671278CFA7F4 -A3B9C0E334058E0B593FF17D3C22738FF8A735AFFD29D2FF00CFF9E3BCC64E3F -C8FF003FE7DB8DD5AC2EA4F8C9E16BE5B799ACE1D0357865B9087CB491EE34D6 -4466E8198472100F242363A1C767D58F1DFF00CFF2ACA1F14BD7F443B099CE79 -C7F9FF003FE7A1B7271D3FA7F9FF003ECA49007618FE9F851D58F1DFFCFF002A -D404EC4E719E7F9FF9FF003C294F7FA71D2824803B0C7F4FC28EAC78EFFE7F95 -01A067AFF9F5F7A52BDBFA1A424803B0C7F4FC28EAC78EFF00E7F9503138EDC7 -F93EF4E233FF00EA355B50B0B6D56C2E2C6FADE2BCB2B989A19EDAE103C72C6C -B86465230CA412083C104D71BFF0A17E19127FE2DCF84FFF000476BFFC6EB393 -9AF857E3FF000182B1DCF1DB8FF27DE9C467FF00D46B823F017E19719F875E13 -FF00C11DAFA7FD73AC3F147C39F845E1136DF6EF863A4CFF0068DDB3FB2FC16D -A8636E33BFECF6D26CEBC6EC679C670719CA7522AED24BD7FE002B1EAFC76E3F -C9F7A7119FFF0051AE2BE0A6A175AAFC19F015EDEDCCD797971A0584D3DC4F21 -792591ADA32CECC79662492493924D7687EF1E3F97F9ED5AC25CF152EE1B09C7 -6E3FC9F7A7119FFF0051A3071D7007E541033EFE9C7F9ED54090DE3B71FE4FBD -388CFF00FA8D1FC38EC3BD040EFD680B0DE3B71FE4FBD388CF19FE74BEFF00AF -6A0FEBE940EC376E09EDFE7EB4A467BE7FC9F7A5F7FD7B507F5F4A02C84DA067 -B7F4A08073DFD39EF4BEFF00AF6A0FEBE940584C01D38A08CF7A5F7FD7B507F5 -F4A07619C76E3FC9F7A7119FFF0051A1B2475E99E949D58F1DFF00CFF2A09D8E -4B5CD4BC736FAA4E9A2F873C3B7DA68C795717DE209ED666F97E6DD1AD948170 -D9030E72003C74197F025AEA5F00DC35F4315BDEB6BFAE99E1B795A58E393FB5 -AEF72AB9552CA09E18AA9206703A0F41E703B0FF00EB570BF0600FF843F51F5F -F84935FF00FD3BDE573D9AAC9B7D1FE686B63BA0A3AF4A767D3F0FAD1EFF00AF -6A0FEBE95D016B0519F4FC3EB47BFEBDA83FAFA5033E0BFF0082A47FC8C3F0EB -FEBC2EBFF438E8A3FE0A91FF00230FC3AFFAF0BAFF00D0E3A2BF28ADFC497AB3 -A0FBEAE41FB44BC7F19FE75195C1EDF9D4D73FF1F32FFBCD4CFF003FE7F2AFD3 -E8FF000E3E88C1B1BB411485719A5FF3FA53BFCFF9FCAB60B9C06B3FF25D3C21 -FF0062DEB5FF00A55A551F05BFE44FD43FEC64D7FF00F4EF794ED640FF0085E9 -E10FFB16F5AFFD29D2AB92F867E32D6349D1357B4B5F00F88B5AB78FC49AEEDB -EB19F4D5865CEAD764ED135DC6FC1241DC839538C8C1AE1E651ACDBF3FCA255C -F66A2A8E87A8DC6ADA5417775A55DE8B7126EDD637CF0B4D161881B8C32489C8 -01861CF046707201AEC1AA4FA5CF1E8D776961A91DBE55C5F5A35D429F30DDBA -359232D95C818718241E7183D97D2E80BD4578FF00853C61AFF8D7C27F0C34B3 -AC4DA66A9E22F0B8D7750D72D6085AE37451D98748A3746895A492ED58B14601 -51D4202EAF1C1A478A3C47E3497C37E1B8FC4577A2DD9B9D79AEB5AB2B7B67B8 -B9834DBEFB0A4652589E25794CD0CAEEA8003132AA28906CE7FAC45EC9FF0056 -FF003407B39A422B94F859AEDF6BFE0AB693539FED7A9595CDDE957579B153ED -72DA5CCB6AF71B14009E6B4264D832177ED04E327ACAE88CB9A2A4BA8AC2519F -4FC3EB4B462AEE2B09467D3F0FAD2E3F3A42280B0519F4FC3EB41FF27B507F5F -4A620A0FE7E9F5A3DFF5ED41FD7D280136819EDFD28233DF3FE4FBD2FBFEBDA8 -3FAFA502B21BB719C0C7F9FAD2919EFF00CE97DFF5ED41FD7D280B0CE3B71FE4 -FBD388CFFF00A8D2F4FC3BF6A42077EB40AC378EDC7F93EF4E233FFEA34BDBDB -D451C7A0CD03B0CE3B71FE4FBD388CFF00FA8D2F6F6F5148473EF9E9FE7E940A -D61BC76E3FC9F7A7119FFF0051A31C75E077ED411CFBE7A7F9FA50161BC76E3F -C9F7A7119FFF0051A31C75E077ED41033EFE9C7F9ED4024378EDC7F93EF4E233 -FF00EA34638E0F028239F7F4FF003F4A02D61BC76E3FC9F7A7119FFF0051A4C1 -C75E077CD291CFBFA7F9FA500378EDC7F93EF4E233FF00EA349838F61E869719 -6E9FE7FC8A006F1DB8FF0027DE9C467FFD4693071EC3D0D2E32DD3FCFF009140 -0DE3B71FE4FBD388CFFF00A8D260E3D87A1A5C65BA7F9FF22801BC76E3FC9F7A -7119FF00F51A4C1C7B0F434B8CB74FF3FE4500378EDC7F93EF4E233FFEA34983 -81CF1F5A5239FE9FE7E9400DE3B71FE4FBD388CFFF00A8D18E3A9C0A5E3D0668 -048671DB8FF27DE9C467FF00D4697A7E1DFB507F5F4A0690DC633818FF003F5A -5233DF3FE4FBD2FBFEBDA83FAFA50161BB40F6A5201CF7F4E7BD79B7816EFC53 -0F8CBFB3F55D73FE120DBA699B5D11C512DA693A8930B456D6AEB1C6EC8C925C -31594C922A25BB314F301978BF0BF8C7C6BF0DFC29A9EA5F11B51D4751F135A7 -85EEB5C4D15AE2C5ACEE45BC71B4FB6582CE37865476442A4C88167528F310C6 -3E57888AB369DBF2B77FEBCB71D8F7DC0078E3FA570BF147FE120FF8967F611F -167FCB5F3BFE117FEC8FF676F9BFDA1FF02DBE5FFB5BBF86A87847FE123F07F8 -EB4FF0E6BFE2CBBF197F6AE892DF0BABBB4B6B516D3DACB04731458235CA4BF6 -C8C8562C63F23EF3EFF96878A352D43C5E6D7EDFF0DBE21406DF76CFECBF11D9 -E9F9DD8CEEFB3EA91EFF00BA31BB38E718C9A53A9CF06ACD3FC7EF571A46F7C0 -4FF9217F0EBFEC5BD3BFF4963AEEF3E9F87D6B84F809FF00242FE1D1FF00A96F -4EE7B7FC7AC75DD9FD7D2B5A3FC38FA210519F4FC3EB47BFEBDA83FAFA56C014 -67D3F0FAD1CE7FAD18CD001467D3F0FAD2E3F3A314AE3B09467D3F0FAD2E39A2 -8B8584A0E79A5A28B8EC18A314514AE1610F1484039EFE9CF7A7521A6989A0E9 -ED8FD2B84F82E7FE28FD47FEC63D7F1FF837BCABDAEFC23F02F8A3559F54D67C -17E1ED5B529F6F9B7B7DA54134B26D50ABB9D94938500727A003B564FC08B0B5 -D27C037163636F0D9D9DB6BFAEC305B5BA08E38A35D5AEC2A228C050000001C0 -02B9EF2F6CAEB4B3FCD790743D0E8CFA7E1F5A3AFF008F6A319AE91052E28A2A -6E558F82BFE0A91FF230FC3AFF00AF0BAFFD0E3A28FF0082A47FC8C3F0EBFEBC -2EBFF438E8AFCAAB7F125EACD8FBF2E799E5FF0078FF003351E704F6FC6A6B85 -1F6894FF00B47FCFF9FF00F533A7F9FF003FE7F4FD3A8BFDD47D11CEF7199C8A -33827B7E34F20771FE7FCFF9F44C73E9FE7FCFF9E9B5C0E075939F8EBE10FF00 -B16F5BFF00D2AD2E97E0B1C784351C71FF001526BFFF00A78BCA35A18F8EBE10 -FF00B16F5BFF00D29D2A8F82DC783F51EDFF001526BFFF00A78BBAE48FF19FCF -F288CEEF39141EA7A7E949FE7F4A77F9FF003F957588E635FF0086FE1FF11E8F -A46993D9CD6765A448B2E9E9A4DE4DA7B5A1589E1511B5BBC6CAA2391D36838C -3631E95EF7E15F872EF4BD3EC05B5DD9A58799E45CE9FA95CDA5D8F31B74DBAE -2291657F31C07937B9F31D43BEE6008EB7FCFE94EFF3FE7F2A874E0F78A1DCCD -D0B42B1F0DE95069DA741E45A43B8852ECECCCCC59DDDD896776666667625999 -99989249ABD4EC0E3FCF6A5D83D6AD249590EE328A5C50411DA980945145030A -28A2800C52114B45171584FD28CFA7E1F5A5A3AD3B8AC715F1B350BAD2BE0D78 -F6F6CAE66B3BDB6D02FE682E2DE42924522DBC855D581CA9040208E411501F83 -1E1FE7FE263E2CF6FF008AC757FF00E4AA5F8F83FE2C5FC46FFB16F51FFD2592 -BBBC573B8C6751F32BE8BF51EA7067E0BF87FF00E823E2CFFC2C757FFE4AAE97 -C35E19B3F09D8C9696336A33C4F2194B6A5A9DCDFC9B88008124F23B05F947CA -0800E4E324D6BE3F3A422B48D3A71778C5216A1467D3F0FAD1CE7FAD1CE2B510 -519F4FC3EB5C27C5CF89BFF0AC34ED12E3CBD273AA6A5FD9FF0068D7755FECDB -3B7FF479E6DF24DE5C98CF91B00DBCB3AF2289BE235F43A0F871A3D22D359F10 -EBFBCD9D9687A9ADCD9F94159C5D3DCBA4645B0530EF9562621A68D55642C81B -175A09B8DF543B1DDD19F4FC3EB593E16F12DB78BB458B52B48E6854C935BCB0 -5C00248278A578A689B692A59248DD0952CA4AE559948275B9C56A9A6AE84146 -7D3F0FAD1EFF00AF6A0FEBE94C028CFA7E1F5A3DFF005ED41FD7D2800A33E9F8 -7D68F7FD7B507F5F4A0028CFA7E1F5A3DFF5ED41FD7D2800A33E9F87D68F7FD7 -B507F5F4A0028CFA7E1F5A3DFF005ED41FD7D2800A33E9F87D68F7FD7B507F5F -4A0028CFA7E1F5A3DFF5ED41FD7D2800A33E9F87D68F7FD7B51CE2800A33E9F8 -7D6B84F8B9F137FE15869DA25C797A4E754D4BFB3FED1AEEABFD9B676FFE8F3C -DBE49BCB9319F23601B79675E4512FC46BE8742F0E347A4DA6B3E21D7F79B3B2 -D0F5317366220A5C5D3DCBA4645B0530EF9562621A68D55642C81B175A0A4E37 -D57A8ECCEEEABEA1671EA56173692B4C915C46D1335BCCF0C803020ED9118323 -73C329041E4104552F0AF896D7C5DA2C5A95AA4D0A9966B79609C012413C52BC -5344DB4952C9223A12A59495CAB32904EB62B44D495D6CC2C733E0AF879A2FC3 -D86F22D17FB4522BA91A6963BED56EAF5448CEEEEEA2795F617791D98AE0B139 -6C90310695F0B3C39A57DB736D77AB7DAED9ECE5FEDDD4AE754CC0FF00EB225F -B54926D47C2EF55C07D89BB3B57107837E29D878CEFED2DE1D3751D3E2D46C9B -53D26EAF162F2F53B3531869E211C8EC8A3CF80ED99637C4A3E5CAB8583E1F7C -5CB4F1FF00F65E343D5B41FED6D37FB5F4CFED4FB39FB6DA8F2B7489E44D2ECD -BE7C19593631F34601C36DE652A3EEA497969FD5BF51D8D5F0D7C3BD1BC297F2 -5F598D46EAF5A330ADCEADAADD6A32451920B2C6D712C863562A8582603144DD -9D8B8CAF8A3E16D5FC49FD99FD9561F6EF27CDF33FE2AED4742D99D98FF8F48D -FCECE0FDFC6DC719DC707C22F8BDA77C66D0A4D6748D3AEED34D5F2C24F73736 -72EF665DE50ADBDC4A6375528592508C37AF1D707C51F077FC25BFD99FF142F8 -4BC6BF67F37FE4689FCAFB36ED9FEABFD127CEEDBF37DDFB8BF7BB26E12A37A6 -B47E5FF01FE43B07C031FF00162FE1CFFD8B7A77FE92C75DDE2B84F807FF0024 -2FE1CFFD8B7A77FE92C75DDD6B47F851F4401451456A01451450014514500145 -2F5A369FFF005D02128A5C53B67BFE9405C6514EC0A5DA280B8CA5E94BFE7F4A -5619E6905C8CF15C27C17FF913F51FFB18F5FF00FD3BDE5686BBE34D6349D567 -B4B5F00F8875A823DBB6FAC67D3961972A09DA26BB8DF82483B90720E32304E4 -FC07B992F3C01717135ACD632CBAFEBB23DADC143242C756BB2518A332961D0E -D66191C1239AC39D3AA92ECFA3EE82C7A1514515D030A28A5033401F04FF00C1 -523FE461F875FF005E175FFA1C7451FF000548FF009187E1D7FD785D7FE871D1 -5F9556FE24BD59A9F7FCFF00EBE4FF0078FF003FF3FE7A47FE7FCFF9FF00EB49 -3F33C9FEF1FE7FE7FCF4660FD3FCFF009FF3D3F4CA3FC38FA2399EE274FF003F -E7FCFE87F9FF003FE7FF00ACBD3FCFF9FF003FA27F9FF3FE7FFADB01C1EB3C7C -76F087FD8B7AD7FE95695FE7FCF183F057C37A8791A8EADFF0956AE2C3FE124D -7FFE245E559FD8FF00E42978BF7BECFE7F5F9FFD6FDEFF0067E51BDACFFC976F -087FD8B7AD7FE95695FE7FCF07C15FF913B51FFB1935FF00FD3BDE7F9FF3C712 -57ACFE7F9447D0EECAFF0093FE7FCFF24E476C7BD3FF00CFF9FF003FFD64FF00 -3FE7FCFF00F5BBAE2199C8A33827B7E34E2A3D3FCFF9FF003E8639EBFE7FCFF9 -F47718DCE4519C13DBF1A36E3B52FF009FF3F9500267228CE09EDF8D27F9FD29 -DFE7FCFE540098C8E948579C7F5A3FCFE94EFF003FE7F2A0066DE33411834BFE -7F4A77F9FF003F9531DC8E8A7607F9FA52951F4A07719452E28208A00E0FE3E7 -FC90BF88DFF62DEA3FFA4B257775C27C7CFF009217F11BFEC5BD47FF004964AE -EEB15FC47E8BF518514515B005145140193E257D762B08E5F0FC3A75D5EC7202 -F6BA9CB2411CF1E082A264573130255B779720214AE06EDE9E7965F0EFC4FE16 -8FC3FAC68F1E93A8F886DAE7576BDB1BEBD96DED041A8DD1BC9638A6581DCBC7 -325BAABB4603A2C84A2975D9EB345652A6A6EEDFF5BFE880E6BE1DF86AEBC29E -181677B242F7B3DEDEEA33ADB92D1C525D5D4B72D12B100BAA198A072AA582EE -DAB9DA3A5A28AB8C54528AE8064F897C23A178D2C23B2F1068BA76BB651C8264 -B6D4ED23B88D640080E15C101806619EB827D6B9AFF8509F0C7FE89CF84BFF00 -0476BFFC6EBBBA2A654E127794530384FF008509F0C7FE89CF84BFF0476BFF00 -C6E8FF008509F0C7FE89CF84BFF0476BFF00C6EBBBA2A7D8D2FE55F701C27FC2 -84F863FF0044E7C25FF823B5FF00E375DDD1455C61187C2AC018A314515620C5 -18A28A00315C9EB9F08BC0BE27D567D4F59F05F87B56D4A7DBE6DE5F69504D34 -9850ABB9D909385000C9E0003B5759454CA3192B495C0E13FE141FC31FFA273E -13FF00C11DAFFF001147FC283F863FF44E7C27FF00823B5FFE22BBBA2B3F634F -F957DC3384FF008507F0C7FE89CF84FF00F0476BFF00C456B7867E19783BC177 -D25EF87BC27A1E857B246617B9D374E86DE468C904A164504AE554E3A640F4AE -968A6A9534EEA2BEE00A28A2B50327C4B73AEDAD846FE1FD374ED52F4C803C3A -9EA12594623C1CB07482625B3B46DDA06093918C1F3CB2F877E27F0B47E1FD63 -478F49D47C436D73ABB5ED8DF5ECB6F6820D46E8DE4B1C532C0EE5E3992DD55D -A301D1642514BAECF59A2B295353776FFADFF4039AF877E1ABAF0A786059DEC9 -0BDECF7B7BA8CEB6E4B4714975752DCB44AC402EA866281CAA960BBB6AE768DE -BF7BA8EC2E5ECA186E2F5636304371298A3793076AB38562AA4E0160AC40E707 -A54F4B83E956A2A31514079E784346F1825FEBFAF789B4BD0E5F11346F16922C -F569A5B78A024B0B6CB5AA18149484C92012348DC9016386249FE1DE87E27835 -DF10EB7E2EB1D26DF55D43C98219749D465B945B589A630C1B1EDE2DBB3CD662 -F976779643F2208E35EF314BB3D4D66A9A4D3BEC2B9E77E0DF09EBB6FE2CB4D5 -B50D2343F0B5958692DA4C5A6E817D25CC7731F991B43BF75BC0116DC472AC6A -15C62EA5C6CE43F17F147C1DF0C7E1E7F667FC50BF09AD3ED9E6FF00C8D13DAE -91BB66CFF55FE892F99F7BE6FBBB72BD7771EF18AE17E28F8C0784BFB33FE2BA -F09782BED1E6FF00C8D30799F69DBB3FD57FA5DBE36E7E6FBDF7D7EEF7C6AD38 -C69BFCDDBF5B2FEBB85C67C03FF9217F0E7FEC5BD3BFF4963AEEEB86F80607FC -28BF873FF62DE9DFFA4B1D77BFE7FCFE55B51FE1C7D10363307D282A41EDF9D2 -FF009FD29DFE7FCFE55B0AE342F19A0AE0FF00F5E8FF003FA53BFCFF009FCA90 -5C4C71D3FCF346704F6FC693FCFE94EFF3FE7F2A04267228CE09EDF8D27F9FD2 -9DFE7FCFE540099C8A33827B7E349FE7F4AA5AEEB76FE1DD2E7D46EA3BC96DE1 -DBB92C6CA6BB98E5828DB142ACEDC9E76A9C0C93800903692BB02F67228CE09E -DF8D725A57C52F0E6B3E15BCF1141717716956972F6523DDE9B736D2B4EAE223 -1243246B248FE69F282A292D265065C150E97E2A786E1F0B5CF8864BABB8EC2D -AE62B39E16D36E85E453C8F1A47135A797E7ABB99622AA6304AC88C06D606B3F -6B4ED7E65DFE407579C8A33827B7E35C9C7F147C3737856DFC4297576F617173 -2D9430AE9B726F259E379239225B5F2FCF67430CC5942642C6EC4055246C7857 -C53A6F8D3458F56D2659A5B29259A106E2DA5B691648A568A4468E555746578D -D48651F769AA9093B269F503508DC335C0FC17E3C1FA8FFD8C9AFF00FE9DEF2B -BF65C1E95C17C175FF008A3B51FF00B1935FFF00D3C5E54BFE2C7D1FE68699DC -D14A0669E062B61DC685EF4BD09C71F8D27F9FD29DFE7FCFE548967C0DFF0005 -49E7C45F0EBFEBC2EBFF00438E8A3FE0A91FF230FC3AFF00AF0BAFFD0E3A2BF2 -BADFC497AB3A0FD029FF00D7C9FEF1FE751838FF0023FCF6FF003DA49BFD749F -EF1FE751F4039AFD328FF0E3E88E5179EFFE7A537031FF00D7FF003E9FE7B3B1 -C9FF003DE93A01CD6A2382D6548F8EDE10FF00B16F5AFF00D2AD2BFCFF009E39 -0F865F13F46F0EE87ABE9F7765E2296787C49AF6E7B0F0CEA57709CEAD76C36C -B0DBB237079DAC70720E0820761ACFFC977F087FD8B7AD7FE9569549F057FE44 -CD43FEC64F107FE9DEF2B89737B67CAFBFE512AFA1D5E85AD5BF8874A8350B58 -EEE1826DDB52FACE6B3986D62A774532A3AF2A71B9464608E0835E69E23F8B1A -9E8BE29BD3E7E936FA2D8F8934EF0BFF0066DCC4DF6CBF9EED2D5FCD867F342A -796B79B8C5E53965B673BD43663F5DDB9CE3FCF35C0EB7F07B4EF10F8EA3F13E -A1A8DDCEF1FD9C2D8FD9ACD102C12A4F1279E2DC5CEC59E349B679DB4BAF20AE -56B6AAA6E29437FEBFAEA0AC645EFC48D770BE22B41A72785A3D7E3F0EB69D3D -BC86FA790EA2BA749389C4A122559999847E5C8592204BA1936C5EA5FE7FCFF9 -FF00EB70727C22B3935DB8BB3AE6AEBA2CFA945ABBF86D4DBAD80BA8DE395645 -C42264CCF12CECAB285690BB3021DC1EF3FCFF009FF3FF00D6AA6A6AFCDFD7FC -000E9FE7FCFF009FD0F7FF003FE7FCFD17FCFF009FF3FF00D64FF3FE7FCFFF00 -5B600233C7F9FF003FE7E89B71D3FCFF009FF3ECEFF3FE7FCFFF00593FCFF9FF -003FFD6603581A4CE09EDF8D49FE7FCFF9FF00EB27F9FF003FE7FF00AC5C0667 -228CE09EDF8D38A8E7FCFF009FF3F818E7D3FCFF009FF3D1DC63739146704F6F -C694A628FF003FE7F2A004CE4519C13DBF1A4FF3FA53BFCFF9FCA80383F8F873 -F02BE237FD8B7A97FE92CB5DD9EA781FA5707F1F3FE485FC46FF00B16F52FF00 -D2592BBDFF003FE7F2AC97F15FA2FD404EA3A7F9E690A807FF00AF47F9FD29DF -E7FCFE55A80DC0C505403FFD7A3FCFE94EFF003FE7F2A06376823BD64DF78B74 -1D37C38BE20BBD6B4EB5D01A38E65D567BC8D2D4C72102371293B76B6E5C1CE0 -EE18EB5CD7C5DD0FC4DE29D0A2D1342B1D22FB4AD43CC835A8B52D465B379AD4 -A60C113A5BCDB7CCC9577C0654DC136BB2C91F9EF821EEBC23E0BF82779E3986 -2F0E68BA2680C2E65BB95A38AC35116F05BDA35C3BAA1899ADDEF90AB811AC92 -08F2CFE493CD3ACE32E5B7CFE6BFCC0F7DDA08EF415C13FE35C5FC20D3EE74AF -063D95CDB4D66B6DAB6AD0DADB4B194115A2EA1702D5114FDD88402211803684 -09B7E5C576DFE7FCFE55BC25CD152B6E1B0DDBC505707B564F896D75DBAB08D3 -C3DA8E9DA5DE890179B53D3E4BD8DA3DA72A11278486CED3BB710304639C8E73 -FB1BE277FD0DFE13FF00C256E87FEE4BDA94A6D3B28B7F77F985CEE36F141520 -F6FCEB85FEC6F89BDBC5FE12FF00C256EBFF009654EFEC6F89DFF437F84FFF00 -095BA1FF00B92F6A9F692FE47F87F985CEE36F141520F6FCEB85FEC6F89BDBC5 -FE12FF00C256EBFF009655DEFF009FF3F955C64DEEADF77E8171983E946D3FE4 -D2FF009FD29DFE7FCFE556171983E9474A86CAFED75285A6B3B986EA25924859 -E0903A8923629221209F995D5948EA0A907041C59FF3FE7F2A570B8CC1F4A3A5 -2FF9FD2B95D774DF1D5C6AB3C9A3788FC3D61A69DBE55BDF68171733270036E9 -16FA256CB02461170081CE33532938AD15C2E75383E9474AE17FB1BE26F6F17F -84BFF095BAFF00E5953BFB1BE277FD0DFE13FF00C256E87FEE4BDAA3DA4BF91F -E1FE63B9DC60FA51835C2FF637C4DEDE2FF097FE12B75FFCB2AD8F0D5878C6D2 -FE47F10EBDA1EA765E59090E99A2CD6522C995C3177BB9815C061B7683920E46 -305A9C9BB72BFC3FCC573A2DBC5295C1ED47F9FD29DFE7FCFE55A85C6ED18CD5 -1FEDED2C685FDB7FDA367FD8BF66FB67F68FDA13ECFE46DDFE6F999DBB36FCDB -B38C739AE4BE2EE87E26F14E851689A158E917DA56A1E641AD45A96A32D9BCD6 -A5306089D2DE6DBE664ABBE032A6E09B5D9648FCDBC2D67FD87E05F8233FC44B -0B4D1B40D074559673A93620D3F558E2B68EC649DA45430B884DE0C38089332A -6E69042C796759C25CB6F9FCD7F981F42F51ED506A1A85B69163737B7B730D95 -9DB46D34F737122C71C51A8259D98E02A81C927A015C4FC10FF927B1797FF1E3 -FDA5A9FF00676DFF0055F60FB7DC7D8FC9EDE4FD9FC9F2F6FCBE5ECDBF2E2BBE -FF003FE7F2ADA32E78A97713D0F9C3C190695AB5878BAFFE0F6ABA75E6A5A468 -179A5FDB2DAE2DA5BDD7755600C17D798C2B32C904A1269C7EF5A7B870163C3C -D07F6EF8798EA7ACFC149ED2FE73E09D62EEE27D0D45D5CCFA8FFA23E9ED7AA4 -33C9744FDA4A0B80646267E093257D29FE7F4A77F9FF003F9572FD5B4B5FF0FC -B5D3CF7B8EE7877C2BB2F00E8DF122CAD3E15B6872680FE1F9A2D65BC3F34773 -189A09ADC58FDA2442D894A4D7D8663BE501CB17F2C6DD6F14EBBE3FF071B6FB -7789F489FED1BB67F657C3CD5750C6DC677FD9EF5F67DE18DD8CE0E33B4E3D67 -FCFE95C2FC52D47FB3FF00B33FE2A2F16E81BFCDFF00915B41FED3F371B3FD6F -FA1DCF978FE1FB99CB7DEDBF2B95354A9BFD345F75D7E617D43E01F3F027E1CF -FD8B7A77FE92C75DDE704F6FC6B84F806B9F815F0E4FFD4B7A77FE92C75DEE0E -7AFF009FF3FE7D36A3FC28FA213DC6E7228CE09EDF8D3B601FE7FCFF009FD171 -8FF3FE7FCFE9B5C06672297904E053B18F6FF3FE7FCF43FCFF009FF3FF00D657 -10D2091FE34A0107D29DFE7FCFF9FF00EB27F9FF003FE7FF00AC5C042BEFFE7F -CFF9F45031FE7FCFF9FD17FCFF009FF3FF00D64FF3FE7FCFFF005900103BFF00 -9FF3FE7DA86BBA95C691A54F776BA55DEB73C7B76D8D8B42B3499600ED33491A -0C0CB1DCE38538C9C0AD0FF3FE7FCFFF00593FCFF9FF003FFD64F54078427C31 -D5A4F87969A78B1F1169BA0693ADC379A6784ED6FADE5D4BFB3E3B65896D1EE2 -4B831AEDB92F728E27668D522F29A29123115EB4F0CF8AAD2C743D58E8FAB5DD -A68BE247D4EC7C3F7DA8C575AAC764FA6CB68D1B4F2CED1C8FF699E5986FB838 -888018155897DABFCFF9FF003FFD64FF003FE7FCFF00F5B9961A0B67FD7F5D36 -F21DCF16FF00845FC49FDA83C63FF08EDDF9BFF096FF006F7FC23FF68B6FB788 -3FB17FB336E7CEFB3EFF0033F7B8F3B1E5F7DFFBB1D3784FC2175ADDA78D2E35 -DB2D47428BC49AB477F1D947A81B7BEB78E3B4B4B701E6B494EC62F6ACDFBB94 -828CA18825957D13FCFF009FF3FF00D64FF3FE7FCFFF005AA34629EF7EBF3FEB -E42B9C1FFC295F0F7FD043C5BFF8596B1FFC95FE7F956F80F629A5F802E2D216 -99A2B7D7F5D891AE2779A421756BB00BC8E4B3B71CB31249C9249AF46009E9FE -7FCFF9F6E0BE0AF1E0ED43FEC64D7FFF004EF79FE7FCF0284615572A4B47FA0E -E7739C8A33827B7E34ACB83D28FF003FE7F2AEA01339146704F6FC6803A7F9ED -4EC7F9FF003FE7FA007C0BFF000549E7C45F0EBFEBC2EBFF00438E8A3FE0A95F -F231FC3BFF00AF0BAFFD0E3A2BF2AADFC497AB3747E81CC099A4F4DC7F9D302E -2A49BFD73FFBC6995FA5D1FE1C7D11C8C6E0F7A4071FE47F9EDFE7B3E8AD82E7 -03ACE7FE17B783F3FF0042DEB5FF00A55A55799786AE2DFC1DA15F6AB65E32BB -D0B5DD47C49E203168F34336B10EA3E5EAD72ADE5E9CA7CE3E5A12CDF6431724 -3CBBD5715E9BACAFFC5F7F087FD8B7AD7FE956955C8FC08F8769A6DEF887C536 -BAC5E5ABEA3E24D6FEDBA743676290DCF97A95EC71F9B28B7170FB73B9774C70 -78185F96BCF9272AB64BBFCB48F9A296C7A27C3CD6FC4DE21F0DC77BE2CF0C45 -E11D55E561FD951EA4B7EC918202B3C888A818F276AEE006DC9C92ABD2838FF2 -3FCF6FF3D971C9FF003DE93A01CD77C55924DDC42F3DFF00CF4A6F1FE4FF009F -4FF3D9D8E4FF009EF49D00E6A804D9CFA7F9FF003FE7A2638EDFE7FCFF009ECF -C727FCF7A4E807340EE3718F6FF3FE7FCF44FF003FE7FCFF00F5A4C727FCF7A6 -E001405C6F4FF3FE7FCFE87F9FF3FE7FFACEDB9CE3FCFF009FF3EC9B71FE7FCF -F9FD1809D3FCFF009FF3FA1FE7FCFF009FFEB2E3AFB7F9FF003FE709FE7FCFF9 -FF00EB030E9FE7FCFF009FD0FF003FE7FCFF00F597FCFF009FF3FF00D64FF3FE -7FCFFF0058002077FF003FE7FCFB26DC77C7F9FF003FE7A3BFCFF9FF003FFD64 -FF003FE7FCFF00F580382F8FA0FF00C28AF88DFF0062DEA5FF00A4B251F0CFC6 -9E27F197DA25D67C3DA4E831DBEE82E6DADB5996EAF2D2E86D2609A26B58957E -56DC1D5D9594A326F4757A5F8FBFF2427E23FF00D8B7A97FE92C9FE7FCF0685A -14BE2AF1941E36BA82EF45861B66B4B0B10F25BCD79112489AFA3046EC6E7F26 -09013089647602490A41CB272F6DEEBE8B4F9BFC8677641A4C107814FF00F3FE -7FCFFF00593FCFF9FF003FFD6EBB8869048FF1A3041E053FFCFF009FF3FF00D6 -4FF3FE7FCFFF0058B80D39228C107814FF00F3FE7FCFFF00593FCFF9FF003FFD -62E034E48A4CE09EDF8D49FE7FCFF9FF00EB27F9FF003FE7FF00AC5C0667228C -E09EDF8D49FE7FCFF9FF00EB27F9FF003FE7FF00AC5C0667228CE09EDF8D3F03 -D07F9FF3FE7B1FE7FCFF009FFEB170199C8A33827B7E34FC0F41FE7FCFF9EC63 -FCE7FCFF009FD0B8C66722B8BF885A85D2EA1A269125CCBA3E85AA4AF05EEB16 -F2149164CA086D15D706069CBB289F20A94F2D0ACD342EBDB6C03B7F9FF3FE7D -20D434EB5D5AC2E6C6FADA2BCB2B989A19EDAE103C72C6C30C8CA782A4641078 -233F84CD7346C82E7053D85B785BC6FA558F842DA2B7B89E2886A9A3DBC623B2 -8EC514C515CBED1882551108A2DA0999633195290896D7D0B3827B7E354B47D0 -2C341B7686CA0F2B7EC32CCEED24D3B2C6912BCB2392F2BEC8D14BB92C420C9E -38D0C7F9CFF9FF003FA284796E17199C8A33827B7E34ED83E9FE7FCFF9E8B8FF -0039FF003FE7F4D2E03339146704F6FC69DB07D3FCFF009FF3D171FE73FE7FCF -E85C0667228CE09EDF8D3B60FA7F9FF3FE7A2E3FCE7FCFF9FD0B80CCE4519C13 -DBF1A76C03B7F9FF003FE7D17FCFF9FF003FFD6570199C8A5C107814FF00F3FE -7FCFFF00593FCFF9FF003FFD62E21304F5A36E3BE3FCFF009FF3D1DFE7FCFF00 -9FFEB27F9FF3FE7FFAC5C0E0F49F14789F55F1DF8CFC37736BA4E97FD9FA6DA5 -DE95731C92DE6FF3E5BD8D649D48871FF1EC84C4878F9879A720A57F06EB3E30 -9FE20EA9A36ADAA687ACE97A6D923DD5CE99A44D64D15DCAC1A284335D4EACC2 -2579244211944D6CC37090EDEDA1D0AC6DF5EBCD663836EA5776D059CF3EF6F9 -E285E578D76E7036B4F29C8009DDCF41B5349D0AC743FB61B383CA7BCB97BBB9 -919D9DE695B196666249C2AAA28270A8888BB55142F3A84B4BBEAFFE07901E79 -F047C79E2BF1458C71F8EEDA1D0F5FBAB186FE0D19B4A6B191622079AEAC6EA7 -F3555DD10A9114919DBE6469E6C75E59AEFC5D7F1CE953DB78EF5AF1C7C25B7B -AD4974CD3ECBC3DE1EBE866BD93703194BE7B56797CD2994448EDA403CC47490 -61ABDE7C3BF0FDF47D79759D4FC47ABF89F5286DA4B3B59B545B58FECD148F1B -CAA8B6D0420EF686124B8623CA1B4AE5B38FF187C3D6BE26B0B5B1BEF0AF89FC -55653453C33DB787B5A1A7C7E5B850C970A6F2D84AAC32003BC001C7CBBB9E69 -D3ABECAC9EDDEFAFADB5EFB683D0B1F00BFE484FC38FFB16F4DFFD258FFCFF00 -9E3BCFF3FE7FCFFF005B83F805FF002427E1C7FD8B7A6FFE92C7FE7FCF1DE7F9 -FF003FE7FF00ADD547F871F4427B874FF3FE7FCFE87F9FF3FE7FFACBFE7FCFF9 -FF00EB183F4FF3FE7FCF4D804E9FE7FCFF009FD0FF003FE7FCFF00F59C14FF00 -9FF3FE7F91B401D7FCFF009FF3E8086F4FF3FE7FCFE87F9FF3FE7FFACF0BFE7F -CFF9FE8980050171BD3FCFF9FF003FA1FE7FCFF9FF00EB4800F4FF0039A4E807 -3482E3769CE31FE7FCFF009F431F4FF3FE7FCF67E393FE7BD274039A02E204C7 -5FF3FE7FCFB181FE4FF9F4FF003D9D8E4FF9EF49D00E6810018EDFE78AC8F15E -A1AC695E1BBFBCD0349875DD5E088C96FA6CF782D16E586329E694608C4038C8 -C67009504B2EC6393FE7BD274039A4D5D580F9C2DBC73AAF8FBC4975A278AFC3 -3E28D56F608C4F2F83F4D92C34EB511FC81CC8B3DE4771A844AF2496EF36059C -FB4ED88E0357A17ECEB0436DF0C0436FA5FF0062411EB7ADAC7A66D8D3EC6A35 -5BB021C464A0D806DC212BC7048C1AEDFC4BE12D1FC6362969ACE9F0DFC514A2 -7819C624B69802166864077452A863B6442AEA79520F4E47E025947A67C3E9EC -E1799A2B7D7F5D851AE2679A42ABAB5E005A47259DB8E598924F2493CD7153A7 -28564DBBE8FF0035FD6E55F43D048C707FCFF9FF003EC9B707D3FCFF009FF3D2 -42339F5A674FF3FE7FCFE9DE989074FF003FE7FCFE87F9FF003FE7FF00ACBFE7 -FCFF009FFEB27F9FF3FE7FFAC0CF813FE0A95FF231FC3BFF00AF0BAFFD0E3A28 -FF0082A57FC8C7F0EFFEBC2EBFF438E8AFCB2B7F125EACE85B1FA0937FAE7FF7 -8D329F37FAE7FF0078D36BF4BA3FC38FA238DEE2514515A81C1EB3FF0025DFC1 -FF00F62D6B7FFA55A551F053FE44ED47FEC65F107FE9E2F28D67FE4BBF83FF00 -EC5AD6FF00F4AB4AAE47E18FC50D1BC39A1EB1A75DD9788A5B887C49AF6E7B0F -0CEA57909CEAD76C36CB0DBB23704676B1C1C8382081C7CD18D56E4EDBFE511F -43DAA936E0FA551D0B5BB7F1169506A3691DDC56F36EDA97F65359CC30C54EE8 -A64475E41C6E5191823820D7927893E28F8BB4DF8917BA4DADC6909A6C1ADE9D -A7C56D268D732F996F30B5F39A5D456E05BDBCE3CF9B6412A891F6C2155FCE8F -76F3AB182527B3047B4E0FD69BCAF6FE55E5F7DF1275E217C456634E5F0AC7E2 -08FC3ADA74F6F21BE9E43A8AE9D25C09C48122559999847E5C8592204BA1976C -5EA7551A8A7B06C379EFFE7A52038FF23FCF6FF3D9F81E949B78E38AD02E273D -FF00CF4A4071FE47F9EDFE7B3B6D260818FE54C61CF7FF003D2901C7F91FE7B7 -F9ECB8E4FF009EF49D00E680179EFF00E7A5378C7FF5C7F9EDFE7B3B1C9FF3DE -93A01CD001B3F3FF00F57F9FF3C371F4FF003FE7FCF67E393FE7BD274039A063 -76907A7F9FF3FE7D13FCFF009FF3FF00D6931C9FF3DE93B0CD017380F8FBFF00 -2427E23FFD8B7A97FE92C9FE7FCF1DE7F9FF003FE7FF00ADC37C7E03FE1447C4 -8E3FE65BD4BFF49A4AEEF000AC97F11FA2FD406F4FF3FE7FCFE87F9FF3FE7FFA -CFC03FFD6A4C002B60B8DE9FE7FCFF009FD0FF003FE7FCFF00F59F807FFAD49B -703AFE9FE7FCFE805CE7FC6BA6EA1A8E852FF666ABABE95776F99D7FB116CDAE -2E36AB6211F6B8DE21B8E393B79032CA335E69E11F147893C49E15F01786A4F1 -15DC3E29D42DAF67D7F59FB3DB09ED9EC9D60BC8601E51877ADE4D144A4C4C86 -18E560E5B639F55F12F87A4F10D824306AFA8E877514A2586FB4C910491B60A9 -0524578E452ACC36C88C01C3001D5197007C25D1F4FD0EC6C345BAD4740BAB09 -2E25B4D56DAE7ED179135C4865B80D25C897CD12BB166594382C11B01A38D939 -6719B9DE3B5BBF9AFC6D7FEAE34D17BE1D789AEBC57E181797D1C297B6F7D7BA -6CED6EA563964B5BB96D9A555249457309708598A86DBB9B6EEAE97FCFF9FF00 -3FFD6A5A168163E1AD2A0D374D87ECF690EE214BB3BB3331677776259DD98B33 -3B12CCCCCCC4924D5FDA00EBFE7FCFF9F4DE17514A5B85CC7F1378A2CFC25611 -DE5F43A8CF13CA220BA6699737F206209C98EDE3760BF29F988001C0C8245733 -FF000BABC3DFF40EF16FFE11BAC7FF0022FB7F9EDDF6DF43FE7FCFF9F44DB8FF -003FE7FCFE89A9B7EEB5F77FC10D0E0BFE17578787FCC3BC5BFF00846EB1FF00 -C8BFE7F91FF0BABC3DFF0040EF16FF00E11BAC7FF22FB7F9EDDF053FE7FCFF00 -9FE49B71FE7FCFF9FD26D53BAFBBFE0868705FF0BABC3C3FE61DE2DFFC23758F -FE45FF003FCBBCFF003FE7FCFF00F59769FF00F57F9FF3FC8C1FA7F9FF003FE7 -A5C79BED3FEBEF60274FF3FE7FCFE87F9FF3FE7FFACEDA7FFD5FE7FCFF0026E3 -1DB1FE7FCFF9E9620E9FE7FCFF009FD0FF003FE7FCFF00F594027A7F9FF3FE7D -9318ED8FF3FE7FCF4061D3FCFF009FF3FA725AEFC4FD1FC3BAACFA7DDD9F88A5 -9E1DBB9EC7C33A95DC272A186D961B7646E0F3B58E0E41C1040EBBFCFF009FF3 -FF00D64FF3FE7FCFFF005A65CD6F7581C1FF00C2EAF0F0FF0098778B7FF08DD6 -3FF917FCFF0023FE175787BFE81DE2DFFC23758FFE45F6FF003DBBDFF3FE7FCF -FF00593FCFF9FF003FFD68B54EEBEEFF00820707FF000BABC3C3FE61DE2DFF00 -C23758FF00E45FF3FCB5FC33F10B4BF165FC969656BAE412C71194B6A7A05FD8 -47B4103024B88514B723E5073804E300E3A6FF003FE7FCFF00F593FCFF009FF3 -FF00D66954BEAD7DDFF0403A7F9FF3FE7F43FCFF009FF3FF00D65009E9FE7FCF -F9F6307E9FE7FCFF009E9A0181E35D3750D474297FB3355D5F4ABBB7CCEBFD88 -B66D7171B55B108FB5C6F10DC71C9DBC8196519AF34F09F8A3C49E24F0F7837C -38DE22BC83C43A97F69DD6ADAB1B7B6FB559476771E4CD6B19F28C0F3457135B -C064F27CB9238A79176131D7AAF897C3D2F886C1218357D4742BA8A512C37DA6 -488248DB05482922BC72295661B644600E1800EA8CB803E14E9F6BA1D8DA586A -5A8E97AA59C9713C5AEDA98BED9E6DC4865BA66DF1B44CB348C5DA331F961B63 -2A218A329CB523273BC6FB77F35F8DAFFE61745EF875E26BAF15F8605E5F470A -5EDBDF5EE9B3B5BA958E592D6EE5B66955492515CC25C21662A1B6EE6DBBABA5 -FF003FE7FCFF00F5A9E83A0D8786B4A834ED360FB3DA439214BB3BB333167777 -6259DD98B333B12CCCCCCC4924D5FE83D2B785D45296E2B9CBF87FC7FA6F897C -59AF787AD2DF518AF7458E092E5EF2C65B68DC4B24F1AF94640A645CDB3FCEA0 -A10576B373B79AF867F1DF48F89FA0CFAFDA69977A5F86E0B66B99B59D42FF00 -4E6B7876A23B472F937523C4E11C3B2C8ABB403BB69C0AEC2CBC2A2D3C79AC78 -93ED3BCEA1A6D8E9FF0066F2F1E5FD9E5BA937EECF3BBED58C6063CBEA73C79D -5E7C2AD7BC6161AC596A365A1F822CAE7C2D77E188ADB40BA92F63923982885E -45682D82ADB01288E301862E65C18F9DDCD275559ADF5D3BF6D7A683D0EB3C0D -F13078CAFCD8DDF86B5CF09DEBD8C5A8DB5B6BF1C114975039C318D639643BA3 -3B0488DB5A332C5B80DEB55FE28E9BFDA1FD999F0F78B75ED9E6FF00C8ADAFFF -0065F939D9FEB7FD36DBCCCE3E5FBFB76B7DDCF2ED0B42F146AFE3CB1F127892 -C748D1FF00B374DBBD3E0B5D2B5296FF00ED1F689ADA467767B787CBD9F64500 -00FBBCC3CA6CF9B03C55F03BC31662D7FE11CF841F0EF56DDBFED1FDAB04563E -5F4DBB3659CDBF396CE76E303AE7E54DCE54DA7AFE7D3A59FE406F7C0151FF00 -0A27E1C75FF916F4DFFD258ABBC1FE7A7F9EDFE7B709F003FE484FC38FFB16F4 -DFFD268EBBCE80735BD1FE1C7D109EE2F3DFFCF4A4071FE47F9EDFE7B2E393FE -7BD274039AD442F3DFFCF4A4071FE47F9EDFE7B2E393FE7BD274039A005E7BFF -009E9480E3FC8FF3DBFCF65C727FCF7A0038A0039EFF00E7A52038FF0023FCF6 -FF003D976F7A50B8EF4804E7BFF9E9480E3FC8FF003DBFCF676D19A503140AE3 -79EFFE7A52004638A7D1405C4C1EF405C52D140AE263DEB83F826A0783B51FFB -193C41FF00A78BCAD0D77E1768DE22D567D46EEF7C4515C4DB77258789B52B38 -461428DB1437088BC019DAA32724F249AC8F809631E99F0FEE2CE1699E2B7F10 -6BB1235C4CF34855757BB00B48E4B3B71CB31249E4926B9EF2F6AAEB4B3FCD0F -A1E8647E54C3C8FF00EBFF009F4FF3DA4A69181C74AE84098C2307D3FCFF009F -F3D0FF003FE7FCFF00F59D8049FF003DE81F28F4A655CF80BFE0A9431E23F876 -3FE9C2EBFF00438E8A3FE0A97FF2327C3BFF00AF0BAFFD0E3A2BF2DADFC497AB -3A56C7E81CDFEB5FFDE34DA74DFEB5FF00DE34DAFD2E8FF0E3E88E37B8514515 -A81C16B3FF0025DFC1FF00F62D6B7FFA55A551F053FE44ED47FEC64F107FE9E2 -F28D67FE4BBF83FF00EC5AD6FF00F4AB4AA3E0A7FC89DA8FFD8CBE20FF00D3C5 -E572C7F8CFE7F9447D0EF2BCEEF7E0C5BDD5DAAC5E27D76CB431ABC7AD9D0201 -686D4DCADD8BC625DEDDA7DAF700C8479BFC45576AE147A2D15BCA119EE23819 -3E10D9CBAF5C5DB6BBAB8D167D4A2D5DFC34BF675D3C5DC6D1CAB22E21F39333 -C4B3B2ACA15E52ECC08770DDED2D14E3051D804A28A2A8028A28A0028C0EDC51 -4500263DF349823B7E54EA2985C6F3DFFCF4A4071FE47F9EDFE7B3E8C0A0771B -CF7FF3D2901C7F91FE7B7F9ECEDA29029C75A02E705F1FF3FF000A23E23E7FE8 -5BD4BFF4964AEF01C7F91FE7B7F9EDC27C7F5FF8B11F123FEC5BD4BFF4964AEF -36903FC2B25FC47E8BF51F40E7BFF9E9480E3FC8FF003DBFCF65DBCF4A36902B -600E7BFF009E9480E3FC8FF3DBFCF65C7B7F9CD20071400BCF7FF3D2901C7F91 -FE7B7F9ED85E2FF1743E11B7B126C2F356BFD42EBEC763A75879626B997CB795 -955A5748D711432B92EEA311900962AA71D7E2AD85C687617761A76A3A9EAB7B -25C4116836CB10BC125BC862BA562F22C4AB0C8A51A43208CB6C547632441F37 -5229D9B03B6E7BFF009E9480E3FC8FF3DBFCF6C9F097896D7C63E1CB0D66CE39 -A08AEE30ED6D7202CF6D203892199413B258DC323A672AE8CA791C6B74039AB4 -D357402F3DFF00CF4A4071FE47F9EDFE7B2E393FE7BD274039A602F3DFFCF4A4 -071FE47F9EDFE7B2E393FE7BD274039A005E7BFF009E9480E3FC8FF3DBFCF65C -727FCF7A4E8073400BCF7FF3D2901C7F91FE7B7F9ECB8E4FF9EF49D00E680179 -EFFE7A52038FF23FCF6FF3D971C9FF003DE93A01CD002F3DFF00CF4A4071FE47 -F9EDFE7B2E393FE7BD274039A005E7BFF9E9480E3FC8FF003DBFCF65C727FCF7 -A4E8073400BCF7FF003D2901C7F91FE7B7F9ECB8E4FF009EF49D00E680179EFF -00E7A52038FF0023FCF6FF003D971C9FF3DE93A01CD002F3DFFCF4A4071FE47F -9EDFE7B60F8BFC5F0F846DEC4FD82EF56D4350BAFB1D8E9D61E589AE65F2E495 -955A5748D711432B92EEA311900962AA7217E2AD85CE87617561A76A3A9EAB7B -25C4116836AB10BD12DBC862BA562F22C4AB0C8A51A43208CB6C547632441F37 -5229D9B19DB73DFF00CF4A4071FE47F9EDFE7B51D0757875FD2E1BE857CBDFB9 -2484CB1C8F04A8C52585DA3774DF1BAB230562032119E2AF8538EB569A6AE20E -7BFF009E9480E3FC8FF3DBFCF6F35D0B43B6F05FC5AF1FEB97325DDA68D71A26 -9B7736A5AA5E4D2DBA3A5C6A4F30492672B1246AD1B18D0AA207076A86E792FD -9DB47F01AEBD7CDF0EEF7497D0741D361D11E4D2A6805CEA9386224BBBD5880F -331E40586570858BDE32868E48DCF3FB6778C5AD5DFAF619EF1CF7FF003D2BC8 -FE3D5EF85ED0685FF09268FF000EF56DDE7F91FF0009EEAD158F978F2F77D9F7 -DB4DBB3F2EFC6DC613AE7E5E6FF66DD27C2BE02BF83C2DE0DD6F43F1B5949A42 -CDA96BFA35BD9A496F71018A38E29DED570CB309657884C4CA0C339324DBBF77 -D3F8A7C4DE28F02FD97FE124F8A7F0EBC3DF6ADDF67FED4D0A5B6F3B6E376CDF -AA0DD8DCB9C74DC3D6B1955F6946ED5BEE697DF64C3666EFC01CFF00C289F871 -FF0062DE9BFF00A4B157780104715C2FC00FF9211F0DFF00EC5AD37FF4963AEF -2BA68FF0E3E8896C4C1EF405C52D15A8AE18FC68C01DA8A29005145140051451 -4005145140051452D002514B450025707F053FE44ED47FEC65F107FE9E2F2AFE -BBE36D6748D567B4B4F00788B5BB78F6EDBFB0B8D3561972A09DA26BC8DC6092 -A7720E41C64609C8F8097325E7C3FB8B89AD26B0965F106BB23DA5C143242C75 -7BC2518A332965E876B30C8E091CD61CC9D54BC9FE687D0F44A2968ADC4348FC -A9A0E3FC8FF3DBFCF67D348C0E3A531A3E01FF0082A5FF00C8C7F0EF3D7EC175 -FF00A1C7451FF054BFF9193E1DFF00D785D7FE871D15F9756FE24BD59D6B63F4 -126FF5AFFEF1A653E6FF005AFF00EF1A657E9747F871F4471BDC28A28AD40E0B -59FF0092EFE0FF00FB16B5BFFD2AD2AB03E0A786F50F2351D5BFE12AD5FEC1FF -000927883FE245E559FD8FFE42978BF7BECFE7F5F9FF00D6FDEFF67E5ADFD67F -E4BBF83FFEC5AD6FFF004AB4AA3E0A7FC89DA8FF00D8CBE20FFD3C5E571A57AC -FE7F9447D0EF68A28AEC105145140051451400514514009452D14009452D1400 -9451450014514500715F1BF4FBAD5BE0BF8FEC6C6DA6BCBDB9F0FEA10C16D6F1 -99249646B6902A2A8E598920003924D41FF0BAFC3DFF0040EF177FE119AC7FF2 -2D7794564E32E6E68BFEBEF40707FF000BAFC3DFF40EF177FE119AC7FF0022D7 -4DE19F1459F8B6C24BCB18751822494C45753D32E6C24DC003911DC468C57E61 -F3018CE46720E35A8AA4A77F79AFBBFE08051451560715F1435BF14E9961656B -E17F0FEA3AACB7B298EEAFF4E92CC49A7C2064BA25D4D1ABCADC2A6728A72EE1 -C208A4C89BC2D71E18B9F0A789341F0E5DCE9A669B796571E1D1710FDBCFDB24 -B69A494CD24DE5CB3ACB6FFBC2F2FEF3CD964F359942C9E9945652A6A4DB6FFE -07A0EE733F0EBC3375E13F0B8B3BE9217BDB8BEBED4A75B725A38A4BABB96E5A -25620175433140E554B05DDB573B474D4515A4528A515D0464789BC2D65E2DB0 -8ECEFA6D46085251306D3353B9B093700460C96F22315F98FCA4E33838C818E6 -47C13F0E8FF98878B7FF000B2D63FF0092ABBDA2A5D3849DE4930BB382FF0085 -27E1EFFA08F8BBFF000B3D63FF0092A81F04FC3A3FE621E2DFFC2CB58FFE4AAE -F68A9F654FF957DC3BB382FF008527E1EFFA08F8BBFF000B3D63FF0092ABBDC0 -1DA8A2AE308C3E15615C31481714B4558098F7A02E2968A004C7BD723AEFC2DD -1BC43AACFA8DD5EF88A1B89B6EE4B0F136A56708C2851B6286E11178519DAA32 -724F249AEBE8A9945495A4AE17382FF8527E1EFF00A0978BBFF0B2D63FF92A90 -7C12F0F0FF00988F8BBFF0B2D63FF92ABBEA2B3F654FF957DC3BB382FF008527 -E1EFFA0978BBFF000B2D63FF0092AB5BC31F0EB4AF08DFBDE58DDEBB3CCF1184 -AEA7AFDFDFC7B4953911DC4CEA1BE51F301903233826BA7A29AA704EEA2BEE0B -B131EF40502968AD44715F1435BF1469B61656BE17F0FEA3AACB7B294BABFD3A -4B3F334F840C9744BA9A357958E153394539770C10452644DE16B8F0C5CF853C -49A0F872EE74D334DBCB2B8F0E8B887EDE7ED925B4D24A66926F2E59D65B7FDE -1797F79E6CB279ACCA164F4CA2B1953E66DB7FF03D077399F875E19BAF09F85C -59DF490BDEDC5F5F6A53ADB92D1C525D5DCB72D12B100BAA198A072AA582EEDA -B9DA3A6A28AD2294528AE820A2BCCEE7E29EA9E1BD7BE22FFC249A65A5BE8BE1 -7D120D72DFFB2AE1EE6E6E6066BEDC5F7AC6AAE56D17118C8524FEF181F960D4 -FE24EBDF0F2FEF5FC6434EBDB21E1FD4BC4421D0ADE4492CE3B236FE65BEF964 -22E5985C80B26D8066224A0DF84C7DB412BFF5BDBF31D8F53AE0FE29F8CFFE11 -1FECCFF8AF3C23E09FB479BFF234C1E6FDA76ECFF55FE976F8DBBBE6FBDF7D7E -EF7AFE0CF1078CB4EF16DA787BC6F71A15EDEEA5A436A56B2787ECE682386482 -48D2EE2732CCE5D73736DE5B80A5809772A61776478A7E23E9FE20FB2FD8359F -889E19F2776FFECAF03DE3F9F9C637FDA34D971B7071B76FDE39CF1899D44E1D -9FDDFAAFCC12D4DFF801FF002423E1BFFD8B5A6FFE92C75DE5707F003FE4847C -37FF00B16B4DFF00D258EBBDAD28FF000E3E884F7128A5A2B50128A5A2801296 -8A2800A28A2800A28ACFD775BB7F0E6953EA3771DDCB6F0EDDC9616535E4C72C -146D8A14776E48CED5381927001206D2576068515C4DB7C63F0BDD783EEFC509 -71A8AE8F6D7C34D769747BC8E76B9332C1E5240D1095DBCE711FCA87E70CBD55 -80B12FC53D02DFC2B73E22B85D5ECF4D82E62B36177A1DF4170F2C92471C6A96 -EF08964DCF2A2828841248CF0719FB587F32EFBF4EE16675D457231FC55F0DCD -E15B7F10C77578F6173732D9410AE9B726F259E392449625B4F2FCF2E86194B2 -84C858DD880AA48D7F0A78AF4DF1AE8916ADA4CB34B6524B3420DC5B4B6D22C9 -14AF1488D1CAAAE8CAF1BA90CA0E569A9C64EC9858D7AE0BE0A7FC89DA8FFD8C -9E20FF00D3C5E577B5C17C14FF00913B51FF00B197C41FFA78BCA97FC45E8FF4 -0E877B451456A01494B45007E7F7FC152FFE464F877FF5E175FF00A1C7451FF0 -54CFF9193E1DFF00D78DD7FE871D15F97D6FE24BD59D8B63F41261FBD7FF0078 -D329F2FF00AD7FF78D32BF4BA3FC38FA238DEE145707FF000BFF00E17FFD148F -08FF00E0F6D7FF008E527FC2FF00F85FFF004523C23FF83DB5FF00E3947B6A7F -CCBEF0B30D67FE4BBF83FF00EC5AD6FF00F4AB4AAE4BE18FC50D1BC3BA1EB1A7 -5DD9788A5B887C4BAF6E7B0F0CEA57909CEAD76C36CB0DBBA3704676B1C1C838 -208ABFA7F8FF00C2FE39F8EFE19FF846FC49A47887ECBE1AD63ED1FD957D15CF -93BAEB4BDBBFCB63B73B5B19EBB4FA56F7C14FF913B51FFB197C41FF00A78BCA -E68B72AADC1AEBE7D22574D4EBB42D6EDFC45A541A8DA47770DBCDBB6A5FD94D -6730C3153BA29951D79071B9464608C820D705E23D5BC79A2F8CF42B0B6D6BC3 -B7F6FAB6A44269A343B859E1B043BE79649C5E301B23DB1893C9DA669A052A82 -4C8F4CAA136856371AF59EB5241BB52B3B69ECE09F7B7C914CF13CABB7383968 -223923236F0464E7AA71724B5D7EE24F3ABEF893AF10BE22B35D393C2B1F8823 -F0EB69D3DBC86FA790EA234E92E04E250912ACCCCC23F2E42C91025D0CBB62F5 -4AE0A5F843672EBD7176DAEEAE3459F528B577F0D2FD9D74F1771B472AC8B887 -CE4CCF12CECAB285794BB3021DC377B534D4D5F9BFAFF80361451456C20A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28012968A -28012968A280128A5AE67E27F89AEBC15F0D3C5BE21B18E196F748D22EEFE08E -E0131B49142EEA1802095CA8CE0838EE2949A8A727D00E968A5A29809452D140 -09452D14009452D14009452D14009452D1400945733A8789AEAD3E25E83E1E48 -E13657FA46A37F2C8CA7CC125BCD648814E70148BA933904E42E08C1CF4F4934 -DB4BA009452D14C04A5A28A004A5A28A00C8BAF0968F7D7FAADE5D69F0DD4BAA -D8C7A6DF2DC03247716D1998AC4D1B654AFF00A44D9E390F839006391D33E09E -9E9613D9F8875FD77C6B13E913E848DAECF17991D9CC105C47E641144CED2795 -16E9242EF98C15652CDBBBDD4350B5D26C2E6FAFAE61B3B2B689A69EE6E2411C -7146A09676624055001249E0015C57FC2FFF0085FF00F451FC23FF0083DB5FFE -39584D524FDFB0F52FF873E1F368FAF2EB5A9F89357F146A50DB49676B3EAAB6 -B1FD9A291A3795516DA0841DED0C24970C47963695CB6EA1F14F52FECFFECCFF -008A8BC5DA06FF0037FE456D07FB53CDC6CFF5BFE8573E5E33F2FDCDD96FBDB7 -E53FE17FFC2FFF00A291E11FFC1EDAFF00F1CAC0F14FC49F83FE31FB2FDBFE28 -6916FF0066DDB3FB2BC6CDA7E77633BFECF731EFFBA31BB38E718C9CE729C141 -A8495FD7F5BDC3537FE007FC908F871FF62D69BFFA4B1D77B5C17C00FF009211 -F0DFFEC5AD37FF004963AEF6B6A3FC38FA213DC28A28AD4028A28A0028A28A00 -28A28A002A86BDA95C691A54F7769A55E6B7711EDDB6160D0ACD2E5803B4CD24 -69C0258EE71C038C9C037E8A1EA80F1CD0BC04B07C28D5742D67C17A8EADE188 -EFAD9F46F065D5E41737705A43F66290CB24970627517114B28469DD7CA289D0 -794B05A785BC496163A1EA96FE1CBB8B4DD0FC4AFA969BE141716DF6DB5B06D3 -25B4FB3A379DE40C5C4F2CAA9E7ED480AA295D8B0AFB5515CDEC23A6BB7A7F97 -E1B790EE78A7FC22DE24FED4FF0084CBFE11CBBF33FE12EFEDFF00F847FED16D -FDA1F67FEC5FECCDB9F3BECFBFCCFDEE3CEC795DF7FEEEBA7F097842EB5BB4F1 -ADC6BB65A8E8317897578EFE3B28F5136F7D6F1C769696E03CD6929D8CCF6ACD -FBB94828EA18825907A25154A8C53DEFD7E617382FF8529E1EFF00A08F8BBFF0 -B3D63FF92AA0F809631E9BF0FEE2CE1699E2B7F106BB1235C4CF34855757BB00 -B48E4B3B71CB31249E4926BD12B82F829FF2276A3FF632F883FF004F17949423 -1A8B955B47FA05F43BDA28A2BA04145145007E7F7FC1533FE464F877FF005E37 -5FFA1C7451FF00054BFF009193E1DFFD785D7FE871D15F97D6FE24BD59D8B63F -4126FF005AFF00EF1A6D3E61FBE7FA9A657E9747F871F4471BDC28A292B5016B -82F827FF002276A3FF00632F883FF4F1795DED791FC14F0DEA3E46A3AB7FC255 -ABFD83FE125F107FC48BCAB3FB1FFC852F17EF7D9FCFEBF3FF00ADFBDFECFCB5 -8C9DAA474E8FF41F43D72929692B610628A5A4A0028A5A4A0028A28A0028A28A -0028A28A0028C514500145145001451450014514500145145001451450014514 -50015C17C7FF00F9211F123FEC5AD4BFF4964AEF6B8AF8DFA7DD6ADF05FC7F63 -636D35E5EDCF87F50860B6B78CC924B235B481515402598920003924D65575A7 -2F4635B9DAD15C17FC2ECF0F7FD03BC5DFF8466B1FFC8B47FC2EBF0F7FD03BC5 -DFF8466B1FFC8B47B6A7FCCBEF1599DED15C17FC2EBF0F7FD03BC5DFF8466B1F -FC8B47FC2EBF0F7FD03BC5DFF8466B1FFC8B47B6A7FCCBEF0B33BDA2B82FF85D -7E1EFF00A0778BBFF08CD63FF916B91F899F13B4CF1768307876DF47F173E99A -C5CAD9EB13FF00C21FAB0F2B4FDAEF3AED36C0B79CA9F66CA10C9F69F301FDDD -4CABD34AEA49FCC76675DF063E32687F1C3C2B79AF68126FB4B6D4AEB4F6F964 -19F2DCF96FF3A21FDE42D0CB8C7CBE66D272A6BBDAF99FC03E318BC1DE23B6D5 -5741F172FF0069EA5ACDAEAF17FC225AA7168FA8DEDED85D67ECC7EEF9CE9E5A -00C7EDDB9FFD4803D6FF00E175F87BFE81DE2EFF00C23358FF00E45ACA8D74E0 -BDA495FF00AFEBD41AEC77B45705FF000BAFC3DFF40EF177FE119AC7FF0022D1 -FF000BAFC3DFF40EF177FE119AC7FF0022D6FEDA9FF32FBC56677B45705FF0BA -FC3DFF0040EF177FE119AC7FF22D1FF0BAFC3DFF0040EF177FE119AC7FF22D1E -DA9FF32FBC2CC359FF0092EFE0FF00FB16B5BFFD2AD2ABBDAF2BD33C4D0F8D7E -34787EFB4DD3B5D8ACAC3C3FAAC37173A9E857BA7C6B24B73A718D035C431866 -610CA70B938435EA94A9B52726B6BFE8818514515B005145140051451400518A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -5A4A0031452D2500725AEF8DB59D23559ED2D3E1FF0088B5BB78F6EDBFB0B8D3 -561972A09DA26BC8DF824A9DC8390719182723E025CC979F0FEE2E26B49AC259 -7C41AEC8F6B7050C90B1D5EEC94628CCA58743B598647048E6BD16B81F829FF2 -26EA3FF632F883FF004F1795859AAA9B7D1FE83E877D451495B885A4A5A4A00F -CFEFF82A67FC8CBF0F3FEBC6EBFF00438E8A3FE0A99FF232FC3CFF00AF1BAFFD -0E3A2BF2FADFC497AB3B16C7E85CA9F39C93824F5FF3FE71F946538CE33F87F9 -FF003FA5B650589FF3FE78FF003D99E5607419FA7F9FF3FA7E8B465FBB8FA239 -1AD4AA531C63069A5307191F9D5B287DC73F973FE7F2FC99B4A81C8F63D3FCFF -00F5BF2DD48456C1C6715C17C14E3C1DA8FF00D8CBE20FFD3C5E57A2794327AF -1D79CFF9FF003F870FA87C0CF873ABEA1737D7DE00F0B5E5EDD48D3CF7371A35 -BC924B231DCCECC532CC492493D493F844B9B994A3D3FE001D8D15C337ECF9F0 -BC7FCD36F090EDFF00202B5C7FE81F5A69FD9F7E17E323E1C7847E8742B5FF00 -E229F354ECBEFF00F801A1DDD15CCF867E17783BC15A83DEF877C25A16837B24 -4617B9D334E86DE468C90C50B2282572AA71D32A3D2BA62315A45B6B500A28A4 -AA0168A2928016929692800C514B49400514B494005145140051451400514514 -0051451400514514005145140051451400514514005145140051451400514514 -0051451400514514005145140051451400514514005145140051451400514514 -00628A5A4A0031452D25002D14525002D14525002D14525002D1451400515435 -DF0F697E2AD2A7D2F59D36D357D367DBE6D9DFC0934326D60CBB91C15386008C -8E0807B5725FF0CFBF0C319FF856FE111F5D0ED7FF008DD672724FDD4BEFFF00 -80077945707FF0CFDF0BFF00E89C78473FF602B5FF00E229C3F67CF85FC7FC5B -8F091F5FF890DAFF00F1153CD53B2FBFFE00687755C17C13FF00913751FF00B1 -97C41FFA78BCA97FE19EFE18633FF0ADFC220FA1D0AD47FEC9F5FF003D3AED07 -C3BA5F8574B834DD174DB3D1F4C837793676102C10C7962CDB5100032C589C0E -A49F5A95CCE6A525D1F5F4F207A16B19A5DA7DBF3AB0221CF19ED8CE7FCFF9FC -009B71CE3BE73FE7FCFE9AF3015C29205294C13C8FCEAD6DF427AFE5CFB7F9E3 -F2688C600CF3F4FF003FE7F45CC07E7A7FC153463C4DF0F0631FE8375C1FF7E3 -A297FE0A9E31E28F87DDBFD0AEFF00F438E8AFCCEAFF00125EACEC5B1FA267BF -3EFD7FCFF9FD0DA73D3FCFF9FF003E8FC6450573CFF4AFD0293FDDC7D118B891 -E3FCFF009FF3FD13663D07D3FCFB7F9ED211E8781DE93001C6303D335ADC9E52 -32BEE7D7FCFE5FE7B34C7C72323FFD5FE1FE7B4A73C1CE38FF003FE7FC831EDF -80FF003FE7F955C9B102C78C7047AF3F4FF3FE78605E87238EF9FF00EBFB7F9E -D648C7B7A7F9FF003FE098EBFE3FE7FCFE8F98562B98CFDD23FCF1FE7FCF0DDB -81904E7AF4FF003FE7F4B1B07F93FE7D3FCF64F2F2304838F6FF003FE7F47CC2 -2B3478CF4E3FCFF9FF003863263DBD326ADEDC0E87B7E1FE7FA7E4C31855EBCF -BF1FE7FCFE14A4056DA4806908C1C1AB3E5E493804F423F1FF003FE7A34A918E -A0F51CFF009F4FF3DAB980828A94C5DF8C8E3078F6EFFE7FA34C63AE7029DC06 -514BB7A73CD2152074AAB8051451400514525002D14525002D14525002D14525 -002D14525002D14525002D14525002D14525002D14525002D14525002D145250 -02D252D25002D252D25001452D250018A5A29280168A29280168A29280168A29 -280168A28C1A0028A5DA73DBF3A511934AE0368A7F947BE41F7E3FCF7FCA9DE5 -8F6FF3FE7FCF62E045454C21C9FA7A0FF1FF003FD1C17A718EE3E6C7F9EDFE7A -2E60200A4D1B4FB7E7560423278CF6EB9EFF00E7FCF4708B2A307F4FF3FE7F45 -CC0560B919A5F2FF00D9247F9FF3F855A087BE7F963FCFF4FC8108006719FA7F -9FF3FA4F3015C4401C1FF3FE7FCFB3954641DD83FE7FCFF9E2C08C0FC3A7F9FC -3FCF65098FC38EBFE7FCFE93CC3B100888F94F3F5FC3FCFF009E058F3D307FCF -F9FF003D2C05007F9FF3DBFCF65DA79F51E9FE7FCFF25CC162158B1D88F5E7E9 -FE7FCF0A22E99EDEFF00E7D3FCF69B6FE1FE7FCFF9E801CF403D81FF003FE47E -4AE1CA442303D8F7C7F9F6FF003D9C131FE7FCFA7F9ED27519F4EF9A5C609C7E -59A5729448F1FE7FCFD3FCF650B8E381F4FF003EDFE7B3F04F7E9DF346067D3D -071FE7B52B8F94663FCFF9FF003FD00BCE3F97F9FF003FC9F8E383C0A52BDFF4 -A2E1CA7E74FF00C1543FE469F87DFF005E577FFA1C7452FF00C154463C55F0FC -7FD395DFFE871D15F9D55FE24BD59D08FD19099507DA865C1F4FA9A9A34CC6B9 -1CE050570339FE9FE7FCFE1F7949FB91F432BEA41B4E334D231EC6A7F2F9E80F -D3FCFF009FE415E7D3FCFF009FF3D35B8EE418A42B9CF5A94A50507D29DC3421 -DA074E282A3D47A0A936D2153CE4115570B2233DF9C679FE7415C1E3F41FE7FC -FE8FC7E748477C027E945C5CA47C75E9FE7FCFF9E8118FF3FE7FCFE8FC10319E -05046491EA7D6991CA4447F8FF009FCBFCF64D98E87FCFF91FE7B4A54F5CFE39 -A0AF240181FE7FCFF9E1DC5CA41E5E3B63E9C7A7F87F9ECD311E063A7BFF009F -4FF3DAC6DC0F4FF3FE7FCF40AE7A0FCBFCFF009FE4EE2B15BCAEC7F2FCBFCFF9 -E1020EA081EFFE7FCFF4B2571D723D3FCFF9FF0004DBC63A63DFFCFF009FD1F3 -0AC56311FBA73FE7FCFE9F9205039DC463DBFCFF009FD2CEC031FE3FE7D3FCF6 -5D9F863DFF00CFF9FD1F3058AC623C0393F87F9FF23F2688C633FD3FCFBFF9E9 -6B6018FF001FF3E9FE7B1B31F871D7FCFF009FD0E60B150C782471F8F1FE7FCF -E0797919FC7F9FF87F9ED6B60FF27FCFA7F9EC042075E9FE7FCFF9C3E6158A86 -2C1C71C7A9FF003FE7F40C78E809EF56C273FE7FCF6FF3D9BE50F6CFD3FCFF00 -9FD0E602B795F81F73FE7FCFE89E59E700FF009FF3FA55C098FC3A7F9FC3FCF6 -688B8E76E7E9FE7FCFE8F982C5531E3DA8311E700FD7FCFF009E2AE6CFF238FF -003FFD6FC9822C2E3033F4FF003FE7F43982C55D87E9F5A0A11F955BD873D0E3 -D3A63FCFF4FC9BE4903AF3F4FF003FE7F47CC0560991D690A904F4FCEAE0423A -E7F9639FF3F97E4D1171DFF2FF003FE7F43980AA1490282A413D3F3AB6D1E472 -0FE23FCFF91F926C0A065B07E98FF3FF00D6FC8E602A85268DA7DBF3AB3E5824 -F19F5E9C73FE7FCF44DA401CE3B8E71FE7FCFE0F980AE149A4E956561193C7B1 -E73DFF00CFF9E89E5E31CE3B83BB1FE7B7E5F91CC22BE0FA51D2AC793D78CF6E -B9FF003FE7F002F4E31DC7CD8FF3DBFCF4398657A2AC187938EDC1C1CFF9FF00 -3F82636804823B8E7FCFB7F9E8F980828A9962249F6E0803FC7FCFF443177200 -CFF9FF003FE70730115152F958E78E3B74FE7FE7FA1E5827B7F9FF003FE7B1CC -045454A61C7A71DBA7F9FF003F81B7073C0FF3FE7FCF42E1B115183CFB7AD4E2 -2CFD4601FF0027FCFF0045084007383DB27FCFB7F9E8B98080292052F9679C73 -8AB213B8EBC67DB9FF003FE7A021C0F5FC3FCFF9FD173015C47EDF8138A708C7 -E1F4FAFF009FF3C5AD983FE47F9E9FA7E42A6DFF00EB71FE7FCFE13CC041E51E -9CE3D31FE7FC8FC9550000E47D7FCFF9FE93EC031FE3FE7D3FCF6705C703B7F9 -FF003FE713CC3B15FCAEC7F2FCBFCFF9E1447D32091F5FF3E9FF00EAED3EDC7B -7A7F9FF3FE0A17E9C7F9FF003FE70730F948162C60E31F8FD3FCFF009E1E1318 -CF51FE7FA7F9ED26DC74FCFF00CFF9FE8EDA338C607A6695C1448B6F1D4FF9FF -00F57F9ECBB369EC3FCFFF005BFCF67E0E739FC734EDA3AE3F0E295CA5123C7F -9FF3FE7FA2EC39C73F97F9FF003FA3F69E99346D0695C6A2478FC3FA7F9FF3EC -E2A3D7BF1C53C2FF00914BB0F3C63B7A52B8F9466393CE282A3FC2A4DB4BE5FB -FE94AE3B222098ED8A76DA93671D314BB39CF4FF003FE7FCF45CC3D11105F414 -BB79C7F335288F3DB9FF003FE7FCF0BB7EA3F1C7F9FF003F82E60D110ED3E869 -4A9071C7E75288867A7F5FF3FE7F052B8FF3FE7FCFE87305C876923341520E38 -FCEA611F3DBFCFF9FF003D976E075FD3FCFF009FD17305C836E4669761F4FD6A -709CF5FF003FE7FCFA1B38EFF97F9FF3FA1715CFCE0FF82A9F1E2BF0076FF43B -BFFD191D14BFF055518F16F8047FD39DDFFE8C8E8AFCFAA7C72F566C7E90C7FE -AD3E8297BE7B8A48BFD527D053ABEEE9FC11F4472F5108CD205C74A7628AD42E -47E5F4FE9F8534AE3DBF1FF3FE7F49A8A07720287D33FE7FCFF9E8DC7A71FE7F -CFF9E963033D39A368C7A0FAD03B95CAE47F8FF9FF003FC9A539E9FAD59D833E -F49E5F145C7CC5629EC690A9071C7E7567CBE7A526CFCFE9FE7FCFE8F987CC57 -DA480690AE3AFF003A9FCB04F18FF3FE7FCF60A60FF91FE7FCFE0F98772B95EF -F95215C83DEA7F2F9C01FD7FCFF9FC029CF3FAFF009FF3FC9F306841B07618A4 -23FF00AD5318E831FBD3E60B221C75E714151FE15294228F2FDFF4A2E2B222C7 -5E714151FE15294228D9EFFA5170B2222319FF003EBEF41407B8F6A936FBD050 -8A2E3B222208CF51DFFCF34151EBDF8E2A4DB93FFD7A5319E7F2F4A2E2E522C1 -E7A8EF4151EBDF8E2A4DBCFF00F5E8D879E31DBD29DC3948881F4EFF00E7FCFF -00F594A0E7FC2A4DBCFF00F5E82A79C8228B872A21C7E1FD3FCFF9F676CFC3F0 -E9FE7FCFB3F04FD68287B8A2E2E522C7E1FD3FCFF9F65DBEDF97F9FF003FCA4C -629368345C3948F1EFFE7FC8FF003D9761CF43FE7FCFF9ECFDBC7F852EDFA7E5 -4EE2E422C7F9FF003FE7FA2EC3E9FE7FCFF9F47E38C7F2A0AE79FE945C3948B0 -31FE7FCFF9FC976807B0FF003FFD6FF3DA4DA7A64D1B7BFF004A2E2E522C71FE -7FCFF9FC8D98F41F4FF3EDFE7B49B4F4CD295EF45C3948B1C7F9FF003DBFCF63 -6007B0FC7FCFA7F9ED211EFF008D0401D3F2E3FCF6A2E1CA44573FE7FCFA7F9E -C79783D7F5FF003E9FE7B4B827BF4EF9A42BCFF4CD3B8B948F6F1D4FF9FF00F5 -7F9EC8100FF3FE7D3FCF6970739CFE39A0AFFF00AB345C3948F6FB9FF3FF00EA -FF003D90263BF3F97F9E9FE7B4B83D739EBDE8DB83F8F4CD170E5198E3FCFF00 -9EDFE7B284E781F97F9F6FF3D9F8271CFE34BB7BF5F6C52B8D448F1EFF00E7FC -8FF3D9DB3F0FC3A7F9FF003ECFC7146D3D7D695CAE5B0CC7071C0A52A3D73E82 -9FB79FFEBD3B67A9A571F2A22DBC9A36F047E552ECFAD3BCB03FFAFF00E7FCFF -00239876443B076E2948CD4A23E7FCFF009FF3F93B6FD47E38FF003FE7F05CC1 -A221DA7D0D1B0FF935308867B7F3FF003FE7F076CFAE7E9FE7FCFE93CC1720DB -919A714E7A1FCEA711D023E3B51CC2E621098FF3FE7FCFE8BB71DF1FE7FCFF00 -9E930402942803BFE74AE2B916C3D08FF3FE7FCFA017D00FF3FE7FCF69B68CF4 -E69695C572209CE3FCFF009FF3F4509CF4E9EFFE7FCFE925140AE3025284C53A -8A42B898F5E7EB40503B014B451601319A0003A014B453B00514628A2D600A28 -C514580FCDCFF82AB7FC8DDE01FF00AF3BCFFD191D147FC155BFE46EF00FFD7A -5E7FE8C8E8AF80ABF1CBD59D2B63F48E24CC4841EA0538A63B8E3DEAC5BA136F -11C93F2AFE1D3DFF00CE3DB876DDA170DF4CF1FE7FFADEDC7DDD37EE2F4399EE -54DA4738A31EB56843924E327A119E9FE71FE7B34AEDC1208F439FF3FE7F4D6E -22B74A2A7311EA71C718E9EDDFE9FE7B218C7A0FC3FCFD7FCF42E80868A93CB2 -3A823EBFE7EBF97E4863C2E73CFF009FF3FE7834019D28A76D39FF00EBD26D20 -7228760128A5A4A2C0149B40E8052E28A56188466902629D452B00CDBCFAD376 -63B7E47FCFF9FD25A281DC8FCBFF0039A4D9EC7F3FF3FE7F4968A61723F2FF00 -CE69367B1FCFFCFF009FD25A296A1722D9FE7F2A4D87B0FF003FE7FCFA4D453D -42E4263CF07F97F9FF003FA205C73C0FF3FE7FCF49E8A2EC772131E783FCBFCF -F9FD102E39E07F9FF3FE7A4D45176172231E783FCBFCFF009FD102E39E07F9FF -003FE7A4DB47A734018145D85C84A13C63FCFF009FF3E89B31CE71F97F9FF3F9 -4FB47A7346D1F4FA5170B9018C9E39FCBFCFF9FD136E3BE3FCFF009FF3D27DA3 -3EF46D18FF00EBD170B909427D7F2FF3FE7F44D83FC8FF003FE7F49F60CFBD01 -401DFF003A2E3B9014EBFE7FCFF9FC10AF5E07F9CFF9FF003C58D833EF46CE38 -345C2E5629D7FC68F2FF00CE6ACECE69BE5D3E60E620F2FDBF5A429EC7F3AB3B -31E94823E3B668E61F310797F87E34853D8FE7567CB14823E3B668E60E62BEDF -63FE73414393C71567CB149B303A7347307315B61A5319AB1B39E98A4F2C81FE -14F98398AFB723346C393ED560474797C7F9FF003FE7F23983988766474C7D4D -1B31FF00EBAB013D850131DF8A57173116CC8EF8FA7F9FF3FA0171CFF9FF003F -E7E930519CE39A50001ED4AE2B9118F3C1FE5FE7FCFE8043E9FE7FCFF9F49A8A -0572311F4FF1A509EBFE7A53E8A02E376E7BE694003A014B4502B8514628A2C0 -1452F346C38E98FAD3D1084A29C14E7AD288B23AFD78FF003FE7F43440328A94 -447B83F8F1FE7FFADF91E58F41FE7FCFF9EC9B4808A8A9C4583C9C0E87FC9FA7 -F9EC9823B81E9CFF009F4FF38E0BA022DA7D28C62AC0883138078E0FF9FF003F -E06CC63236E7A1DD8FF3DBFCF42E0570A78A5D87BE3F3AB021C13C67B1E73DFF -000F4FF3D90464633C77049C7F9EDFE7A170200878A0A1F6FCEAD08F767207BF -B73FE7F2FC902600C900763FE7FCFE5C1702B04F7A0A633C8E2AE6CF4278C7E1 -CFB7F9E3DB84117CA39E7E9FE7FCFD382E056F2C0EC41F7FF3FE7F9062EBC1C6 -3AE7FCFF00907F0B623C75DDDBDB1CFF009FCBDB86AC581EBF87F9FF003F4E15 -D01F9A1FF055718F17F808608C5A5E707FEBA47452FF00C156863C65E04E31FE -8B79C7FDB48E8AF81A9F1CBD4EA5B1FA636BFF001EB09CFF0000FE5FFD6FF3DA -52B8EBC7F9FF003FE7A25A0CDA43FEE0E7F0A976F7AFB7A6FDC8FA197291638F -F3FE7B7F9EC9B00F6FA7F9F6FF003DA523DF81DFFCFF009FE88476E9ED9FF3FE -7F4D2E2E522DBEA4FF009FFF0057F9EC863E99C11DFB7A7F87F9ED3107AE7F5F -F3FE7F408C1C741E9FE7FCFF0042E2E52B8876E38FAE0FD3FC3FCF6698B81C74 -EF9FA7F87FFABB59DBC7A7F9FF003FE7A18F6FCBFCFF009FE4EE2B157CAEC47E -1F97F9FF003C2041C1CAFD73FF00D7F6FF00F576B4571D723D3FCFF9FF0004DB -C63A638F4FF3D3FCF62E2B157C960769CFF9C7F9FC3F2618C15CE73F51FE7DFF -00CF4B7E5818EBF9FF009F4FD3F236606338238EBFE7FCFD3877405331609E9F -9E3FCFF9FC1BE5673C1C7F9FF3F87E577660FF009E3FCE3F4FC9BE56072149FA -7FF5FF00CFF22E053F2C8F63EF49B083D471EF577CB23D7DBB639FF3F97B70C2 -81547CD83DB3C7F9FF00EB7E4EE22A6D38E9C5263156BCAC9276E4F719E9CFE1 -FE7F4411918CE47704B63FCF6FF3D1DD015F69A4C62AD88704F19C71D73DFF00 -0F4FF3D9A232319C8EE096C7F9EDFE7A174057DA69318AB5E47271CE383839FF -003FE7F04D98C646DE320EEC7F9EDFE7A26D202B5156BC9E4E3B707073FE7FCF -E0D2A540382BDC1CFF009FF3FA3BA0D8AFD28AB0B1124FB70401FE3F4FF3D9A6 -2EE540CFF9FF003FE705D010F4A2A7F2B19E9C76E9FCFE9FE7B279609E83FCFF -009FF3D93680868A98C58F4E3B74FF003D3FCF60463D07F3FF003FE7F06DA021 -A2A5F2CF718C7AF1FE7BFE5F92795EFF0097F9FF003FC8D008E8A94447BE47D7 -8FF3FF00D6FC90459F5FCBFCFF009FD076023A2A43111D720FB8FF003EFF0097 -E4822C8EBF5E3FCFF9FD0D006514F3191C1C827D7FCFF9FE46CC2F5E7F2FF3FE -7F034019453B69271C557D46FAD747D3AEAFEFEEA0B1B1B489E7B8B9B990471C -31A8259DD9B01540049278001F4A1D96E04D45647857C4F6BE2EB092E6DA39AD -9E394C52DA5D854B880E03A79B164B44CF13C5288E40B22ACA9BD11B2A367610 -3B5174F501B453B69CFF00F5E9029C74C7D4D002514EDA73FF00D7A40A71D31F -534009452E334608ED8A760128A5C668C103914009452804D288FD7A527A00DA -2A4119C0EBCFE5FE7FC3F251101D71FE7FCFF9ECEE901174A2A710F3FA631FE3 -F8FF009E8E08475E3B839C7F9FF3F82BA02B853E94BB0F7C7E756443C9E33D8F -39C73FE7FCF4558BE51CF3DB8FF3FE7E9C1702A84E29DE5FB123FCFF009FC3F2 -B6233DF3FCB1CFF9FCBDB8042028CEDCFD3FCFF9FD15C0AA22DBDB07DCFF009F -F3FA3C28183BB18F6FF3FE7F4B22303F0E98EDFE71FA7E4E09C75E9EF8FF003F -E7F05743B1584441C107F11F4FF3FE7850838391F5CFFF005FDBFF00D5DAC040 -3B7EBFE7D3F4FC9C14F41DBD3FCFF9FE4AE162BAC4548C8C7D38F4FF003F87E4 -A22CE32091F5FA7F87FF00ABB4FB71EA3D3FCFF9FF0005DB9F41FE7FCFF9E8B9 -86A240916DC1C60F7E7E9FE1FE7B395318CE3DF1F87F87F9ED2EDC7B7F9FF3FE -7A183EC3FCFF009FF3D0B87291ED3C649FF38FF0FF003D8098C73F971E9FE1FE -7B4983C64FF9FF003FE7D171838C63F1FF003FE7F42E3E522DBEA4FAFF009FCB -FCF602007AFF004FF3D3FCF693D0F3C0EBFE7FCFF45DBCE3A7E3FE7FCFE8AE16 -23C71CFF009FF38FF3D9426D3D00FF003FFD6FD3F2790473FD7FCFF9FD0C638F -D3FCFF009FE85C3946638E7FCFF9C7F9EC05DBC703E9FE7DBFCF67E0FE5DF3FE -7FCFE8B803D8FA71FE7B5171F28CC7BFF9FF0023FCF65DBFE7FCFF009FE8E238 -E0F03FCFF9FF00385DBDFF00A5171F291E3FCFF9FF003FD176E3B1FF003FE7FC -F67ED238E68DBDF1CD3B8729F98DFF00055BFF0091CFC09DBFD16F3FF4647451 -FF00055C18F1A7817FEBD6F3FF004647457C254F8E5EA6C7E9C59AE6CE0FFAE6 -BDFDBFCFF9E9314F6FD696C57FD0ADCFFD335FE42A6D981D3FCFF9FF003E9F6B -4FE0465CC572BF87D690AE0E38FCEAC6CC7AFF009FF3FE7B26DC77C7F9FF003F -E7A6971F3106DE07E748571FFEBA9FCBC93D3FCFF9FF003D936FE1F8FF009FF3 -FA017202A7FC290AE78A9FCB19E3FCFF009FF3EC15E79FCBFCFF009FE8877457 -D9E831415EBFE7FCFF009FC2729FE7FCFF009FE8863FF3FE7FCFF462D08718CF -6F5FF3FE7FC10AE7B8F6FF003FE7FC26298A428707FF00D540EC88B1D7A8EFFE -7FCFFF00582BCFFF005BFCFF009FD24DBCE7FAD214F5A2E2E54458FC3FCFFF00 -5BFCF63611FE7FCFF9FD24DBC7A5057BF7FA51717291638FF3FE7B7F9EC6D0A7 -B0FA7F9F6FF3DA4DA7A67FCFF9FF003E8BB7BD3B8B948B1C73FE7FCE3FCF6368 -53D87D3FCFB7F9ED2153C019FF003FE7FCF65DBDE8B87291638E7FCFF9C7F9EC -9B003D87D0FF009F4FF3DA52A78033FE7FCFF9ECBB7BD170E421C71CFF009FF3 -8FF3D8D801EC3E87FCFA7F9ED295F73C77FF003FE7FA0401F5F4FF003F4A2E2E -522DB9EE7AF4FF003F4FF3D9047B4F5FCBFCFB7F9ED2E0FE5DF3FE7FCFE815E7 -D3DB3FE7FCFE85C3948B6FA93EBFE7F2FF003D8D801EBFE78FF0FF003DA5C11C -FA77CFF9FF003FA1B79C74FC7FCFF9FD0B8B948B67A93EFF00E7F0FF003D93CB -1C679FC3E9FE1FE7B4C54E339E9DF3FE7FCFE8630718C7E3FE7FCFE85C394804 -7B48C63DFB7A7F87F9EC7959001C11DFF4FF000FF3DA6C679E78EFFE7FCFF408 -20E381FE7FCFF9E85C394E5BC59E11D4BC47F64FECEF176B3E1430EFF33FB1E2 -B27F3F3B71BFED36D3636ED38DBB7EF1CE7036F3A7E1578938CFC5DF199FA5AE -8BC7FE53BFCE3F2F4AC679FD7FCFF9FE8BB4E7B0FF003FE7FCF49714DDDFE6C2 -C79A2FC2AF120FF9ABBE3307DAD745FF00E577F9C7E49FF0AABC49C67E2E78CF -1FF5EBA27FF2BBFCE07E1E97B718EDFE7FCFF9E8BB73E83FCFF9FF003D17247C -FEF7FE6248F345F855E241FF003577C660FB5AE8BFFCAEFF0038FC93FE155789 -38CFC5CF19E3FEBD744FFE577F9C0FC3D30AE3FCFF009FF3FA1B73E83FCFF9FF -003D0E48F9FDEFFCC2DD0F331F0AFC483FE6AE78D01F6B4D17DBFEA1DFE71F97 -07E2BB1D7FC1DF14BC2163AAEB5AFF00C49F0F3585FEB777A75F456625B592D2 -7B1586E6186D2D62372D11BA67F21B71F91648D5A68A243F4415C7F9FF003FE7 -F4E72FBC206F7E21E89E29FB504FECCD2EFF004CFB208F3E67DA66B3937EFDDC -6DFB1E31839DF9C8DB8312869EEFE7FE6348F11F8A7E22B8F1649A3F8A7E1C6B -DFD9366BAA695A36A1E2FD2C41711EA96F73A8436E6D2DC48AF0CDE49B9793ED -055842E1A28F7196E962F43FF8555E251CFF00C2DDF190F7FB268BC7FE53FF00 -CE3F2EAFC79E0FFF0084DB43B6D3BED7F61F2354D3752F37CADFBBEC97B05D6C -C6E5C6FF00236673F2EECE0E315D16D3F8FB7F9FF3FC850F79B7F9FF00C10B1E -65FF000AABC4BD0FC5DF190F6FB1E8BFFCAEFF0038FC907C2CF1275FF85BDE31 -FAFD9344E3FF0029FF00E71F97A76DC7A8F4FF003FE7FC00A79F51FE7FCFF9C6 -9C91F3FBD8ACCF32FF008555E25E87E2EF8C87B7D8F45FFE577F9C7E483E1678 -93AFFC2DEF18FD7EC9A271FF0094FF00F38FCBD38AE3AE47A7F9FF003FE0053F -88FF003FE7FCE0E48F9FDEC2CCF32FF8555E25E87E2EF8C87B7D8F45FF00E577 -F9C7E5A1E1EF006B5A2EB16F7D77F11FC49AF5B45BB7E9FA85BE96904B95206E -30D9C520C13B86D75E54678C8AEF0A01C91F4E3FCFA7F9EC05C0EC31FE7FA7F9 -EC2825FF000EC2C563111F295FF3C7BFF9FE48B1F46DC3F3FF003FE7F4B4547F -9FF3EDFE7B0171E831FE7FA7F9EDA5C562BF93D88FC3F2FF003FE78558BA6464 -7B1C7A7F87FF00ABB58DA073D3FCFF00F5BFCF650BFE7FCFF9FE85C2C40B0E31 -C63D79FA7F87F9ECAB1000038C0FE7C7F87F9ED36DC7F9FF003FE7F45C738C63 -F1FF003FE7F42E351E845B78E49FF3FF00EAFF003D94205FF3FE7D3FCF69369E -B9FC73FE7FCFE8A075FE54AE5728CC7BFF009FF23FCF63691EBF87F9FF003FCA -4DA7A7346DCF50295C7CA478FC3FA7F9C7F9ECE2A01F4FC3FCFF009FD1E17D3A -F6A5D879EDF8E28B8F9511FAFE7FE7FCFF00F582BFFD6FF3FE7FC24D9CFF00F5 -E9C1290EC88B6F3EFF00E7FCFF009E14AF5A93663D69DB07F9FF003FE7F92B86 -841B3D0629DB6A4D9ED8A5D833DBFCFF009FF3D81E843B71D302971EF52ECC7F -9FF3FE7F45C1CF5C7F9FFEB7F9EC05D10E3DE976E3F0A944793FE7FCFF009FC9 -4AE3D47E3FE7FCFE805C8769F7A5D98FFF005D481013C0FF003FE7FCFA2EDFC3 -F1FF003FE7F405721DBF5A5DB838E3F3A984433FE7FCFF009FC8DA47F9FF003F -E7F461CC43B72334A57071C7E75284E7B7F9FF003FE7B2ED0075FF003FE7FCFA -01CC43B78CD294F6FD6A60A3DFFCFF009FF3D9027F9C7F9FF3FA17173116DFA8 -FAD053DBF5A9C27F9FF3FE7FA1B303A7345C398FCBBFF82AF7FC8EBE06EDFE8D -7BFF00A323A297FE0AC1C78DFC0FFF005ED7BFFA363A2BE1AA7C6FD4D4FD3FB0 -1FE836FF00F5CD7F954F50D80CD8DB7FD725FE553D7D9D3F817A1CCD89462968 -AD3415C6D18029D4503B8D23349B714EA31CD082E376F34D31FB67E87FCFF9FD -24A31CD21DC8F663FCFF009FF3FA376E3DBFCFF9FF003D26A29DC772129FE7FC -FF009FE89B71CE71FE7FCFF9E93607A51B47F9345C2E4053D7FCFF009FF3EC85 -3FCFF9FF003FD27DA3F1A4D9F4A2E3E620D9F87E3414F63F9D58DB8A411F1DB3 -45C7CC41B3F0FC6829EC7F3AB1B714823E3B668B873106CFC3F1A0A7B1FCEAC6 -DC5208F8ED9A2E1CC41B38FF00EBD053DBF5A9CA526CC0E833FE7FCFF9E0B873 -106DFC28F2CD58DBED8FF3FE7FCF44F2F03FCFF9FF003F9171F315F6E46682B8 -38E3F3AB1B31EBFE7FCFF9EC9B38FF00EB7F9FF3FA170E620DB900D1B307E9EF -56367D7FCFF9FF003D93671FFD6FF3FE7F42E1CC57DBC0A3663FFD7560C63FC8 -FF003FE7F436E075C7F9FF003FE7A170B95F69F7A3663FFD753ECCF61FE7FCFF -009EC14C7FFAF1FE7FCFE0EE1CC41B4FBD26DC7E15388C67FC9FF3FE7F05298F -FF005E3FCFF9FC0B8F98AFB4D057FC9A9FCBF6CFE3FE7FCFE86DFC3F1FF3FE7F -42E2BA2011E3A0FA7146DA9FCBF4FD39FF003FE7F036FE1F8FF9FF003FA170BA -2BEDC74E282B9153F9633C7F9FF3FE7D94AE3DBFCFF9FF003D0B85D15F67A714 -15CD4E23C9FF000FF3FE7F9053BE00FF003FE7FCF407A106CC74A0AF5A9B67F9 -FF003FE7FA1B067B7F9FF3FE7B316841B3D06294AF5A98A63FCFF9FF003FA1B0 -67B7F9FF003FE7B01A106CF418A52BD6A629FE7FCFF9FE86C1EDFE7FCFF9EC06 -841B3D0629DB6A5D9FE7FCFF009FE8EDA7E9F8E3FCFF009FC00D11084E9E94BB -31FF00EBA984433FE7FCFF009FC942FF009FF3FE7FA2B85C836E4669DB0FA7EB -5304FAFF009FF3FE7B288F8ED45C5CC41B3F0FA9FF003FE7F4705C77C7F9FF00 -3FE7A4C131405C0C7F5A2F7173111427D7F2FF003FE7F450B8E781FE7FCFF9E9 -2ED19CD2E314AE2B916C3FE7FCFF009FE404F6FD7FCFF9FD25A2905C8C27F9CF -F9FF003FA1B3D8FE7FE7FCFE925140AE30263FCFF9FF003FA1B3A74FF3FE7FCF -67D1405C685FC28098EFFA53A8EF46817131EF405C52D14C57131F8D1B40A5A3 -1405C4C51803B53A931405C28A5A28417128C52D146817131452D18A0573F2E3 -FE0AC1FF0023C781FF00EBDAF7FF0046C7451FF0561FF91E3C0FFF005EF7BFFA -363A2BE22A7C6FD4E95B1FA91A7464E9F6A3923CA53FA0FF003F87E53040475F -AF1FE7FCFE869883FB36CCFF00D3143D7D87F87F9ED68A638CE08E3FCFF9FF00 -EB7D85397B8BD0C1A3C8FE377C586F87771E1DD134EB8B7875FD7A59CC0D369B -71A9B456F0461A6952CADCACB74C19E08FCA8983AACCD31063825C61F8ABE23F -C4093E1CF83751F0669965E24D6F53D5A4B1BF974FD3249E28A18E1BB2F2B5BD -C5D5A1B693CCB78D1E19E706177788B4AEA377A9F8C7C12FE29FB24F65AE5F78 -5F56B5DE91EAFA55B59C974217DA648375D413288DDA385982A824C31F385C56 -5C7F0B5F4CF065AE81A178AB5AF0E4B1DDCD7D71AAD8C7672DD5DCD3492CD70D -209EDE48879934CF2911C6814E020441B04BE66DF60B2347C17ADC5E25F0AE9B -A8C77F0EA4F2C2127B8B7B67B5533A652653048CCF032C8AEAD0C84BC6CAC8FF -0032B5735E3CF11F88D7C6BA07847C3175A5E977FA969F7DAABEA5AB58C97D12 -476B25A446110C73C07739BD56DFE66144446C6DF94DDB0F00CBE1BF02BF87BC -3BABCFA65D493493C9AC4F0C73DC1967B869AEEE027CB109A4692675F93CA476 -53E5144F2A9BE34F86EBE2CD474DD56D35ED57C2FAE69D0CF6B0EA9A42DB34BF -6798C4D34252E619622ACF040DBB607062003282E0DB6DC6DD7415B5D0ABF0AF -C5579E35F0358EA3A947045AC432DCE9BA92DAAB2DBFDB6D6792D6E4C3B896F2 -4CD048632C77142A5803903ADDA7DBF3ACDF057836CBC0BE14D3741B0927B986 -CA211BDD5D957B8BA9092D2CF3BA81BE695CBC923E01677763C9E364A600E718 -E9CE3FCF6FF3D2E37B2BEE22BE0D211567C8E4FB7079CFF9FF003F834A9183D3 -BF53FE7B7F9ED57020C50454C62C73C71F87F3FF003FD10A0F4FCBFF00D7F5FF -003D0021C52E2A4319EE08FE5FE7AD26C1D738E68D008E8C53F6F3FF00D7A361 -E68417194629DB4FF9346C3FFEBA02E368C53B69FF00268D87FF00D7405C6D18 -A76D3FE4D1B0FF00FAE80B8DA314EDA7FC9A0823A8A360B8DA314B8A5208EB42 -0B8DA314B8A08C75A02E2518A5A31405C4A314B4503B89462968A02E251B40ED -4B46280B8949B40ED4EA314C2E368DA076A7628C50171B46D03B53B1450171B4 -6DC53A8A02E371EF46DC52D18A02E263DE936E29D8A31405C4C7BD26C1FE453B -146280B8DDBC75A50A052D2E280B8DA5A5A280B89452D2E38A0571B4629DB4E7 -FF00AF4BB0E33C520B8CC52D3B6FBF34E11E7B9F7E28D1011E28C53CC6475041 -FD3FCF5FCA94479F5F71ED4680478A0D4BE59FEEE3EBC0FF003D7FCF45F2C7B7 -F9FC7FCFF234021C515318B1CF191DBA7F3FF3FD0D9CE4601F6EDFE7FCFB0043 -454FE573C9F6FF0039FA7F9EC6307AE076C1E9FE71FE7B004383E94639C54FE5 -024E01E383FE7FCFF82EC3C755EE3E6C7F9EDFE7A1702B852697611E9F9D5810 -804F19EDD73FE7FCFE08108C1E9E993FE7DBFCF42E16200848CD050827A7E756 -4479CE40F7FCFF00CFF9E804C0C138F4FF003FE7FC0B858AC132339A5F2F923A -E067AD5ADBE84FF873EDFE78FC904595183FA7F9FF003FA171D8AFB3EA3EB479 -641FBA48FF003FE7F0AB4108EB9FE58E7FCFE5F922C581EBF51FE7FCFE873058 -AFE5E3B7E67FCFF9FD011FB71EA6AD6DF6C7D38C7F9FE9F9208400338CFD3FCF -F9FD173058FCABFF0082B18C78EBC123D2DEF7FF0046A514BFF056418F1E7824 -7A417DFF00A3528AF89A9F1BF53A16C7E91597C58F0BDB59410B6AB6C5923552 -45C458C818FEFD4A7E2EF854FF00CC56DC7FDBC45FFC5D145762C6D64AC98590 -BFF0B7BC2DCFFC4D6DF9FF00A788BFF8BA43F177C2BDB54B6FFC088BFF008BA2 -8A7F5EADDC56427FC2DDF0B7FD052D87FDBC45C7FE3F47FC2DCF0B7FD052D87F -DBC45FFC5FF9FE4514FEBF5839507FC2DCF0B7FD056DBFF0222FFE2E907C5BF0 -B0FF0098A5B0FF00B788BFF8BFF3FC8A28FAFD60E541FF000B6FC2DFF414B6FF -00C088BFF8BFF3FC907C5AF0B0FF0098ADBFFE0445EDFED7B7F9EC5147D7EB77 -172A0FF85B5E17FF00A0ADBFFE0445EDFEDFF9FE4DFF0085B1E173C1D52D88FF -00AF88BDBFDAFF003FC8A28FAFD7F20E5422FC57F0B0C7FC4D2D87AE2E62F6FF -006FFCFF0023FE16B785B033AADB7FE04C5EDFEDFF009FE4514FFB42BF741C88 -6FFC2D5F0BFF00D056D7FF000222FF00E2FF00CFF207C55F0B820FF6ADAE7FEB -E22FFE2FFCFF00228A5F5FAFDC39107FC2D5F0BE30755B5C7FD7C45EDFEDFF00 -9FE40F8ABE17041FED5B5CFF00D7C45FFC5FF9FE45147D7EBF70E441FF000B57 -C2F8C1D56D71FF005F117B7FB7FE7F903E2AF85C107FB56D73FF005F117FF17F -E7F91451F5FAFDC39107FC2D5F0BE30755B5C7FD7C45EDFEDFF9FE40F8ABE170 -41FED5B5CFFD7C45FF00C5FF009FE45147D7EBF70E441FF0B57C2F8C1D56D71F -F5F117B7FB7FE7F903E2AF85C107FB56D73FF5F117FF0017FE7F91451F5FAFDC -39107FC2D5F0BE30755B5C7FD7C45EDFEDFF009FE40F8ABE17041FED5B5CFF00 -D7C45FFC5FF9FE45147D7EBF70E4427FC2D4F0C630756B6C7FD7C45FFC5FF9C7 -E40F8A9E18041FED6B607FEBE22FFE2FFCFF00228A7FDA15FBA0E441FF000B53 -C318C1D5ADB1FF005F117FF17FE71F903E2A7860107FB5AD81FF00AF88BFF8BF -F3FC8A28FED0AFDD07220FF85A9E18C60EAD6D8FFAF88BFF008BFF0038FC8FF8 -5A7E173D756B5FFC088BFF008BFF003FC8A28FED0AFDD072213FE169785FFE82 -D6BFF81117FF0017FE7F91FF000B4BC2FF00F416B5FF00C088BFF8BFF3FC8A28 -FED0AFDC392207E29F863FE82B6BFF0081117FF15487E29F863FE82B6BFF0081 -117FF1545147F6857F20E4887FC2D2F0C7FD056D7FF0262FFE2A8FF85A5E18FF -00A0ADAFFE04C5FF00C551451FDA15FC839107FC2D2F0C7FD056D7FF000262FF -00E2A8FF0085A5E18FFA0ADAFF00E04C5FFC551451FDA15FC839109FF0B47C31 -FF00415B5FFC098BFF008AA3FE168F863FE82B6BFF0081317FF1545147F6857F -20E441FF000B47C31FF415B5FF00C098BFF8AA3FE168F863FE82B6BFF81317FF -001545147F6857F20E4407E28F867B6AD6BFF81117FF001547FC2D1F0CFF00D0 -5AD7FF000222FF00E2A8A28FED0AFE41C883FE168F867FE82D6BFF0081117FF1 -547FC2D1F0CFFD05AD7FF0222FFE2A8A29FF006857F2FB839109FF000B47C33F -F416B5FF00C098BFF8AA3FE168F86BFE82D69FF81317FF001545147F6857F2FB -839107FC2D1F0CFF00D05AD7FF000262FF00E2A97FE168F867FE82D6BFF81317 -FF00154514BFB42BF9072217FE1697863FE82B6BFF0081317FF1540F8A5E1807 -FE42B6B8FF00AF88BFF8AA28A3FB42BF907221DFF0B53C318C7F6B5B63D3ED11 -7FF17FE71F903E2A7860107FB5ADB3FF005F117FF17FE7F91451FDA15FBA0E44 -2FFC2D5F0BE30755B5C7FD7C45EDFEDFF9FE40F8ABE17FFA0ADAFF00E0445FFC -5FF9FE4514BEBF5FB8722147C56F0C0C7FC4D6D47FDBC47EDFEDFF009FE40F8A -DE17E33AADB11FF5F317B7FB7FE7F91453FED0AFE5F70722157E2B785863FE26 -96DEF8B98BDBFDBFF3FC81F15FC2DC6754B6FF00C098BDBFDBFF003FC8A28FED -0AFDD072205F8AFE1618FF0089A5B0F5C5CC5EDFEDFF009FE40F8B1E17E33AA5 -B1FF00B798BDBFDAFF003FC8A28FED0AFDC3910A3E2C785C63FE2696A3D71711 -7B7FB5FE7F92AFC5AF0B8C7FC4D6D87D2E22F6FF006FDBFCF628A5F5FAFE5F70 -72A17FE16D785F8CEAD6DFF81117B7FB7FE7F920F8B3E161FF00315B6FC2E22F -6FF6FDBFCF628A3EBF5FBAFB83950BFF000B6BC2FF00F415B7FF00C088BFF8BF -F3FC81F16BC2C3FE6296DFF81117FF0017FE7F91451F5FADDC7CA85FF85B7E16 -FF00A0A5B7FE0445FF00C5FF009FE483E2DF85874D52D87FDBC45FFC5FF9FE45 -147D7EB77172A17FE16E785BFE8296DFF81117FF0017FE7F903E2DF8587FCC52 -D87FDBC45FFC5D1451F5FAC3E542FF00C2DCF0B7FD056DBFF0222FFE2E8FF85B -9E16FF00A0ADBFFE0445FF00C5FF009FE45147D7EB79072A0FF85B9E16FF00A0 -ADBFFE0445FF00C5FF009FE47FC2DCF0B7FD052DBFF0222FFE2E8A28FAFD60E5 -41FF000B77C2DFF414B61FF6F1171FF8FD1FF0B77C2DFF00414B61FF006F1171 -FF008FD1451F5FAC1CA8FCCEFF0082A8EAF67ADF8C7C0F75637115CC0D6F7BF3 -4322B804C919C120919C114514579EDDDDD947FFD9> -%%EOF diff --git a/Docs/InstallGuide/SOURCE/index.tex b/Docs/InstallGuide/SOURCE/index.tex deleted file mode 100644 index 8279664ca..000000000 --- a/Docs/InstallGuide/SOURCE/index.tex +++ /dev/null @@ -1,37 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Chapter file -%% -%% Written by Michael Basler, started September 1998. -%% -%% Copyright (C) 1999 Michael Basler (pmb@knUUt.de) -%% -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\eject - \addcontentsline{toc}{chapter}{\protect Index} - {\footnotesize - \printindex - } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -%% Revision 0.00 1998/09/08 michael -%% Initial revision for version 0.53. diff --git a/Docs/InstallGuide/SOURCE/landing.tex b/Docs/InstallGuide/SOURCE/landing.tex deleted file mode 100644 index 1c33ab682..000000000 --- a/Docs/InstallGuide/SOURCE/landing.tex +++ /dev/null @@ -1,390 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Chapter file -%% -%% Written by Michael Basler, started September 1998. -%% -%% Copyright (C) 1999 Michael Basler (pmb@knUUt.de) -%% -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Landing: Some further thoughts before leaving the plane\label{landing}} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\markboth{\thechapter.\hspace*{1mm} -LANDING}{\thesection\hspace*{1mm} THOSE, WHO DID THE WORK} - - -\section{Those, who did the work} - -Did you enjoy the flight? In case you did, don't forget those who devoted hundreds of -hours to that project. All of this work is done on a voluntary basis within spare time, -thus bare with the \Index{programmers} in case something does not work the way you want -it to. Instead, sit down and write them a kind (!) letter proposing what to change. -Alternatively, you can subscribe to the \FlightGear \Index{mailing lists} and contribute -your thoughts there. Instructions to do so can be found under - - \web{http://www.flightgear.org/mail.html}. - -Essentially there are two lists, one of which being mainly for the developers and the -other one for end users. -\medskip - - \noindent -These are the people who did the job (This information was -essentially taken from the file \texttt{Thanks} accompanying the -code): - \medskip - -\noindent Raul Alonzo\index{Alonzo, Raul} (\mail{amil@las.es})\\ Author of Ssystem and -moon texture. - \medskip - - -\noindent Michele America\index{America, Michele} -(\mail{nomimarketing@mail.telepac.pt})\\ - Contributed to the \Index{HUD} code. - \medskip - -\noindent Steve Baker\index{Baker, Steve} (\mail{sjbaker@hti.com})\\ - Author of \Index{PLIB}, a graphics/audio/joystick interface written entirely on top of - \Index{OpenGL}/\-\Index{GLUT} used in \FlightGear. An immense amount of coaching and tutelage, - both on the subjects of flight simulation and \Index{OpenGL}. It has been - his comments and thoughts that have prompted the implementation of - most of the more sophisticated features of \FlightGear{\hspace{-2mm}}. - \medskip - -\noindent Michael Basler\index{Basler, Michael} (\mail{pmb@knUUt.de})\\ - Coauthor of Installation and Getting Started (together with Bernhard - Buckel). -\medskip - -\noindent John S. Berndt\index{Berndt, John, S.} (\mail{jsb@hal-pc.org})\\ - Working on a complete C++rewrite/reimplimentation of the core FDM. - Initially he is using X15 data to test his code, but once things are - all in place we should be able to simulator arbitrary aircraft. -\medskip - - -\noindent Paul Bleisch\index{Bleisch, Paul} (\mail{pbleisch@acm.org})\\ - Redid the debug system so that it would be much more - flexible, so it could be easily disabled for production system, and - so that messages for certain subsystems could be selectively - enabled. - - Also contributed a first stab at a config file/command line parsing - system. - \medskip - - -\noindent Jim Brennan\index{Brennan, Jim} (\mail{jjb@foothill.net})\\ - Provided a big chunk of online space to store USA scenery for Flight Gear. - \medskip - -\noindent Bernie Bright\index{Bright, Bernie} (\mail{bbright@c031.aone.net.au})\\ - Many C++ style, usage, and implementation improvements, STL - portability and much, much more. - \medskip - -\noindent Bernhard H. Buckel\index{Buckel, Bernhard H.} -(\mail{buckel@wmad95.mathematik.uni-wuerzburg.de})\\ - Contributed the README.Linux. Coauthor of Installation - and Getting Started (together with Michael Basler). - \medskip - -\noindent Gene Buckle\index{Buckle, Gene} (\mail{geneb@nwlink.com})\\ - A lot of work getting \FlightGear to compile with the \Index{MSVC}++ - compiler. Numerous hints on detailed improvements. - \medskip - -\noindent Oliver Delise \index{Delise, Oliver} (\mail{delise@rp-plus.de})\\ - FAQ Maintainer. -\medskip - -\noindent Didier Chauveau\index{Chauveau, Didier} (\mail{chauveau@math.univ-mlv.fr})\\ - Provided some initial code to parse the 30 arcsec DEM files found at: - - \web{http://edcwww.cr.usgs.gov/landdaac/gtopo30/gtopo30.html}. - \medskip - - -\noindent Jean-Francois Doue\index{Doue, Jean-Francois}\\ - Vector 2D, 3D, 4D and Matrix 3D and 4D inlined C++ classes. (Based on - Graphics Gems IV ed. Paul S. Heckbert) - -\href{http://www.animats.com/simpleppp/ftp/public_html/topics/developers.html}{http://www.animats.com/simpleppp/ftp/public\_html/topics/developers.html}. - \medskip - -\noindent Francine Evans\index{Evans, Francine} (\mail{evans@cs.sunysb.edu}) - -\href{http://www.cs.sunysb.edu/~evans/stripe.html}{http://www.cs.sunysb.edu/\~{}evans/stripe.html} - - \noindent - Wrote the GPL'd tri-striper. - \medskip - -\noindent Oscar Everitt\index{Everitt, Oscar} (\mail{bigoc@premier.net})\\ - Created single engine piston engine sounds as part of an F4U package - for \Index{FS98}. They are pretty cool and Oscar was happy to contribute - them to our little project. - \medskip - -\noindent Jean-loup Gailly\index{Gailly, Jean-loup} and Mark Adler\index{Adler, Mark} -(\mail{zlib@quest.jpl.nasa.gov})\\ - Authors of the \Index{zlib library}. Used for on-the-fly compression and - decompression routines, - - \web{http://www.cdrom.com/pub/infozip/zlib/}. - \medskip - -\noindent Thomas Gellekum\index{Gellekum, Thomas} (\mail{tg@ihf.rwth-aachen.de})\\ - Changes and updates for compiling on \Index{FreeBSD}. - \medskip - -\noindent Jeff Goeke-Smith\index{Goeke-Smith, Jeff} (\mail{jgoeke@voyager.net})\\ - Contributed our first \Index{autopilot} (Heading Hold). - Better autoconf check for external timezone/daylight variables. - \medskip - -\noindent Michael I. Gold\index{Gold, Michael, I.} (\mail{gold@puck.asd.sgi.com})\\ - Patiently answered questions on \Index{OpenGL}. - \medskip - -\noindent Charlie Hotchkiss\index{Hotchkiss, Charlie} -(\mail{chotchkiss@namg.us.anritsu.com})\\ Worked on improving and enhancing the -\Index{HUD} code. Lots of code style tips and code tweaks\ldots - \medskip - -\noindent Bruce Jackson\index{Jackson, Bruce} (NASA) (\mail{e.b.jackson@larc.nasa.gov}) - - \web{http://agcbwww.larc.nasa.gov/People/ebj.html} - - \noindent - Developed the \Index{LaRCsim} code under funding by NASA which we use to provide the - flight model. Bruce has patiently answered many, many questions. - \medskip - -\noindent Tom Knienieder\index{Knienieder, Tom} (\mail{knienieder@ms.netwing.at})\\ - Ported Steve Bakers's audio library\index{audio library} to Win32. - \medskip - -\noindent Reto Koradi\index{Koradi, Reto} (\mail{kor@mol.biol.ethz.ch}) - -\href{\web{http://www.mol.biol.ethz.ch/~kor}}{\web{http://www.mol.biol.ethz.ch/\~{}kor}} - -\noindent - Helped with setting up \Index{fog effects}. - \medskip - -\noindent Bob Kuehne\index{Kuehne, Bob} (\mail{rpk@sgi.com})\\ - Redid the Makefile system so it is simpler and more robust. - \medskip - -\noindent Vasily Lewis\index{Lewis, Vasily} (\mail{vlewis@woodsoup.org}) - - \web{http://www.woodsoup.org} - - \noindent - Provided computing resources and services so that the Flight Gear - project could have real home. This includes web services, ftp - services, shell accounts, email lists, dns services, etc. - \medskip - - -\noindent Christian Mayer\index{Mayer, Christian} (\mail{Vader@t-online.de})\\ - Working on multi-lingual conversion tools for fgfs.\\ - Contributed code to read msfs scenery textures. - \medskip - -\noindent Eric Mitchell\index{Mitchell, Eric} (\mail{mitchell@mars.ark.com})\\ - Contributed some topnotch scenery \Index{textures}. - \medskip - -\noindent Anders Morken\index{Morken, Anders} (\mail{amrken@online.no})\\ - Maintains the European mirror of the \FlightGear web pages. - \medskip - -\noindent Alan Murta\index{Murta, Alan} (\mail{amurta@cs.man.ac.uk}) - - \web{http://www.cs.man.ac.uk/aig/staff/alan/software/} - - \noindent - Created the Generic Polygon Clipping library. - \medskip - -\noindent Curt Olson\index{Olson, Curt} (\mail{curt@flightgear.org})\\ - Primary organization of the project. First implementation - and modifications based on \Index{LaRCsim}. Besides putting together all - the pieces provided by others mainly concentrating on the \Index{scenery - engine} as well as the graphics stuff. - \medskip - -\noindent Robin Peel\index{Peel, Robin} (\mail{robinp@mindspring.com})\\ - Maintains worldwide airport and runway database for \FlightGear as we as X-Plane. - \medskip - - -\noindent Friedemann Reinhard\index{Reinhard, Friedemann} -(\mail{mpt218@faupt212.physik.uni-erlangen.de})\\ - Development of textured instrument \Index{panel}. - \medskip - -\noindent Petter Reinholdtsen\index{Reinholdtsen, Petter} (\mail{pere@games.no})\\ - Incorporated the Gnu automake/autoconf system (with libtool). - This should streamline and standardize the build process for all - UNIX-like platforms. It should have little effect on IDE type - environments since they don't use the UNIX make system. - \medskip - -\noindent William Riley\index{Riley, William} (\mail{riley@technologist.com})\\ - Contributed code to add ''brakes''. - \medskip - -\noindent Paul Schlyter\index{Schlyter, Paul} (\mail{pausch@saaf.se})\\ - Provided Durk Talsma with all the information he needed to write the astro code. - \medskip - -\noindent Chris Schoeneman\index{Schoenemann, Chris} (\mail{crs@millpond.engr.sgi.com})\\ - Contributed ideas on audio support. - \medskip - -\noindent Jonathan R Shewchuk\index{Shewchuk, Jonathan} -(\mail{Jonathan\_R\_Shewchuk@ux4.sp.cs.cmu.edu})\\ - Author of the Triangle\index{triangle program} program. Triangle - is used to calculate the Delauney triangulation of our irregular terrain. - \medskip - -\noindent Gordan Sikic\index{Sikic, Gordan} (\mail{gsikic@public.srce.hr})\\ - Contributed a \Index{Cherokee flight model} for \Index{LaRCsim}. Currently is not - working and needs to be debugged. Use configure - \texttt{-$\!$-with-flight-model=cherokee} - to build the cherokee instead of the \Index{Navion}. - \medskip - -\noindent Michael Smith\index{Smith, Michael} (\mail{msmith99@flash.net})\\ - Contributed cockpit graphics, 3d models, logos, and other images. - Project Bonanza - - \web{http://members.xoom.com/ConceptSim/index.html}. - \medskip - -\noindent - \Index{U.\,S. Geological Survey} - -\web{http://edcwww.cr.usgs.gov/doc/edchome/ndcdb/ndcdb.html} - - \noindent - Provided geographic data used by this project. - \medskip - -\noindent Durk Talsma\index{Talsma, Durk} (\mail{pn\_talsma@macmail.psy.uva.nl})\\ - Accurate Sun, Moon, and Planets. Sun changes color based on - position in sky. Moon has correct phase and blends well into the - sky. Planets are correctly positioned and have proper magnitude. help with time - functions, GUI, and other things. - \medskip - -\noindent Gary R. Van Sickle\index{van Sickle, Gary R.} -(\mail{tiberius@braemarinc.com})\\ - Contributed some initial \Index{GameGLUT} support and other fixes. - \medskip - -\noindent Norman Vine\index{Vine, Norman} (\mail{nhv@laserplot.com})\\ - Many performance optimizations throughout the code. Many contributions - and much advice for the scenery generation section. Lots of Windows - related contributions. Improved \Index{HUD}. -\medskip - -\noindent Roland Voegtli\index{Voegtli, Roland} (\mail{webmaster@sanw.unibe.ch})\\ - Contributed great photorealistic textures. -\medskip - - -\noindent Carmelo Volpe\index{Volpe, Carmelo} (\mail{carmelo.volpe@csb.ki.se})\\ - Porting \FlightGear to the \Index{Metro Works} development environment - (PC/Mac). - \medskip - -\noindent Darrell Walisser\index{Walisser, Darrell} (\mail{dwaliss1@purdue.edu})\\ - Contributed a large number of changes to porting \FlightGear to the Metro Works - development environment (PC/Mac). Finally produced the first MacIntosh port. -\medskip - - -\noindent Robert Allan Zeh\index{Zeh, Allan} (\mail{raz@cmg.FCNBD.COM})\\ - Helped tremendously in figuring out the \Index{Cygnus} Win32 compiler and - how to link with .dll's. Without him the first run-able Win32 - version of \FlightGear would have been impossible. - -\section{What remains to be done} -At first: If you read (and, maybe, followed) this guide until this -point you may probably agree that \FlightGear\hspace{-2mm}, even -in its present state, is not at all for the birds. It is already a -flight simulator which has a flight model, a plane, terrain -scenery, texturing and simple controls. - -Despite, \FlightGear needs -- and gets -- further development. Except internal tweakings, -there are several fields where \FlightGear needs basics improvement and development. - -A first direction is adding \Index{airports}, streets, and more things bringing Scenery -to real life. - -Second, the \Index{panel} needs further improvement including more working gauges. - -Besides, there should be support for adding more \Index{planes} and for implementing -corresponding flight models differing from the \Index{Navion}. - -Another task is further implementation of the \Index{menu system}, which should not be -too hard with the basics being working now. - -A main stream of active development concerns weather. At present there is simply none: no -clouds, no rain, no wind. But there sure will be. - -There are already people working in all of these directions. If you're a programmer and -think you can contribute, you are invited to do so. - -\subsection*{Achnowledgements} -Obviously this document could not have been written without all -those contributors mentioned above making \FlightGear a reality. - -Beyond this we would like to say special thanks to Curt -Olson,\index{Olson, Curt} whose numerous scattered Readmes, -Thanks, Webpages, and personal eMails were of special help to us -and were freely exploited in the making of this booklet. - -Next, we gained a lot of help and support from Steve Baker \index{Baker, Steve} and -Norman Vine\index{Vine, Norman}. Moreover, we would like to thank Steve -Baker\index{Baker, Steve} for a careful reading and for numerous hints on the first draft -of this guide. - -Further, we would like to thank Kai Troester\index{Troester, Kai} for donating the -solution of some of his compile problems to Chapter \ref{missed}. - -%% Revision 0.00 1998/09/08 michael -%% Initial revision for version 0.53. -%% Revision 0.01 1998/09/20 michael -%% several extensions and corrections -%% revision 0.10 1998/10/01 michael -%% final proofreading for release -%% revision 0.11 1998/11/01 michael -%% corrections on audio library, getting started -%% revision 0.12 1999/03/07 michael -%% Updated Credits -%% revision 0.20 1999/06/04 michael -%% added O. Delise, Ch. Mayer, R. Peel, R. Voegtli, several updates diff --git a/Docs/InstallGuide/SOURCE/missed.tex b/Docs/InstallGuide/SOURCE/missed.tex deleted file mode 100644 index a2bad3530..000000000 --- a/Docs/InstallGuide/SOURCE/missed.tex +++ /dev/null @@ -1,234 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Chapter file -%% -%% Written by Michael Basler % Bernhard Buckel, starting September 1998. -%% -%% Copyright (C) 1999 Michael Basler (pmb@knUUt.de) -%% & Bernhard Buckel (buckel@wmad95.mathematik.uni-wuerzburg.de) -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Missed approach: If anything refuses to work\label{missed}} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\markboth{\thechapter.\hspace*{1mm} MISSED APPROACH -}{\thesection\hspace*{1mm} ???} - -We tried to sort \Index{problems} according to operating system to a certain extent , but -if you encounter a problem it may be a wise idea to look beyond ''your'' operating system --- just in case. Besides, if anything fails, it is definitely a good idea to check -the FAQ maintained by Oliver Delise (\mail{delise@rp-plus.de}) being distributed -along with the source code. - -\section{General problems} -\begin{itemize} -\item{\FlightGear runs SOOO slow}\\ - If the \Index{HUD} indicates you are getting something like 1\,fps - (frame per second) or below you typically don't have working hardware - \Index{OpenGL} support. There may be several reasons for this. First, - there may be no OpenGL hardware drivers available for older - cards. In this case it is highly recommended to get a new board. - - Second, check if your drivers are properly installed. Several - cards need additional OpenGL support drivers besides the - ''native'' windows ones. For more detail check Chapter - \ref{opengl}. - - Third, check if your hardware driver is called \texttt{opengl32.dll} - or just merely \texttt{opengl.dll}. By the default compilation, binaries are linked against - \texttt{open} \texttt{gl32.dll}. If you require the non-32 version, - consider rebuilding \FlightGear with the libraries \texttt{opengl32.dll}, - \texttt{glut32.dll}, and \texttt{glu32.dll} replaced by their - non-32 counterparts. For more details check Chapter - \ref{building}. - - If you installed the pre-compiled binaries \texttt{runfgfs.bat} invokes - \texttt{fgfs.exe} while \texttt{runfgfs.sgi.bat} invokes - \texttt{fgfs.sgi.exe} with the first ones being linked against the 32-versions. - - Usually, hardware accelerated drivers use the 32-libraries. - - \end{itemize} - -\section{Potential problems under Linux} - -Since we don't have access to all possible flavors of Linux distributions, here are some -thoughts on possible causes of problems. (This Section includes contributions by Kai -Troester \mail{Kai.Troester@rz.tu-ilmenau.de}.) - -\begin{itemize} - - -\item{Wrong library versions}\\ - This is a rather common cause of grief especially when you prefer to - install the libraries needed by \FlightGear by hand. Be sure that - especially the Mesa library contains support for the \Index{3DFX - board} and that \Index{Glide} libraries are installed and can be - found. If a \texttt{ldd `which fgfs`} complains about missing - libraries you are in trouble. - - You should also be sure to keep \em{always} the \em{latest} version - of Steve's plib on your system. Lots of people (including me) have - failed miserably to compile \FlightGear just because of an outdated - plib. - - -\item{Missing \Index{permissions}}\\ - \FlightGear needs to be setuid root in order to be capable of - accessing the accelerator board (or a special kernel module as - described earlier in this document). So you can either issue a - - \texttt{chown root.root /usr/local/bin/fgfs ;}\\ - \texttt{chmod 4755 /usr/local/bin/fgfs} - - to give the \FlightGear binary the proper rights or install the 3DFX module. The latter is the ``clean'' - solution and strongly recommended! - - -\item{Non-default install options}\\ - \FlightGear will display a lot of diagnostics when being started up. - If it complains about bad looking or missing files, check that you - installed them in the way they are supposed to be, i.e. latest - version and proper location. The canonical location \FlightGear - wants its data files under \texttt{/usr/local/lib}. Be sure to - grab the latest versions of everything that might be needed! - -\item{Compile problems}\\ - Check as far as you can, as a last resort (and a great information - source, too) there are mailing lists for which information can be - gotten at - - \web{http://www.flightgear.org/mail.html}. - -This will give you direct contact to the developers. - -\item{Configure could not find Mesa and Glut though they are -installed} - -If the configure script could not find your Mesa and Glut libraries you should add the -Mesa library-path (i.e. \texttt{/usr/local/Mesa}) to the EXTRA\_DIRS variable in the file -configure.in (i.e. \texttt{EXTRA\_DIRS=''/usr/local/usr/} -\texttt{X11R6/usr/local/Mesa''}). After this you have to run autoconf. (Please read -README.autoconf for running autoconf ) - -\item{SuSE Distribution} -\begin{itemize} - \item If you have a SuSE distribution use the egcs compiler instead -of the compiler delivered with SuSE. Grab it at - -\web{http://egcs.cygnus.com} - - \item SuSE 6.0 users should also use the Glide, -Mesa and Glut Libraries delivered with the distribution - \item A known problem of Flight Gear until version Version 0.57 with SuSE concerns - \texttt{acconfig.h}. If 'make' stops and reports an error in relation with acconfig.h -insert the following lines to \texttt{/usr/share/autoconf/} \texttt{acconfig.h}: - - \texttt{/* needed to compile fgfs properly*/}\\ - \texttt{{\#}undef FG\_NDEBUG}\\ - \texttt{{\#}undef PACKAGE}\\ - \texttt{{\#}undef VERSION}\\ - \texttt{{\#}undef WIN32a} - -(a solution for this problem is coming soon ) -\end{itemize} - - %%B.B. 21.2.99 - Additionally there are two versions of the GNU C compiler around: - egcs and gcc (the classic one). gcc seems to have its own notion of - some C++ constructs, so updating to egcs won't hurt and maybe help - to compile the program. - %% - -\end{itemize} - -\section{Potential problems under Windows 98/NT} - -\begin{itemize} -\item{The executable refuses to run.}\\ - You may have tried to start the executable directly either by - double-clicking \texttt{fgfs.exe} in Windows explorer or by invoking it - in a MS-DOS shell. Double-clicking via explorer does never work - (except you set the environment variable \texttt{FG\_ROOT} - in the autoexec.bat or otherwise). Rather double-click \texttt{runfgfs.bat} or - \texttt{runfgfs-sgi.bat} For more detail, check Chapter \ref{takeoff}. - - Another potential problem might be you did not download the - most recent versions of scenery and textures required by \FlightGear, or - you did not load any scenery or texture at all. Have a close look - at this, as the scenery/texture format is still under development and may - change frequently. For more detail, check Chapter \ref{prefligh}. - - A further potential source of trouble are so-called - \Index{mini-OpenGL} drivers provided by some manufacturers. In this case, - {\FlightGear}'s typically hangs while opening the graphics window. - In this case, either replace the \Index{mini-OpenGL} driver by a - full OpenGL driver or or in case such is not available install - software OpenGL support (see Section \ref{softrend}). - -\item{\FlightGear ignores the command line parameters.}\\ - There is a problem with passing command line options containing a - ''='' to windows batch files. Instead, include the options into - \texttt{runfgfs.bat}. - -\item{While compiling with the Cygnus Compiler \texttt{Configure} -complains not to find \texttt{glu32.dll}}. - -Make sure you change to the Main FlightGear directory, e.\,g. with - -\texttt{cd //D/FlightGear-X.XX} - -before running \texttt{Configure} and \texttt{Make}. Do not forget the win32 library -package. - -\item{I am unable to build \FlightGear under \Index{MSVC}/\Index{MS DevStudio}}\\ - By default, \FlightGear is build with GNU C++, i.\,e. the - \Index{Cygnus} compiler for Win32. For hints or Makefiles - required for MSVC for MSC DevStudio have a look into - - \web{http://www.flightgear.org/Downloads/Source}. - -In principle, \FlightGear should be buildable with the project files provided. - -\item{Compilation of \FlightGear dies not finding \texttt{gfc}}. - -The library \texttt{gfc} cannot be build with the Cygnus compiler at present. It us -supposed to be substituted by something else in the future. - -As the simulator is already built at this point, you simply can forget about that problem -as long as you don't intend to build the \Index{scenery creation tools}. Just go on with -\texttt{make install}. - -\end{itemize} - - -%% revision 0.10 1998/10/01 bernhard -%% added win stuff michael -%% final proofreading for release -%% revision 0.11 1998/11/01 michael -%% Remark on mini-OpenGL drivers, new general Section -%% Access violation error under win32 added -%% Command line problem in win32 added -%% revision 0.12 1999/03/07 bernhard -%% Remark on EGCS compiler -%% revision 0.12 1999/03/07 michael -%% Added Contribution by Kai Troester -%% Reworked Win32 Stuff -%% revision 0.20 1999/06/04 michael -%% added hint to FAQ, gfc problem diff --git a/Docs/InstallGuide/SOURCE/navion.eps b/Docs/InstallGuide/SOURCE/navion.eps deleted file mode 100644 index dbdffe3b6..000000000 --- a/Docs/InstallGuide/SOURCE/navion.eps +++ /dev/null @@ -1,924 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: jpeg2ps V1.5 by Thomas Merz -%%Title: navion.jpg -%%CreationDate: Wed Jun 02 03:07:19 1999 -%%BoundingBox: 20 20 470 262 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -%%EndProlog -%%Page: 1 1 -/languagelevel where {pop languagelevel 2 lt}{true} ifelse { - (JPEG file 'navion.jpg' needs PostScript Level 2!\n) dup print flush - /Helvetica findfont 20 scalefont setfont 100 100 moveto show showpage stop -} if -save -/RawData currentfile /ASCIIHexDecode filter def -/Data RawData << >> /DCTDecode filter def -20 20 translate -450.00 242.00 scale -/DeviceRGB setcolorspace -{ << /ImageType 1 - /Width 450 - /Height 242 - /ImageMatrix [ 450 0 0 -242 0 242 ] - /DataSource Data - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - >> image - Data closefile - RawData flushfile - showpage - restore -} exec -FFD8FFE000104A46494600010100000100010000FFDB00430003020203020203 -03030304030304050805050404050A070706080C0A0C0C0B0A0B0B0D0E12100D -0E110E0B0B1016101113141515150C0F171816141812141514FFDB0043010304 -0405040509050509140D0B0D1414141414141414141414141414141414141414 -141414141414141414141414141414141414141414141414141414141414FFC0 -00110800F201C203012200021101031101FFC4001F0000010501010101010100 -000000000000000102030405060708090A0BFFC400B510000201030302040305 -0504040000017D01020300041105122131410613516107227114328191A10823 -42B1C11552D1F02433627282090A161718191A25262728292A3435363738393A -434445464748494A535455565758595A636465666768696A737475767778797A -838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7 -B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1 -F2F3F4F5F6F7F8F9FAFFC4001F01000301010101010101010100000000000001 -02030405060708090A0BFFC400B5110002010204040304070504040001027700 -0102031104052131061241510761711322328108144291A1B1C109233352F015 -6272D10A162434E125F11718191A262728292A35363738393A43444546474849 -4A535455565758595A636465666768696A737475767778797A82838485868788 -898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4 -C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9 -FAFFDA000C03010002110311003F00EA28A29645DA88E0E067E6AFD6CFCE84A2 -91810A31C9EF4F31FCE555B2476340586D15165D7A9CE738F6C538890124E106 -380DC0A0761F45204940C90720E08ED4A6270A189EA7A50160A2906E2320719C -83D7229A1594E19C9CF20E3B50161F45330EDD187E1E9EB461BBB103D46280B0 -FA2A206452771079E08C629F8628181FAD0161D45478918704861C91C520F333 -827AF2280B12D15048F246BD0B37E1D3D69332AA0258E4B606718A02C58A2ABC -6D2BB2904ECFE23C7BD319E6DDB55FF12074F5A2C162DD155774DB47CC4B67E6 -0A0714D124EC061F1C7600FE3D28B058B94567FDA27E99272719C0E29DE6DC11 -C1C9FC281F297A8ACF6B89B93BD860818C0FF0A413CF86CB9183C703D3814EC1 -CACD1A2B37ED33850CCC4023D00C522DD4EFD25CF38FBA28B072B34E8AC93777 -1BBFD61C671C28FF000A0DDDC8CE64C76E83FC29F2872B35A8AC87BDB8E48930 -3FDD1ED4BF6DB80C72E481D7E51FE14AC1CACD6A2B264B9B9DBF2C8437FBA0E3 -F4A6FDB6E48C890E07FB23FC28B072B3628AC417D79BC0DE4839C7CABCF14EFB -45F93F7CAFB6D5CD20E566CD1588D777AA4EE94003FD9152453DF48BF2C8198F -41B46696C1CACD7A2B166BBBD80619F0C064F00D56FED5BAC7139CE7FBABFE15 -495C563A3A2B9DFED2BD2322718FF7568FED6BC080EFCF6FBA3FC29F2B0B1D15 -15CFB6AB741B6F98777A055A6B6A77DBC8127008CFCABFE14B95858E8A8AE6C6 -AD7A4FFADC0F5DABFE1436A77C9C194E48E3E45FF0A7CA163A4A2B99FED8BC24 -012F3DFE51FE14BFDAF7A48025C939E028FF000A395858E968AE63FB5EFB8FDE -F5FF00657FC2946AF7B8CF9DC63FBABFE1472B0B1D3515CD1D52FC283E6F07FD -95FF000A51AA5F3722538CE3945FF0A395858E928AE6BFB5AF49C79DCF4FBABF -E14BFDAB7B80C25CAF4CED53FD28E56163A4A2B9DFED4BCC67CE18FA2FF85745 -49AB0828A28A401565541823257A64E7D79AAD5A96716EB54247041EBF5A893B -2B8D1565B618601B6827A81D6944246373EC6EC0719AD3308914838393C7B535 -A2F31F3807B12474ACBDA176337C8DE31C97C0CB734DFB382B8C9FAB7F3AD130 -062DB97907AF3CD0907CC0B004E3181D2ABDA20B19AB0B023A824678E6811025 -8E1880A7E519AD36B712678E31D3A546B6E154800807AF627FCFAD1ED1058A46 -10C8AE3EF672723A8FA531ADF7B2839C7F21E95A622C0193923A1A12D403BBF9 -738A3DA20B19820DA461430C63078E94E58490414EBD0EDE7F2AD1680B02AD82 -477028DA1E5DA09760304D2F6816330DA82847627F88FD39FE74DF2486CE3037 -1FBBDF9AD4687682C41E99FF003C50600197E5C8761F31A1541F299DE4EE988C -8031EBC0A6BDB80471818EB8EBCD69ADA3610140431E1BB3530AE5B181B73DF9 -A3DA0F94A524048DCA327390775446D097C84F987B66B4FCA6DA76AF1D8D4461 -650067FA1A39C39519F1C011B711BB8039E0D364B5C7396653D148276FE35A45 -40071D70063DE925B7CF0467774C76A7CE3E54508A0D8A5C0CBE7A0350B5B82C -30BF893D3FCE6B51E338F949C03914D7B5CA7395F53F8D1CE1633D6D8AB0000E -BCB62944040D84004F439AD2F27919230C307DA91EDF6005B3CF4E2973858CB6 -88FDD25B6E318C506DF6B8C9DDCF076E6B4CC4082A54E3A67F9D47E57CE00181 -9C2FA1FA50A616331E1704011F07BF5A8C5BE14E4103D4D6B9876ED0CB9E3381 -4C3161461385F55E9FAD1CE163285BEC5C952DBBA76C534DA3AAFCAA7713C81D -AB55E0F3B6B0E0739047E14050AC54824938C8E94FDA31D8CD16870015F98819 -C8EA29A2D8EF50570A39CE31C56A4B6CCCA1828E38C13DA98D6A0E320E08E003 -4732158CC680066CAE40C8C76EB44681A4476C375F949E3EB5A09160B0C63E5F -C734AB17967EEAAE472071439E8348A2ECC58E506573B481D3F1A9E08E220872 -37F5073803E829E6D1E4940023C31C64F27F956BC3E11568E37371112C79DAC7 -22B96AD58535AC8DA10949E8848F41D3FC8691A41C71B40186F7A23D1AC2E202 -207456C81C801B938A98E93024BB26B90A41C654E41A9A6D32CA1877C571BE42 -3A28CE4F4E7FC9AF2675EDB4DDCEE8D3EE8C29FC2B711A962A08C673B87F5ACD -5B05573BB907BE6BA992DD25B71B2E9BCCCF240E3A74AC5BAB2685B965231D89 -EB5DF87AF29AF799CD569A8BD119EDA6C3B49DDC0F9983739A865B548DC2AF2B -CE369AB6B1ABEF2412C0E39E8293CADDB4ED1D0E31D47D6BBA32F339DAF233DE -CC123CB5618E09148F6E17232588EA7F9568889A38F0D8E4F5271485042580C7 -DE038E7DEAA3395C4D23305A976215431C9EA09AB83C3376F18CC691823392C3 -8FF0A9819227CFCA41EA718C1F5A26B99994EE6E070D8EF44A551BF74128DB53 -3A6D3DEDE42A577107AA9CE2A1684E59C8E0F4F635A8606DA0F5461CF3D07BD3 -24880439521735A466DEE4B5D8CC1164E0AE73D79A9122F9D80518C800919156 -FC85691005E4F6A9563D87681B73C127915A29136339EDB6EDC64803807914B1 -42AD1E4BEE19FBA38ABE837A766EC3071914C110039C739EDCD5A7726C51F231 -B8152791C9EA38A5F2CB0DA5B20739FEB57FECF907F8415C8CF5A8A3844AFBC4 -A32BC08C0E838E73EE73C7A5272498EC462CE6530968F7895378C8E7A91FD2BA -0AAF790955B377C82223CA9C9FBEFC558ACD4B995C99AB30A28A299015D06970 -EED3E3E012C18E0FB135CFD75DA1444E930B63AE4F03AFCC6B97112E58A6694D -5D91889B6104283FDDCD2BDB26FC7CD8C7F1568F9472481F538A468C951D413C -74AE0F686FCA508E00E0EE0460609028FB29CB38031D8AF7ABA909F2F18C641E -697C8C9C105BDCD1ED0394A5F65E0216E7AED03FAD27D97CB40B923820127B56 -9A44A060E42E06588E69C2D9036EDE00CFF10A87547CA630B7183B986338F7A7 -0B6DAEA547C99258E79AD45B53E670876F6207F3A749004E06481C1C0C1A6EB0 -B94CC16E5870381D7914A6D377CA321BA820723EB5A18DB80403ED8C67F1A604 -F98F1CE39A7ED18EC8A50DBA81BF1B881F2E3A73F5A6FD9DC10C4633C63F9568 -C711908C8F97D693C8DA0A9F9C3720F719E723F3A5ED42C654B6EC54952006C6 -E3FD29EF17032303B115A42D8EE010061D723FCFAD35AD406E54600E9DAA9554 -2E53305A98BE65DC3BE3D699B1C6485C3120107040E3B56A6D554C6D18FEE814 -F4B5DA9C039FF7707F4A3DB0729930C1B187C8002793F8523DB299D411943C64 -F3CD6A2DBF9CB820C83D0F7FC29B25B79CBB48E31C155008A7ED6CC394CD16CD -221270011D0738A6FD9F24AA9DC47F0918CFA9AD7F23F7380B81DDB3C9E6A392 -0C6005C05FE1E306A7DB0F90CD7B6CA670476DA0FF00F5A9C2201B2719E46307 -19AD0FB29C6E524027919EB4CFB3EE43C90ADEBCD3F6B70E5466181D1940F419 -C521B70181539624641AD378C48C73C01C803D2945A28627D7183E9F9D4AAAC7 -6465B5A316246003C8DA320D31601BD400ACCCD9391CF4FF00EB56BB400ED523 -27A96A4112A92428299EADC53F6AC2C632DB3976DC0A838C9C74A3C82FF331E3 -A9E9E86B45EDC821957712C4E723F03482D589DA773609F99BE9FE453F69E616 -325E0CB8246D380000727F4A431805982AAE383F4AD79AC90824288C9E576E3D -AA29212A1F203E01624F5CF5E29AA9E616335E32CAC769C75056A35832091823 -AE76E735AA6D9FCBD8C7818CFB7351B42CC490BBB07A77269F3DFA8198D0E082 -14670452C82473B01603B007FA5681B6E0385651FDDC72476A8D97F76A0024E7 -241041EFEB43927B94AEB629A46CD203C961C0ED5ABA5F87E4BEC8699608C105 -9C827BD43E4CC5848B1336F3B41ED9F5A9ECAEEE2D246063CB0278663F9579D8 -9AF51271A5B9DB46941EB5362E7FC21BE5B663B88DCAE083B4FF0080AA975E16 -6B7505274959F808A39FD7EBDAB5CEA770BB4AE0E7AF5040C551D4CF9CC8DF6A -11903A8E33EDDBA57934F138B53FDE4AC7A12A14397DD5718DE0A50A0A5DABC8 -C394DA46D38F5AA63C28500F3240B83C11C8E86B42D3578ECA25427CE18C64BF -23DF1EF5613C551468AA628F713C64824FB566F1F8A83693BFC8AFAA5192BEC7 -36744916429B894EA4A8FD47155FFB2447FBDE5803D4746FAD7656FE21864676 -16EA093C900367F4AD1B6D51A68BE55548DB19CE003FA54BCEEBC3474F51FF00 -66D396D33CE6DB44B9BB942C703CBBF8555191F85413E99241215954A38ED9E9 -5EA29AC243958AE14630088C8C8CD51D46DADB5A285FE6908C0652371FEB5D94 -73AAB29AE7A765DCC2A65D18C5F2CAE79AC96E70C1885078523BF1CD385AB175 -C3363AF2A7FC2BA94D3D2D2F1E336ACD183B77B0247F2F7AB1716507D8F70888 -0BF2E53A939AF63FB420AD6EA79FF569BB9C5F932229C904F6E29C6D4C809C1F -941EDD6BD0F4AF0F5ACB11597C9959C70760C8E7FCFEB4D93C29243E66C314A8 -8C3647B707B9E2B059CD1E670D99A3C0544B9BA1C17F67CCA9B8C6C80F1D3FCF -7A68B73BD801B8E76903B715DB595BC3E5949AD4B36385E847B7D2AB3E8E46E9 -3C811AF1C4684FF2AE88E651FB464F092E87282C1C0CECE9EA3A9A618632E63D -80CA146588E075231F9FEB5D80B37B2DA0C12391F75C8F4F6ACF8EFEDF50F10C -FA7CF6F2412430248647C6D6FBDF2F38EC47D323D69BCC55EF612C33D9B31A30 -F744038C44762E074EFF00CC9A4AE9ADACACA79AEE3597698A41182C07CC0229 -CFF3FCAB99AEFC2621578B695AC71E229FB36936145145779CA15DE785EDC49A -25B72324B609EDF31AE0EBD33C1F086F0E59B77F9CF233FC6D5E6E3E5CB493F3 -FF00337A2AF21E9605D8AC60151C8527DC77A47B470C01219179C0EB5AA60F35 -98FCA4AE3D7F5A96483E7072194F523FCFD2BC1F6A767298BF64DC3191F2FDEF -A52A5AFEF1F9CAF4008C62B51A01B5972547B7A7BD312D9FCD2C47C9C0C679A7 -ED03951416D543918CF4E4F4EF4FF21109CA7A63238EBCE38AD38AC9514BA866 -1EFCE2836BBCF25897E073FE7150EAA6351B1951DA973BB615C75DC7041F4A43 -65B9CED2A4F7CB56BC768136AE7E553B4331E09A6B59C857322854EEB814BDAE -B6B8F94C836B920E02E3AE4E7205322B13E60E9CAF248E9FAD6C0B51B428CB1E -D8F5A05B157DC0F1D3E957ED7CC9E546479040704E173C8F5E948F6B82BC6064 -E719FCAB5E4B565657032067191D7B5312D99B2A5B1F53EBD29FB41D8CC58002 -594052A785CF6A592DE4DC32A08EA768AD2166CE0E01F97A963CE29F25A6F04A -03950724F2307B9A5ED3CC76317EC60FCC832339639E69CD6DCEF24AC67A62B5 -A3B40B1AABB31C67EEF048CD2A5B80BB554093AB51ED42C8C586D5A23B9B0483 -C9538C52988275187E47E15AE2DF76492413F2800D21B20CCC4E3382A30DD4D2 -755751A8998601E50253009EC73CD432C202B1032D9E09AD892D360C9565071D -0F7FC29D1DB0036F2B8ED9EBE8297B645723325AD1DC065200033D3AE2986D84 -4016538E80639F5AD76B360320372D92076A78B6255786663C924E454FB71721 -8CB641796550C783B0E7FCF5A63599DCFC1CE3807B56D4B0052DB8E38C531EDB -7AEDDADB0F424F5F5A1571FB33256D0BC00AA0084FF11C13518B525586DC60E3 -0067B75E7EB5B8D016DBD49EC6A210B12083DFA1A9F6EC1D3313EC6DBC03823F -2A4FB383D9581E32A738F7AD7960F97E61D09C3120D31ACFCEC6D0DBB3D15801 -5A7B7D352790C86B125B047D09A3EC6B1B924A9DFD71DF1DAB5A4B4692464914 -8C81819F7E94E92110100A05F9790718A5F584F663F66D743125B4DB9CED27B8 -1D6A216EA640DBB3D42B8E807D3BFF00F5EB5268BCC4C2A051904B1EA3B7F5A4 -16C30C0FA60FAE726AD57D2F717B3D4C736CC6556DE3009A47B50C72DF3B1C67 -19E78F5AD77842FF000F99EB8382077FC7AD3A3811E4DE0EE8FA12C01391FF00 -EAA4F1565765469393D0C4F21860295F2F192093F9D433DBC80348396539DC32 -7F4EF5B8D625508116100195041EF518104320DE8C8ADFF3D1872D9E9C5613C6 -525AC8EA861EABD8CC866956024FEF58F5ED9151BD82C8E64752727A2926BA58 -2CAD25C91200C0608FBD9A51A4C0C486971CF5E7A7AF4AE15986153BA3A9E171 -2D58E48D881230319C0F7A7FF6582A0ED039EA5F822BA16D31229591A40632D8 -52A3AFBD3C6990820237CC47DE23EF0AEAFAFE1A5B3460F0D884614365F673BD -46D19C1C8ED52CA66704B14DA17017D463B715AC6C02A1C39F42181C5559ED8A -36DF970481D7B5542AD2AAEE853855A6B52A43612346D711346AA31C13C90699 -0DCCD6F751C892F3FEEF03AFF8D4C6D2552CF180580C124F6A70B26C9241C633 -9EF5B68F732E66B62A4B753976FDE6E0ED9E4631CFB54900695416F93070D8E6 -AD3C20EDC30E3DB9A6C9017846DCA1DDDBA74F5ACE74A13566542BCA2C6C777F -62B95521C2B77DBC1A926D66775D88C4A8CE39000FEB51B42D2E412DC007AE45 -1F65562D91CB1C0E7D6A2386A49A6D6A54B1336AC98905F5CC7333BED2071F74 -1C9FCEAFAEBA4E4347B08F5DBFE154CC4C931248C638200E7934F4B625431040 -CF3B4F07F1EBDAB6786A5377946E62B13522AC9FE04C3C4122FCE918DCA39240 -C138AE5ACEEA6BCF19DFDF9566F3A18D01C27979C609001CE7E507FC9AE8D88E -1828DDD4EEEF5C928B7975AF3BF764EF450CB9CF2644C74E7F87F2143A54A9D9 -A875EE5C6ACEA5EEFA16B4A81A2D42E558B933B7980BB7031D7183EE2B2EB534 -2B18A2BC45568F76E3192AAD96FDD86E491EA2B2EBE8F05CAA2D47FADCF2B12D -B96A1451457A472057AEF8163127852C030CF1273FF6D1ABC8ABDAFE1D448FE0 -DD3C95049F33FF0046357859C4B96845F9FE8CECC22BCDFA1A420561C220CF4C -8A568159C16500F7C8AD26855F92B919C9A71507AF7EB5F21ED4F5794C896C7C -D4180147B2F5A68B558D597073C6430CE3FCE6B5BC950005E051E4A93C8C8F7A -7ED5DAC2E55B99896A8BF388D57B0181FE7FFD75235B06C6501E3008AD14880C -018FE54AD0853CAE2A7DAEA5729982D82A828AB9071C01D2905AB1C312DB8719 -AD211E334189490714BDAA4F529536F548CC164BE617D99E771C8A55872EB8F9 -643F789EF5A2D0A92381EBD697CA5F4E7D68F6CBB8FD94BB1910D918D0336E04 -64649E6964B6120DA06598004B0CD6A9881209E714A23033C0C9EF47B75DC3D9 -4BB19417CC895193764743DEA29A0067400153E98FF3FA56C1B7046071C63818 -C51F67518C76E84F26855907B36B731DED8162CAAC841008F4E7AF4A516C007C -6186EE1B6F18F7F7AD56B60EA430CF39EB49E418E3C2E303B51ED9771FB29763 -1FEC009C63248DDC2F6A3C854201E73800569B2F041EF81C1ED4DD8A318046DC -E39A5EDEE3F64CCEFB2100B2E42F51C7029E96AD1AB8505B9E98E9F85681450A -5402547DDCD009073DEA7DBDC7EC9994D678638720F7E2836C048BB7EE77535A -65573C819F7A605507A0C74FAD275D0FD93335EDC13C776EC3A52342AAC4019F -AD697920F718273C0A4F21771ED8FD6A5D64D0D5395CCB11039007E0293CA030 -00C0073EB5A2D6EAA870DB475A8992355DE59768E3239ACFDBC7B97ECA5D8CF3 -6B19C9603B9248AAFE5297CAAA8F755E9576E2EEDE075CC831FC583D2A17D56D -1118EC7183D4900543C4C36E62E387A8F5B10EC667C904B7439CD31E15DC7728 -3C63914E975AB62DF212B918F53555F5D8D8ED2A5D73C638AC9E2E9C7A9AAC2D -4913496F85DAA8A768E171D29B2223A0DD1AC448F4E959B75AAC8EC7626C031C -16AA9F6D9D98191F763A0DD9E2878B4ACD16B0B75691ADE42E09568CB804EEC6 -707FC33552E62B90CCCB30D9D400BD2AAFF6A0424799C1EA157B7A66AB4FAB4B -0CA5234F3091D3AE3F2AA862D4DEB135FAB4A0B463D6DAECB126ED910F3B9BAF -FF005A91ED176235C4924C064AF39AA4FAC4EF1E1A3079EB8A06A3FBAE54F99E -9DAA67524DDE113551B6EC788A51810C53C5907FBDC568E9FA7CFF002BB4CE5B -07E5DDE958ABAADCBB6E0CCC01CE32055CB5BDBD571BDD187F74119FCEB9EAD6 -8F489AC60FB9AB35886072CCA7192DD7F3A9E0B65D8AACC5DF39DCDC9AA914F3 -29CB2819EB8C1CD4F09910E160DEDDBB1AC6389B68A286E92BDDB2CF92449876 -240E7D69A2DD64918B27CA0AE06DEB52456B73C96099F5DDD47E02ACC16C507C -F8271D413C57A34715187D9382B527513F78CF4B36C9C467DD8F04FD7D69D1DA -85FBCBB01E0E17DB26AF85915BE6C11EA29E31B4E403F5FA1AF46388BEA7993A -2E3A5CA11C2307E5C6792D9EFDF34C3691C847CA0F19C63040CF635A69182ADC -00BFC5EF436C257E4C60F383D6B55885D4C9D27D0CD1080E0F9587E71C6285B6 -0AAC9B461860ED1CF4AD48E332C8081C0EBCD27D98E588C8CE4E48E87A56AAB4 -5F521D36662400B215006D27393D79AF0CF8A1FB49C5F0FBC5D2E8716991DFAC -11234938B82BB2420FC9B00C1C7CBDF3CFB57D09F66755508CA0746DDD4D7C05 -F19FC3F6707C53F12AA89886BC773BE766E5BE6383E9F363F0ACB138A95382E5 -674E16846727CE8EEF51FDAFAF9C23586916D1B3125DA60C413D88E71EB5C8CB -FB5378A1AE258D2CB4C8E3F2C282B0BF3839FEFF00A935E6575A459431CB2B44 -CDB14B11E63738FC7DAB1DE7B154F3174F6643D0990FF8D707D6AAC959499EA4 -70F4A2F48A3D5A2FDA83C7175712B9BEB7810BEE0AB0AF1F9D7D435F065B4B6D -E7C49F60450C40C0624F2715F79D7D5E45394FDA7336F6FD4F0B358463C9CAAD -BFE81451457D59E0857BB7C34902F8274D1CFF00CB4FFD1AF5E135EE1F0DE353 -E0BD3891CFEF3FF46357CAF11CF930916FF997E4CF5B2C873D66BCBF547585D1 -88C8FCE808858F43ED8AAC62014E324FD69E8850FDE26BF3C58848FA37876C94 -47193D3269FB14127039EB50E68DDEF47D65770FAB327C81C7148CCA7838350E -EF7A072703926A3EB112BEAEFB92065518518A6AA46739148AA5891D08EB9E31 -4DC8A9FAD2E9F997F577DC7B2C63385C9FAD4476EEC77A76451B85278A1AC3F9 -8985F6FCE9768349BA90CAA3BD4AC5A2BEAEFA31DB40047AD34A818E09FA501F -A71807A529619C77AAFAD760FABDB71B941D491EC6860ABEA4FB520931819FCE -9A642E464E07D2A7EB8CAFAB798C95830E1738E99A8E4F9178407DEA61721980 -0C84D327BD82DA37799D522452CCE4E1540EA4F60060E4D258A6D87B0B15E4DD -1ED071B7B0A7C6819725707D8D7203E36781E7D5134DB6F13E97777AEFE5AC10 -5C23B16C670319C9AC2D77F693F86BE1DBE305D78B6C0B80430B326E1073FDE8 -C30EDFCAB39629C745177368615CF56D1E94F1FEF146383511248C0048CE702B -CEB43FDA33E1A6BB71B62F19D8A7CD8CDDAB43C7D5C01DBFCE6BBFF0FF00893C -35E2CB811E8BE2BD1B57B8C1222B3BB8E5931FEEAB67BD73BCC147E38346DF51 -97D96993B905418F2CA0F5F7A80C87E60C7662BA17D0E429F3303EE17047E66B -3AEB49BA855B36E70BD5C2F27F1A16614A6959932C1558BD5194D6D12AEE00FB -66AA5C461000A09CE739C60D68BC055D8329461D41E31ED4CC2B67047070715A -2AF1BDD18FB392DCC7FB22AAF11A0CE48C8E334C96D56E2209731ABAE7380091 -5B413079A3CB55F402B4FAC5B627D99C8FF62DA246DFBA42FB801D463F3A89EC -D6156D90286EDCF06BB2FB3A0278C76AAD36950CC7E65C8FAD4BAAA7BB355789 -C4CDA6B4B1AE0C39539C963C565DC5CDD4320CC431EABCE6BD066D22DE119C80 -BFDDF5A8FC31A6E99A9F89ED6D9A00CA4B078F670C0293CFE559CF12A307A6C6 -D4E9F3C92B9C00D410FCB2A37AE0F18A79B9B768B3B5000701829C9E2BD07C7F -E10D3F43D97769B155DCA9B700109C0C639ED9AE3230CAC02429C74200FA7A54 -D2C429C79E26F3A4E0F96463C3009E50AD1C8BB8F451C62AE1D276C8D857C2F4 -0D9AE8A133318F65B05E7E52481FD2B46DE79D64D8FE5804A82CF8F96A5E25AD -913ECCE621D144A14184E587F0AFFF005AB521F0FC9190CB6EAAC40F97005756 -92C06300C96FDC90AE298752B14E3ED317A70E0D5C6AAB184B99BD11956FA4CE -ABF32A27B0ABE903E36E00FA2E053BFB5EC727FD214E3D29BFDB360491F69008 -EF83FE15AAA8D74326A72D09AD412D1EE5519CF3D0E31FAD2CB661276646C679 -208FE5FE45675CEBC88DB506D3DB71A48B5C32B3642638FE239FE55D1F599463 -BD8C1E1F99EC69C368429C6007C86E3A0FCFF9545059995DC3614A01C6323F9D -469768CA36101CF70793549AFE7008C2F5E70739FD6B65899357447D5D75342E -61915CC60FC83A6005151411E58B67628FBCD8CE2AB45773C818C8A9E5E78F9B -007E18A6ADE066552A17D4934D5793DD89E1D25B16E573B86C7CE3D0714A92ED -0370249EA6AB5D5C18AD99A3914007273F43FF00D7AF306F889FD81AADDCBAB4 -9E445E53BDA279B959B030540C704610E3E6386F638D7EB72891F554D5CF59F3 -46460153FDE3CD7C09F196F60BEF89BE219EDD8B29B92096040DC300E2BACBBF -DAF759B3F185F4B1D832D88DF8B19AEB7AC608503070391B73D07DE35E2116A9 -25F4ACF73334D72FF33C8EFB99CF739FAE6B5739D55AA2A1455363EF5C359DCE -4E488D8F1DB8358D6DF623E12D4FCE937DF2CB00813318C8F9836727767E9DB9 -3EB5B13BEE523EF03C11C1C8AA7F65B4DA3FD1E2CFAEC1FE15515646F636344B -BD11FE1F5E44F248DAC1BD8DA10248F6940D17F0FDECF2DCE6BEC8AF88249EDE -D0E0F968D8FBA1466BEDFAFB2E1FFF0097AFFC3FA9F399BAB727CFF40A28A2BE -BCF9E0AF6BF8797091F8334E04F399011E9FBC6AF14AE7B51FDAA1BE1ADCDFF8 -7E6D1D6F5ACD905B48B26CCABA0918B7AFCCF80076AF8AE2C8CE5828282BBE75 -F948FA0C9397EB12E67F65FE68FA4FC53E3FD1BC1F6D2CDA95CF90A919930719 -61900639E4E4FF00FAEAF697E29D3F59B46B9B2B98EE21590C4CE8E0A8707057 -EB923F3AFCDDF8A1F160FC51D5BFB56EECACECEFCEC0E6D0B8F31426D1B83139 -231C1E98FC2B0F46F8837FA4E8B71A5457321B59675BA548FE5C4ABB7072067A -01F903D6BF31584C472F32D1F63EC94E937668FD4D7BB08D874656EE29FE6831 -960410064E2BE5AF84FF00B5BE95A95925878A563D32E61F2A286E215778E652 -31B9CF383C0E49C726BD521F8F5E04BAB5B5B95F1159243720B46ACECB200339 -DCA4657953D40FCC8AE16EAC1FBF16747B384BE191E926F72385C50B7CCA73B7 -F5AE6B4CF1669BAE3C91D86A16B76F1852C2190363232BD3D455B79977904E3F -5AE775A46CB0E6B1BD9013F38407F2A8D6FDDCF127E95C878BFC6FA478134C8E -FF005CBCFB15ACB208919919B7BE09DA0283CE01FCAB92D13F688F017882FA0B -2B4D742DD4CDB1639ADA54CB75FBC571DBD7145EA35CCAF62953A77E5BEA7AE7 -F68B038F33F4A61BE120C3B6E1E86B37CE4651C8C63A8EF503EA102C72482556 -5405890C318A9F6922BD8C0DAFED150DC64ED1D334C7BE04E77103B8CF4AF3FD -2FE2CF83B5A9D2DECBC416334CCEC8104983B81C11CE3BE3F3ADFD335FB1D581 -5B3B986E7CA3C98DC1C73DF1EE31F8512A93EA35461D0E80EA3B402CCDF41CD3 -4EA6CD83BB03BF43543CB6DDB829556F5352436B21C6230EA4D2E797461ECA0B -72DAEA2C0649FC73C534EA4E0B05E5BB0269469933B0022CE4F7238AB4BE1791 -DB3FBCE3AA8007E79A8755AFB45FB18BE851371BE32500DDDBD2B85F1B7884DE -A49A6D938B895D1D658600CE58E3007CBC80738F7AF5687C2D94C14ED8209069 -EBE0E48F7346A10B7DE11A85FCF15A4318E9EB1D5A23EAB193B49591F9B1F64B -4F873AACBA1C124D63E3095CC77F7D0BF990C10C8B916D0F51BD94A169060AE3 -682413BABCBF0CB40B8B72DE57CDB5898D2497728009CE071DBFC7BD7E9847E0 -D8F76F2650FCFF00CB4F7CF4AA5AE7C23F0E7896030EA9A5DBDE0910C65A58C6 -F20F3C300187E06BAD66AD34DAF531965F7BF2CBD0F827F674FD912DFE31E937 -7AA6A5AFDE69B14322B4705AC699789F7E0EF63C74F435EDBE23FD89345F03F8 -6F55D7BC2FAFEB9FDB9A65ABDDDAE6E1097641B8AB05404E4023EF771D4707E8 -4F877F07348F8632DC9D0DEEE1B596311A594D3078A3505880B950DC6E3D4B1E -9E95CC7C65F8BB71F0B7C3F797DA87872696C997ECE1BCC51BDD87CA46D04633 -D7241E3A1AE59E331188AB6527CADEDFA1D71A14E953BDB54B73E7DFDA53E22F -8A3C4BF0B7C11E3AD1358BCD36DA6DF617F05BCAD095B9FBC1B0B8C8215867B6 -38EB5E31E09FDA47E276837F0BDBF88EF6F2389D6496DEE7132C880F2ADB813B -48E0F4EF5EC36FE2D5F893FB257C48892C9A1B8B3BDB7B84843972177DB6F6C9 -007DD53D31D4FD6BE48B6D5E27FB8C44910E64191C8EF8C7B57B997D384E8CA9 -4E0B9933CDC5CA51A8A70968F63ED8F1A7ED43E23F0EF892D752BAD0E1D57C2B -AAD8C577656EA4453C3F2ED98348B9E56549320E40C8E474AED7C33F18F4BF1E -69D73A868177731476EE124B2D41516E6307F88282C1939C6ECF507818E7E668 -FC4ADAA7ECA7A0DECB12C9A8E87E219B4D8DC16DAD14C8F396207BA8E3B5796F -80BC51ACE99AFDA3DBE612932C914D1862C0F4CA8CF7048391CD674B0F4F91BD -138B69EA67567539B5574CFBFD7C733A91BA5DD83CE5073F95491F8DE79D7253 -2A08E02E0FE79AE1B5FF0010691E12F0B68BACF88EEE4D35F51B732F97240E0B -488AA64555C762EB8E7A115C7693F1E3C05AA5F5ADBC5A9DD79B72088A216CC5 -C3E4055380465B3C63F1C54274E517257B2DCAE492925A6A7BE45E2E964883BC -6029381B7DAAE5BF8A2DE52AAE9221CFA039F6AF1ED37E30F8175FBB305AF885 -55618F205C44F0E5464E72CA01EB9EB93EF8AE37E227ED1DE1FF000B5B598D03 -5183579E473E6810B954518CF1F29C9EDF4359AA6A5EEC6E54B4D647D36DAA59 -4E060B3F3D49E95B9E0CB68A6D6D67870DE4A31DDDF2463F91AF927C05FB5278 -5AE346B293C4BAA4361AACC24332DB59CCD1438930832031C95C9EF8DA6BEABF -817E24D1BC61E1DBED6743BD1A85A9B936C2E044D18250027018027EFF005E95 -C78AA73A4ACEFA9D386E59CB434BC71671DC5CDBA48BB8B96FC7A5732FA3418F -DDA0500E4AE78A9BE3178E34AF09EA9A25AEA57C9652DFF9CB034A0ED665084F -38C0C03DF1D6B80BAF8CFE17B3D5AE348B8F11D95B6A51005E3964DA17E50792 -4019E7D6B9B0F19B82E5D4DF11CAA7AF91DB2E8714602AC87681DBFF00AF50CF -A1EE0DB266008E41EF5C7CDF1BBC1161629732F8B2C2485E4F2D5E29378DF8DD -B7099EC0D644FF00B4DFC3BB598472789E121C120AC3330C74C642753E95D3CB -55BF859CFEE773D0A2D0E54721A6241FC71FA53A4D160524B293923906BCAFC4 -3FB577C3ED034FFB5C5AE1D4723F776F670C8CED93D79518FC4FB75AC4BBFDB3 -7C0074BB89EDDB5269902EC84DA1DD264F2579C71EE47515B429D76EEA2CCE6E -9EDCC7AECF656B1895BCC6550864E5C01C103BFD457845FF00ED6FE02B093C98 -2D35CB878E40ACC90C40631C904C9DB815E13F1B7F685D5BC77ACDCC1A6EA32C -5E1FB8836AD83129B3728C86C6373065E09C81D3D6BC5238E6794BBB0DADFA9F -A57B987C1B6AF559C33ABAFBA7E83FC33F8EFE1CF89BAB4D61670DFDADE450BC -E5AE953CB28A547DE563C9DC38C56C6A5F16FC27A7EA22C8EB903CCDB4288FE6 -07774E4715F9FDA25FD9E9D67A9C73CF750EA0F6E12DDA1601589619DE7AE319 -C63D6ABCBAABA4641930D2005B031D0F1926B4583F79D9E847B56D799FA53A5F -89F4FD52731596B56B74E1777911BAB301EBF419E7D2AD6A1ACC3A3D85C5DDD5 -D0FB3C392645427819CF4CF3C0E3DEBF3A7C13E3CD43C16D7B71A75EFD9AEE68 -0DA872A4B221209C7B90B8CFB93D79AC9D4FC69AA6B9788F7DA85D5DB06248B9 -90BF5FA9E99ED52B0936FE2D06EA2B6C7DD337ED2DE11B4FECF12B5FA8BDDDB4 -F971811856C12DF3F1D7B66BB4D0BE21699AFE956FA969C6496D6704C6EC9827 -048E87DC57E764FE299AF92C61B864912CD0AC4A53A65F7373DC96C9AF4AD0FF -006A1D63C23A659E9B67A3E9B3DB408CA259C4864662492480CAA393D31D2AE7 -8769592B99C5EBA9F5E78B7C477979A25C41A5C456F651B51DC8014E7393C118 -C67B7A0AF92BE30788F58F0E4B69673DCDD19416759253E684620072A59475C9 -E0E791D6BB0D07F6BEB5D424587C47A4BC43CC03ED1A7A95083B82AC58B73EFD -0D71DF19FC6FE19F8890DBC9A36AB2C7751C0E8C9770150C472393FC5807F31D -EA211926A3281524B7E63C46693E57903E431FE2E73FCEB5EC432431B6F3BF6B -0186E3A57313AA25CBAA4BE6460F1201C1ADCD3A6C69CA3AFBE3EB5EB190935F -38B553F6B984A57A103693F5AB29697735BC328B975046483FFEAAC1763B339E -9C559D39B6B121BAE38A00D358E081B7A82D20FE2724FF005AFBDABF3F2E270E -02E719391C7515FA075F5D907FCBDF97EA7CE671FF002EFE7FA0514515F5A7CE -857C8DF1DDE53F15F5C8E37DC0883E53D17F711D7D735E35F11346D0EEFC5979 -25F59C524EFB3748F26C27F76A077F4C57C7714E2D60B050A8E2DDE4969E92FF -0023E9320C3BC4E2A504D2F75BD7D51F3A5941332EC91563039CE0124D4EF68D -BD7323EE1D33923F035EB975A0F8626C09A042318012E5803F5DADD69F67E1ED -06C9E396DAC9E37EA1965623A707AD7E5DFDB949ABFB395FFAF33EEFFB2EAA7F -1C6DEBFF0000F25920BA91142207E9CE70473DFD6886DEFA7B99736F728C4704 -A363207B57B0CA9A7C8FB58177E461A46C8FCAAACBA7E992BF97F64B81D0E4CA -E47E5935CFFDB9DE99BACA25FF003F11E4BA6EBBE20F0EDEA5C5B5DDF69D740E -E46595E139E9D723D4D77763F18BE24C92A5C1F14DEEF898B6C9F50F958139C1 -0C70C38E86B4F5AF09681A9824D95C45295DAB2C6D20DBEF83907F106B8BBCF8 -73AAC0EC34DBB335BF2424D03838F4CED20F7F4AEBA39861312BF791B3F4392B -60B1141FBAEE8D5F17F8D3E2078F6649F52BBBDD4E2F302A5AC171E7468D8C61 -634380707AE33CF5E6B97B6BED47C373A4F3DA5D595D44E7CB926428CACA7B67 -91D6BA1B6F86DE2ED27469B57BB8ADEC2082EA3B6CBCBB65769236752A147236 -AB1CF1C63D78B8BE24D4342D39F75FCB3411B8630B0CA39C8EA0E72381D7D2BD -25530CD7242CEFD8F35C6B45DDAD495BF690F1DEBE61B35D7AE613E62ED6B76D -923306CAE4A8C9C927BE38E7AD769E09F879F103C58B7576926BBA8A5EC656E0 -DAC92246FE80B670C0301C7B015E149E289EC75E5D5238EDA29924F31152DE3D -80E73F736ED3F88C57D5DF0A3F6ECD5346D363B4D66DA3BD8D14802DEDA28F9D -D9CFCB8F7ED5862A3F574A54E95CDE9275DDA53B1C6DEF80E5F855AC09F52D13 -65C242B73289E049D62477DAA4472361D890FF002856C005BD0D7AC8FDADBC29 -E0DF0ED959687E0EB692F5A20B74F6CB1D924B2003E62A88C79249C1C63B579E -7C5CF8E363F17B5682EE491EC6D9AD96DE7DD1C61A30A58ABAE383CBB0C1EC47 -3C570BA07C0EF1378AEEE0BAD2F53D265B27C3A3DD48F1B48016E368563FC3FC -3D322BC07258AAB7AEF94F5E349E1E9FEE9731E89E25FDB2FC57AB064D2F4DB0 -D214B6E1B63F35C01EEDF8F38AE22E7F68EF1F5F10C7C4BA8C59258793318FBF -418EDCF4AF48D07F617F17EA724535DEB3A1C56921242DB4D336013C0198BFAD -7D37F0CBF663F077C3DB349E4D26D750D61650E2F6E0349B7EE81B431C0C609C -E07DEA8AD3C2D2568FBCCAA6AB49DDAB23C8FE145EFC4DF19F85BC217B136B8D -35BEB0A6F24BA95E34B8B3930DB99DBEF2AF3C0CF5E9D2BEC5B2B6686DA2494E -F90280C7D4E292DE14B74544C0550000071533498200AF2F4BB676CA4DA5142E -D45CF03E94A36918FD2A22D8A10D2BEB622C076AB118A4122961C66984FEF0F3 -48839CD4736A55B41ECE370FE554B5AD16C3C4561258EA7656BA959C98DF6F77 -0ACB1B11D32ADC1E6AC9397C7BD4B8DC791823B8A6A4FA09A4F4678E7843F665 -F0BF81B43F1968FA6497A961E248DA278E693CCFB3A142B84CFA16279CF000CF -4AF17D27FE09BDA27DB925D6BC5F7B7B6AB9020B0B14B66396CFCCE5DFB71D3F -C2BECBDBC8A7119AE9A789AF4EFCB2B5CC674A9CEDCCB63CEFC1DF01FC0FE09F -06B786ACFC3F6B73A53CA27922D4A25B912C8070CDBF3923B7A76AE834DF0078 -73460069DA1E9BA7A860DB6CECE3897208C1C2A8AE85B3802819009AE6727277 -93364947639DF12F81B43F1859476BADE9D67AAC313178A2BCB5499118F53B5C -1C74EA39AE0AF7F660F87ED7F777F67E1DB3B0BC96DA5B659AC6211346AEB82C -8A3081FB0623804D7AD1E003DF3419303D2AA352515CA9D909C232776B53E29D -4FFE09C36B3DF3BD9F8CEF6D6D390B0BDA09180F66DEBC7E0298DFF04D7B5993 -E6F8832C7B47F1E8C38FC7CE02BED87B98E1DA247552DD371C7B9FD3348F751A -B6DDCA483861BBEEF4EBF81AED58EC42D54CC5E1E9356713E25FF87644092195 -3E21965ED19D1B81F95C57D4BF02BE195AFC20F87D0F85ADEE85E3DADC4AD35D -FD9C43E73B9DD9DA09E8A54753D2BAAD464FB469D751C5335AC8E8D1A4C8E159 -4E0E4A93D08EBF8679AFCF9F8C7F19FE33FC12F1149A3DE78EAFA6B96512C522 -58DBBC5329240F99972A703A60F63DC56B0A95F1F254A53FBFFE18CE50A7868F -3A89DD7FC1496ECD9DBF830C6A5D9DAF159949040C438E7F3AF87AD3CDD4B561 -0451CA2E09CF2F92001EFED5D3FC48F8F1E37F8AF6B671F8AB587D592D5A436F -E6DAC49B09DBBB05547A2F73F8570B6DADDCC177F6A59317000FDE8500F6FC3B -57D560B0F3C3E1FD9DD736A78F5EAC6AD5E6D6C6B5DE853C7A519EE2468DA300 -E367079C63B639AC8BE86680C0E5FF00D6807E56E320E0E4FD7F9D3AE3C41757 -50795239727EF924E1BF0AA8F792158D73911E4AE467938C9FD0577C2334BDFD -CE6938B6F9763DBF48FD9875AF11FC2D83C616DAD27D9E4D36EF509ADE6B6654 -892DE568CA090139270587CA0751F5F0F0ED9237ED5CE081DBBF4FC4D7A5E8FF -00B4778EF43F017FC21F6BAC98F40FB3CB682D8DB40408A42CD22EE285B92EC7 -AE79EB5E6F0C6D2B96FB2B3EEF4520138ACB0F1C44652F6CEE9EDE85D4952697 -22F5F521918EF3F31A962B9911783D7B575BE15F0ED8EA704EBA95ADC413AB29 -462E114A9C8EFDF38AD59FC2DE1A8C7CF3490E7A1F373FA00694B10A33E5E57F -77FC112A778F35D1C4DBE5E45F3303031BB3525DAC6CDFBB1B9300631DEBA7B8 -B4F0DD8B6D170F74A073B0B7F80A8FEDBE138C00F1DE396C6E58F1C7E25BFA55 -AACDED07F77FC12396DD4E49A3318665C81D339A7AC227F9C8E71804735D026B -5E19888DDA65C4D1E7255A623B7D7D6AB49AFE8C0916FA32AA7F0EF9E4257FF1 -EC568A77DE2D12F4D8C459CDAEF1B4316E3E6E3155DE766EAE7F0AD59351B691 -B747630A8CFF00164FF5A89755683E611C48474C44BFE15A5C45288CCE0ED0ED -F4E6A416178C07FA34E73C8FDD9E7F4AB327882FA41B7ED0553D1540A892F25B -CB98567B89766E505802C546704819E7E948633FB36E9177B5A4C17A731914E4 -BA6863D9B882BD56ACA6A31DA44162DCCBDCCAA0E7DB6F4A8F56D72E3595B659 -D2DD16DD3CA8FC8B68E23B7FDA28A0B1F76C9A1B7D00AEF73BF20E06EEA053AD -DB0E70707155861880454913E48E7F1C5302705B7019DDCF35FA235F9DF18DCE -3A649ED5FA215F5D907FCBDF97EA7CE671FF002EFE7FA0514515F5A7CE8578FF -00C4079FFE129D415217650A84326067F76BDEBD82BCDFC5F1A9F115D133321F -9380D81F7057E77C733E4CB69BB5FDF5FF00A4C8FB3E14A7ED31B349DBDC7F9C -4E0D8EA018F97B142FF13039C63AF18EF50B9D5A460B0471BB93CEEDC01E3B73 -5D2CC92723CED87B93263FA5465A278CAB5EA8CF7F341FF0AFC3D57ED147EABF -56EF26738D1EBB0AAB793091DFEF0C7E66A499B59873B515D7036B0C81CFFC0A -BA38E18D93E5B90CA78255BAFEB4E636FB87F193D0EFCE7F5A5F587D914F0B07 -D59C9B5C6AFB499204EBD43023F5714AB3EA0A84B411A6470C5C007F0DDFD6BA -AFF4666FB831D324D56F2962E15601B89259A3AAFAC37F649FAAC57533F5BD6F -5ED7F44934CB8903594B7115D105C16F312331A9249C1F94E38F415CBB7849EE -15A2996231B0C162E33F860D769342B2464848707B0CFF0051510B2825667620 -FB1039FD2AE38B9C36D052C1529AD55CF2E9BE0E0903B5B5EAA11901659339F4 -E02FF5AE5F55F026ADE1D2C6709E4B48B1A4C0F19CF423A8E327A76AFA063548 -D5553851D8639ACDD67438757B79EDDD8A472F382DF75BB1C1E9F857AB87CE71 -1195A6F43CFAF94D1E5E682D4E1B4AF866D67A7DC4FAC4CB6D345BD2348320B4 -A0855524E703A9FC315DD7C3FB5D3D3C51E16925CDACD16B166CA230415C4E99 -191CFDD9BF4CD62DCF8CE0D4B4C974ED5122D2F558EE04844F380261E6125977 -632086FF00C77BE78F3CF147C467FEDFB69B497DA74EBDFB5C1708C06F70230A -7A0E07979C1E39FAD75469E2F1F3FDE3FF00238A53C36112F67F3EE7EC4E90AB -6508887CC5470D8C1353DD5D83244BBB93F363E9DFF5AF8C7E077EDD9A56AB67 -0699E2D8E2D36E618F6ADDBDC6164230392DD38F53D8F24902BEAAF0FF008CF4 -5F16D9C375A56A96D7D14C3E4F2E4049E32463AF15E1D6A35683E5A8AC7A3094 -2AFBD0674F0DDAB839E31C1C822A513C6467703F9D634C206641308C9270A1C0 -E7E99A9CB71DB3F415CEA4D1A3A6AE68C5751CC06C6C86190477A56B948D954B -60B6703D71D6B26DA0B5925DC5623B4ED27038F6A278A1DE4ED42B1F21B030BE -E3F2A7CCF723915EC6B238663CE69C4FA71546D9C200001C0E953C73EE6181F5 -239A6A5DC970B6C58E011EA6A4DE327DA991A190838E2B9CF1EFC46F0CFC33D3 -3EDBE20D5ADB4E889DAAB2C8033F5E83A9E9DAB68C5BD8C5B5D4E97CC1C7BD3C -0DDD0E3EB5F1B78C7FE0A31A569F73243A0F867EDCABD2E6EAEB6061EBB0213F -9915E6BAB7FC1473C6571262C347D22D031E0B06723F322BD2A780C4CD5D474F -B8E696229474723F44DB68E3BD33EF7435F9BD6DFB79788AC4C92EA924FABCEE -A17CBB4BB4B5850647DD0AACC4F1D491D4F15475AFF8284F8CEEE02BA759DBE9 -D23673249334DB7E8303DFAE69ACB715276E40FACD04AFCE7E9548D818EA7935 -04B2051972B1AF5CB103F9D7E496B3FB5DFC50D6A697CDF166A114721276DB4D -E5633D86DC607D2B93D4BE35F8E3550E2EBC4DAB4DB8E5BCEBE958FB7F1576D3 -C92B4BF8B24BF139E78F847E0573F4CBE2DF882CA2F16E977B737F0358E9D66F -730A457291B4D316538C9CE14848D7278FDE9EBC63C7BC41F16FC29617D09B87 -F0F6B91436B73A82CAF296696FAE1E569ED8615D96265982E0F5F28292706BE0 -6BBF10EA57FCDC5F4D39030374849C5516BC9A4FBD33919EEE48AED8E4B4E295 -E6CC1E6551ED147E82699F1F7E1259F89EFE79E7B0D1EC9248C47268DA7CCBF6 -8558D4ED933180AA1C90173D17A10C2A97C70FDA6FE0EFC48F0ADF68370BA95C -A4E5655BAB3B758E45914E4105FF002391C83EA063E033297382C587B9A50247 -200427E82BAE39461E2D4EEF431963EB4938E9A9EB7AA78B7C0771E15B1D1251 -E20BBB7B09A7B9B778EE238C1795514E54A380B88D7807279F5C0F3CBAB8D237 -6EB686E88C7DC9E45C9FC978ACC16374C46DB77607A1DA69CDA75C6EDAE04647 -F788CD7AD4E9AA7B33CF6EFB977FB5ACD0A98B4F42C3B48CCDFD6A43E269171E -55B5BC78EA04759FFD96EA397C93FDD5278FC288F4C949C1591476246335A7A9 -25D7F14DF36EDB285CFA0FFEBD539B5ABC6041B8701BA8048CD4CBA510C37EE5 -5EE7AFF855B7D1ECDD0ECB80ADFF005C8E7F9D2D101866EA490732641A32ED90 -3247A83D2B674DF0C4FA8DBDD34126F6815A49005CE1077EBFA55D874AD3946E -96E5A57C0043305DC781C0A8E78DDAEA5B8E9739AFDE718CFBE694C6E7A8F4EF -5DCDB41A5403023B693DD886CFEBC55A8EEAC55C058AD213D06C5503F3C5613A -938FC30B94A29F5B1E7F1DA4F20042C9D71900E2B522F0AEA6FB77DB32863805 -980AED0DD59DC10BBE36EFB4B0C7E549F6DB693E559D0EEE31BC0AE49E2AAA8D -E30B16A10BEB23924F08DEF0595402467F7838ABC9E0EDB12B4B711C649E147F -9E95D289A3E8B22820FF007C1A5FDDB001A61853DBD3F3AE4FADE21BB3D3E46E -E9D3B68CE5E4F06AEF016E8007A965CE3F0150C9E0CBA8E42629A29137751C6E -19EFF85752F0C441FB991C1C819147947670E47FC078AEB8D7A8F5E6FC19CCE2 -91CB3784AEBCE9413148C57276B7DD3DBA545FF0875FB1242AB31E000C2BA931 -30031B58A8E3229E04A1001B4907A91DBFCE6B55526DE925F77FC1159763916F -085FA152A2324F6DE38A7A7856F4A61846B8E40DC33F8D75122B71B8286CF55A -9D148192A3711CFBD6F7A896E88BAB9CB5B7862F5E40008F71390322BEF8AF8C -5230A721471D4E3A57D9D5F5DC3739CA5594FA72FF00EDC7CEE716FDDFCFF40A -28A2BEDCF9B0AF2CF1BCAC3C497A001C6CEB8FEE2D7A9D790F8FF5BB0B3F155E -C32DC2C72831E57927EE29E807A57E73C749BCB69D97FCBC5FFA4C8FB6E11696 -3A777F61FF00E95132667B958B740914B29E5448FB47E62B95D5358F15583334 -5A55A4AAA701A390B67F956E4BE26B08E2F31A66DA393B6373FD2B9FB8F8A9A0 -2A9633BC8578DA22604FAF515F8DE169D46FDDA3CDF7FE87E99899D34ACEAF2F -DC7377FF0011B5DB466379A142983825E36E7D79AA47E2B4CD84934D4455FF00 -9E73956152EADF19A646234DB58D50E70F283F860022B8FD6BC6FA96B6ACB70D -1119E8A8057D561F02A6AF5A828FCD9F3B5B1728694AB367736BF166CDD4A4D6 -77D82792B71BBF2C9E2A7B9F8B7A6C76F27D98EA493E385976301C7AF35E43E6 -B9C74FA1A42CC4E738FA0AEBFEC8C2B77E539D663894ADCC77EBF16F55F34957 -8F1FED0FF0C520F8B7AD9C05B8B707FDC27F9D70041E48CE7EB4D25B1C9C574F -F67E17FE7DA3258DC47F3B3D09FE2A6B63E6692DD8FAED3FD0D489F176FD1F73 -4314847A647F5AF37299F7A78508723823BD1FD9F85FF9F683EBB88BDF9D9D7F -887C711F886DD92E6C635955488A65660C9E98E79E7D6B8E66390CB83F5A76D0 -73DE8DA077C62BAE9518508F2C1591CD52A4AACB9A5B88B294E9FA5751E11F8A -5E27F03165D1758B9B08DCE5A38DF28C718E54FCA7F115CC8001CE0520192455 -4E11A8B966AE898CA507CD17667D0BE11FDB73E227872030CF731EAD11508CD7 -6832A074C11C77EE08F6AF44B6FF00828BEB6B2299F424D9DC6F53FC947F3AF9 -A3E1378227F1AF8CB4DB14B569AC1EEA08AEDB3C451BC81377247A9C7D2BB5FD -A73E10F87FE10F8A6DF4AD3EF657D465B4B7B8B8B191495859D5B76D62391951 -C649F98FA5785530B8175D5070F79F63D58E2314A97B4E6D363E8FD2BFE0A33A -2A220BBD0AF828397DA1246FA026419FC6BAB5FDB52DBC77E10F113F82BC31AA -5D6BDA7D935F133245E522823965F332C31BB217278F7E3F37238895248C91D3 -DAAD595FDC59976825788C88636D8C4654F514E793E1ED786FEA42CC6AED2DBD -0FBCBC3FFF000514D160D02DD357D06F0EB0322516FB4C4707820960471ED57E -3FF828EF857F77BFC3FAAC60E7790A9C63A63E7E7F4C57E7BAE571C9FC2886CE -69E4DB0AB3BF5C0E73552C9F08BDE77FBC16615DFBAADF71FA4D27FC1487C129 -A72345A46B3E71438DD6D1ED040FFAEC33CD7C5DF1C7F680D5BE33F8AEE354B9 -7921B3E05BD997044402E3A8C64E73F9D709A6783754D54BAC516D58C82E64E3 -19AEAF4EF85F6AEA4DE5F4AB26CCFEEB681D7A60F359C6380C0CF99CAEFB6E69 -6C5E2A3CB18DBF03CFA4BE77E7A7B0A8833F0C78FAD7A9FF00C2BCD0D60937CB -3AB85C87F306073FE7F314DFF841F41B544668669B2320B4D82DF419C13F4AE8 -FED6C3F44FEE23FB32BA5776FBCF2DDCCC71BB271CE2936966DA481CFE75E9C9 -A169119F262D236E410EEE47CA3D4127B66A95E6936F0DE8BBB58D52E635DBB3 -1F230208208C7047D7D2B4598D39351B35732782A89395D3B1C7DF59D9476160 -F6EF7724CC8E6E51A101131D0A10C723079242E38EB52699A1DC5E5BABC768F2 -A924EE000E3EB5F53FC42D1EC6D7E0D7C2D85EE61502D1E05B4932D92C6DDA41 -B812233FBC39DF8046380735E35A978621F03EB52C415750D02E6668ACAFB71F -BEA482BC636F4CE1867183EB9E68665ED22E297BDD3CCD25827092727A753981 -E0C9A0406E2D163DEB952F21DBF98AA9A8783EF163F36158F6C7D6352C49FA64 -57A5AD9C0D0B08E2302370C7CD6193F4CF3F954336829BC08C4B93F7809700E4 -738C8EB5C11CDA69EAADF23B5E57A5D33CEFC3BA17DBE495C4A514328C1400F2 -B9C73DEB66DF42B15F9892FCE066439FC8574CBA30B57DD149769C862A1C3162 -381C91E9534D75759C4B7724B85FB93057217F11FCA9D5CC27564F91E842C028 -47DF5A984BA7582AAB2ED0C87E612EEE0FB1CD39EDA0909610C2A3EF066E73F5 -AD44BBB8240DF6DE48C61840A1B1EFEB50CF2CAC061E062411B84446467B807F -9573AAD26FDE97E253A165EEC4CFF2E231E447183CF419E3F2A0C3032202AADC -6471D2A6585A15F9A4898E33805B07DB9E942A8DCBB0B3EDC31111CED39F5C7F -5ADE357ECDCE795096FCA65B5BC6AE63312151DB04629CB6F66586D8D473EA45 -694B0150CEAAEA43630D1939F6E3BFF85470CC2538552C33FDD35E8FD6128ADF -EF385D395F629B5C269513ADB031C974444DC9C32E46475A8DB4EB2888728486 -E8B927DFA629DA85A497177693EC2B042ECCE4A9CF6E31F9D59F3958EEDD8E3E -61B4820FE35B29C2E9DF57B93CB26ACD6C50FECFB591DB68DB185CED627AD31B -4BB7DD1F0D20638CAFFF00AEB49E680112ACA0B301C7207F2A7796B285FDE45B -49276B377FC6B5FAC429E8D93ECA525A23326D115612D17CB93CF522A21A1BF9 -44EE55619F90B6327BF6AD94824071B4371C6D93231EBC9A7AC19C3007E5E391 -D6A9E263749C912A9BB6C6247A2CA594ABE0601C83D3EB4268372020494AAB12 -5B39E315D1C96328B68E605486041C2F5C718354C40577001571C657D2A63895 -36ECD14E9B4B532A3D27507E56E3E6C0EB9E69ADA7EA41B69B803B7DE38AD77B -7C3963B91CF23E94D12157542D9C8EB9EFED56ABDDDEE9A25C6C65AC5AA63709 -C1E09C83E9F514917F69BB49B25CBEE03939EC4FA56A185965DC03A8C72DB80C -FE153A85DAE4962C4F03AE2875A30B5968C5CB739D3777C086327DE6FE24CFF4 -A905FDFB16563CAE0B00A2B785A195D5914B313D7603CFA53A4F32067054A8DD -B7952714DE2232D236FBC391AD598F69A95D4AE3E4DC7A01B6BEE6AF8BE1C34F -F74139C066C7F5AFB42BEDB87A5795656FE5FF00DB8F99CE17F0FE7FA0514515 -F667CE05795F8D746B6B9F13DECB3119631B7A60844FF0AF54AF2FF1A46ABE23 -BE70EA0E10905B07EE0AFCE38EDB59653B7FCFC5FF00A4C8FB7E1049E3E77FE4 -7F9C4C24D12D718F2C49B80F9994FE7FE7D6A8CBE11D26E66569B4FB46C670CF -0AE7F223357BCF0EA4162A4A83B8F2704F3DFBE6A3B76792572DFBD8D0F3FC38 -EA3D6BF0A8D4A91D549AF99FAE3A7097C4933027F871A14EAE7FB2EDE205480C -8369CFD0570FAE7C17910BCBA75DA364E04322ED207FBD9AF5679D0EE04B28C1 -23E524363D3D3F5AA92C25DC8647991D432041E87049E7AFB57A387CC7154257 -8CEFEBA9C55B0187ACACE36F43E78BEF06EB1A71FDF69D7201FE358CB03F88E2 -B36E34EBA807CF6F2AE7A6E422BE96B8D3A00C55519CECC2B6E00673FEF76CFB -D67DED9DBB831C8AAAC9F282E013923BF3D075CD7BF4F3E6FE381E2CF26EB099 -F38BA36082A41F7E298508EBC57D032785EDA67CCB6F6CFB012CCCA06EC9F5E3 -DB02ABC1E00B09642C6182551F2AECEBDFAF3C74AEBFEDDA5D62CC3FB1EAF492 -3C17146DE71D7E95EE93F827457B5632C31C40E47239FCEB9E5F02C36174CF6A -B6F71075686E5B6B2F04E4377E9EDD6B7A79C51A9756699854CAEB53DDDD1E5C -2376030B9FA54A34DBB2A185B4A51891B829C715E9714B610EA07F70B67CE161 -68C3823EA4FEB5B105CE9572AEF19799E2F98A860C0104703B74F6A753339417 -32A6EC2A78053D39D5CF1AB8B0B9B54569ADE48958F06452A0FE750A29601472 -7D7D6BD9355BEB5D521FB39B5F3A31C849071D3D7B77AE42FF00C276193E4BB5 -A82377CDCFE38CD6987CCE157DDA8ACC9AF97CE9EB0774749FB393DD68BF15F4 -0BD974C3A842B7290A438F94CB26523C9C1E85B35DEFED6FA2BF8E3C79AEF8D6 -D2FE39E24BB5D3AEB4D57DCD66628922F301CFCD1BBC6C03051838070586785F -81DE25D13C09F103C3D7F7B6CFACDC43A9C5B00DC91401658CA4CAC082CC0863 -8231F2F539E3DA3F6BFD3B5AF07F8AA4F09F8712DE2D2353B54BFB886D91FCF9 -99A476632BB33331DD1EEE081C0F45DBC75A738E3E33D95BAF6EA694E319615C -3777E9DCF30FD9E3C1B347E279F553E121E3186D6C2E99EC64B3FB4461C44427 -CBB58160CC3008EBF4AE17E267C3C93C21A95AFD9DDA717502DCC96623225B27 -6CEE8241CFCC84100F04820E074AD1F087C4AD6BC3692DBE8F7D7FA35E5DAB43 -77736F3150F19C12063A1C86E7AFCC456D5DC9A44D66F2BCF39BC2B91E62E773 -75C93DF393D7D6A6B626B61B12EA4B552EC6D4B0D4B1341463A347932E9AE7AB -449DB6C920523F035A5A75AEAB03AADAC88A32794652BF98CD74778B1DD8D92C -2AE84FCA36D66CDA34309F3AD1C4215B9466386FA11C8FC2BD6862556567A7A9 -E6CA83A4EEB52449FC419D82EC919E48973F4AB826D75807FED3C3127AE7D2B3 -EF45F416E8F6F2B9273887686E33EE338F7E6B206BF709BA3699BE50718F9719 -EBC62B2FABF3ECA3F717EDF9776FEF3AD5935068C86D4118E31F700CFEB53C37 -F3C719491FCC65C0C06DC33EDC572369ABDBA1324ED3B3678DA1703EA73FD2B4 -7FE123B48143091E4DC7F800C8FE54DE06125CBA5BC90962E49DF5FBCE81B519 -5E029B320AE0B467923A734D693ED37323379BE5105801213823A738EB8CD73E -7C431B1F33ED0553FE79B4796FAF6ABF79249269D23A5C2C2153702F8C1078C7 -D6B09E06852B6B6368E2EB55D2C7BAFC5BD6EC34BF87DF0DF4FCDAD9DCB693F6 -9942146F319847B4B211946C004E792467D2BCE5752D3F55D36F2D6F8F9D6D31 -E4C2A37A30CED9532305C763C6412B91B8D79B786746D4BC65ACD9E9B6A4DD5E -DD4D15B40B21E0BC8DB631EC338FC0D7AB78EBE0CF8A7F67CD62DF4FF115BDA5 -F25DDB33C53D84CED013D19371553B97BAF1C1041E6B82AE02141693F7F7475D -3C6BACED28FB9D4E7ECE6D4349BF9B4FBB9CCD3C6EC5268D8C8B3A7216446EEB -CF07D0738C55E105F148C98E5183B95A4070483E9F5AA71EACA20DC90182FADC -0FB1DDC7FF002CD7F8D187390C09C67A73C73C453F886E660337120503AE0127 -23DF8AE4AB87AB27CF18DAFB9D34B114A2B9272DB62CCB617AC88CCF1A91C61E -60A7D7B9A6A68859C0FB4471444FCEC1B2DED8F5FF00EBD65199B673365F1823 -A7E3530B99DED8A8959947A36493C56D1C2E26DEEB5F7112C461D3F7933A0FEC -E581A48DACEF2E15002AFF007411D327A9C66ACCB7F6F0C99FECBB88A265C00C -58AE71C1F71E9F9D605A78BF54B094F97303190176C88AC71907B8F6AB3AA78F -B58D62CE4B5B9B9430BB2B18A28634008E98C0CFEB8E4F15E73C354E7B4FF33B -96269F27EEF4F913DCEB96B24B97B18EDE44C8DEC8097E30383D79E6B327D59E -4500222A649C2205201E7B1F7AA76BBAE6755F33617F94B48C719F7ED4E974D6 -50CC591C28CFCA49FC7E95E82861E9E9CBA9C0E788A9B3D0B2BADCA708B1B953 -9FE2C7192700FA679FCEA44D552381956D5039E8C4679F5E4556FB18728B1CBE -6B9382A06303D6A38BC9C0640ADB38E8707DFAD428C25ADBEE29B9C74BFDE5F2 -1EE15D9498C752320718FF00EB74A8BCC0D1B299B81DD4ED5C919E9496E85629 -E501BC8C1DDD48E79EFD3BFE7558DCCA4EC1C671B703807B741FA528C5ECDE83 -728AD6DA97D6E122678240B292C0EE6C107DB22A54960B88F634516FCE30AABD -3DFD6A0B3B07B901DC46F0C5F3B127240E00078EB9C7FF005EACB5B08D50A464 -4CECAAA370FBC091FA6306A1F2BD9971BAD6C4020566DEB6A843705F6601FC71 -486D546E736FFBBE01209E7F2FF3CD5994C8B0242CC5318764419C1C64002AB2 -CB75081E5DC4520C95C1CEDC9EFD0FFF005EB6A7395D28B31A94E2B592266B2C -22EC0E368CB299890C0D546B445723ED1296E7E50DE664E7B1C7A54AAD744E7C -E8F6AB0460723AF008F5E69A9739856371B9724F0B8C77FBD8A1BA906ED2252A -335B0DB8D39EDE362977F313F2AF96AC7DF0323D681665D40728C4F3CC438C7A -F353B24916678785031CE09E4804FB75FD2A686EE041344C85D48DA4AE413803 -38FF003DE97B7AB0D987D5E9C9DF94CF16E8ECC5846AAFD0EC3DFA6307FAD569 -B4E8C6E3106752470256E7DFBE2AF48CB1ED3E62226739030768E7FA7AD37CD7 -4643B573B725586391C7F4AEB8E2AB25B9C52A34BA44AB0E9D342C5B6B904120 -7DA33DCF1D062A3305CDBCC58B4C1718D9205723DFAD69C45FF77CF9795772B8 -C90073C671DB9A7AB845324A72C415C940D8E3AE723271C557D6A4D5DA4FEF1F -D5A1B2664DB89637512079893FF3C8823DB835F6E57C8420B47BDF2A1CABA1CC -8AE40C73D473C8AFAF6BF43E15AEEBFB76D5ADCBFF00B71F1B9F5254DD3B3BEF -FA0514515F7E7CA05792F8FEEACED3C497AF732346B98B3B7D76AE327FC2BD6A -BE76F8EF6F2DFEB7AAAC37022781149881C17062539C0EB8F7AF81E33A4AB606 -9424ECBDA2FF00D2647D7F0C55951C5D49C55FDC7F9C4B76FA8585DA811DD349 -B4954E7700B8EE0739EB5237976F70B1DB0E07DD2CD907F0EA4F3DBA66BE7CD2 -B5BB8D12F16647942A901937115ED5A76B70EA36D6F2C520CEDE238DF956C8EF -9E3AF5AFC731D964B06D34EF167EA183CC2389F764ACCD969C5A41248C33395D -AEDB72A0F4C7AE3B0E6A91B95FB311B17F78093B948006EEDCE7D0FE3493CF15 -CACD2DD38495F6B17662F838EBF5C8355D204015F7C523965C4523860AB8EEBC -E33D7915E5F2A47A3CD22CFDB2E25C92D09F2930437523B75E78CD53BABB97C9 -11ACBFBA39DE5491863E98278A6CBA9952516DA24119C978D70BCF6EC08E98AC -F79DAE23557670724330C827A0C923B67A0C715B4606539EA5EBABB10EF63146 -B14A4842CB905C0C8E07238F5F4F7AA8F3C28C1648F790DCAEE00AE33C6738ED -55D67786C5E3591A491C10DBB3D3A7D2A081A39ADE56BB998306388021C9C803 -80381EBF415AA8591939DDD84B8D45E3918C00ED752396192B8CFE07D2AA79AF -25D4816DF68193B59F9236E3B9F4A8E79218A3022F31DF277654E0F20F5E703A -D655D5F4D36E4CCA91A82768CE3E9C7AF4CFBD76D3A7CDF09C93A9CBF1127886 -D8DDE9D710210CA71B58B6ECB70706B84B5D46FB4192484FCA7243472720FE47 -D315D935C346CCE0E0A0DC183609EB9EFED9AC9BBB882F2E104D0890302DF77E -6F703BE6BE9F034A6A0E1515D1F3D8BA917353A7A32BDAF8E6E0A949E2404925 -8C78FEB51DFEAB0EAA22B581A4632B8DE4E471DBFAD625FD89B79491BD549E03 -AE0E2AADB4AD6D711CA83254E727A5777D529297345599C9F58A8E3CB27A1F48 -7C02F00E97AB6A86FB50D45ACACF4BBAB71024414B5CCBBF2376EE89F29CF4C0 -35AFFB605DCEDF1EEEF575990D86A3696ED6B3063CC42211838183CBC4FF00CF -18AE2FE0FF00C7287E1F596B36D75A7C7AB69FA908A47B57BAF28A4AADB8329D -A79E4FA571BF17FE29DDFC52F12B6A5307851234821804CD208A345002827920 -B176FAB1AF2E387AF3C5B7555E276CAAD28E1E3ECDDA4432DDC3BB324E1C7404 -0DC001F4FC2A39754B4727330249E9D08238C7E1C8AE31647038241EC738C54F -1DDF971EDF2A3662725DD77357A9F53A77B9C5F599EC76B0DE45789888C92124 -818889E9EBC7A66A492290C6C3C9742C72BE6B2A738F73FCAB8DB5D46F223B22 -BB9634C1C2A1207E42B6ACA3BA9AD9BCC5336E60C32727F5E949D271F86CBF10 -5514B496A5C6F36624EF8E3DE4B6E5239C7AE3AD67EA7A5C976417D8C41E3036 -13F99AD6B6B75DBB9B1B80CE08C15E3D3BD3E254323F390C3E5DC3007A1F5347 -B554B795C3D9B9ED139897C372C648192D9F946E07F3AA936917F64ACCD0B2A8 -C82430E9F9D76724E0C6C1888E461CB13F7CF4E87AF07F4A74616645DDC851BC -13F9E07FFAAAA38A52D5A14A838F53814B99611B5802318DAE09C54E3523F669 -A3DCC80E080BFD6BAC16705D8C4D0C6015FBE53AF1F4A5B5D3EC2D2D847F6186 -E80E4CAC83773D067AD6557174E9ECAE5D2C3CAA5F5B163E05F882C7C3BF147C -27A96A12F91A7D9EB16971712609DA8B2AB336073D149FC2BEA1FDB8FE347877 -E215AE81E1FF000C5F41AD1B577BCB8B8815CE0EDDAAA1881CED6CB63B9E7BD7 -CA7069DA7C504CB369B2B17036142015CF7CF3E9D3BD58F0B6A0DA15E2CB6F62 -642B1C80492CB84C9E8C40E7819EBC13C73D2B8AAFEFAA7D661BC569B599D304 -A09519BD25EA6541AADC884ACAC368277151C8E3152ACB011BE47D9BF952DDCF -F855F16888DBE68D212CDB4EC25B3DF3838F5F4FE54F4815E56728CAAA086655 -C83F5F6AED8E321B5B539A58693D53D0A86EA0879DE02367E623AF3EB57D801B -8672F9E02F7F7AABFD9904E5A558A264420B7C83180707B7AD5C8B4F8D625650 -AADB80194C76CE00C834AB62E3043A785949E80AAD2236E4270393C75CD39008 -9807760CC72772F51F80A70851DCABBAA7CC72D8DC339E7F9D244D1AEE20215D -BF7E53803A703A0AF3962A76B2D579AB1DCF0D15BE8FEF196F72B09DD8562581 -2700B0E4743531BF73E71180ACE18B2707FF00ADF85425A5C49E5C0F288C6772 -8CF155FC8BAB9D92C21C444EE29246573D38C9F4AD65469CAD2B2BFA9946B4E3 -78DDFDC68B1BAB9550DBA5407E556C001BBE3A77A8DE3F29D1670C8AA39E7951 -D33EFD2AE586AB6AB6AB14B68A658C00C15C60FB818F4FC2B720B6B49DE397CC -8920CF98E91804E31C7E23EA2BC7A95A5426F9A1647AD0A51AD0F7677672C251 -0412A72B92A73212700673EDDAAD19C2A2C6268DE242307700725B24805466AC -964BBB865DE6587948D980CEDCF1C67D31DFAD51BDB4DAECF129F293F76AC13D -39E41EDC7D73DEA9495476D88941D357DCB9E6991AE4C32978514EDCA907A7E9 -4C610DB3B04C2EF1B327A2FA76E983496B6ED6C162136F5196760A546EC9E0FF -007BEBCF150DC8C0930C51D64F28C4C7A77241E8141FFD0AA54573593173CB7B -0493EC11962E58AED2CA7A9CE3038EDC73D2AE5F482EA38FFD5C92150C5D1085 -EB820FD31FA9EB54E25324522B18E38914A8DE013D73D077E4F38A2DC1370ED2 -1170E99077B00AC39F5FE5EDEF55C9CAEF7D84E7CCACC8504519F421C01B4900 -F3562DE2B769C462532C2C4F0AA37633DAA76B2F36069D02A3AED53108C90C4E -7182075E9515A3C36F77265567895768DC3209EC7FFD75BFB47383716CC79146 -49489627582EA30798DD118876C871BBB8ED5214C894A602AAB1217079F4EB9C -7CCA7D7D8D50B9B196D6E86E8B11B60E5B80C3BAF355AE6536D33322EF2A5B85 -5E18707AE3DC510C3B9D9C7514EB28BB32F86287E748D37295DCABC938C01D7D -71515C2CD2CD856862546D84B82493DB23773C6071C7158B3F8A552EE6DD68EA -AC3EEB36E2BEBF36067F2A67FC25277FFA82405001671CFB6307F9576430756F -F0A39658883EA6FBB4E23DAE41645C829C03F5F6A92DC4B184C2207008E49F9B -93CF38ED581178A02E330CAA0A91B84801F4CD49078AE3501591D48046472304 -E718A52C2D56ACA2888D6A7D646DCF235F95592389D530836AE0F6E323AF03BD -7D975F127FC241672DC6E432AB71862A0F7E49E7DFF4AFB6EBEFF8563387B652 -56F87FF6E3E4B3E716E9B8BBEFFA0514515F7C7CA057CCDF193516D37E216B6E -64C46CB12950A391E4A6473EB5F4CD7C85FB484928F891A828C18F6C6718FF00 -A631D7C9F125255B0B08CB6E75F948F77269CA15E4E3FCBFAA3CDB57D422BEB8 -9258A3F289C671C03F856C7863C64DA4C5E54A098F2394033C11DEB9493B8078 -1E95174C7B57C454A10AB0F6735A1F5B0AB3A72E78EE7B3D978AED35290A0B98 -C195B0A9329278270013F5EA6B6E68DA38D3ED3E64842919545287A9E08C1E87 -F4AF9FD6468CFCA704F5AE9743F1BDCE98EB14C12E2DC0C10E093EBCFE55F3D8 -9C9EDAD167B74733B3FDE23D62FEFE19BCA04C726F2079A80807039183D31C74 -F5AA21E6B6826883794B7077317E72B918CFA00476ED54F4EF1258EA30214113 -60F2C3232D81918FA8C8E9D6B46EEFA2661FB8196564250E485C60F19AF02709 -527C9289ED4271A91E75220BF82EACE0FDE29DAA03A148D88C9EC4903B67F953 -D356B0B6B72B133C65D865D8293EE00CF039FF003DB3EF6C85C7DA552DCA6C0A -773918C7CA4F03A5644F6215E41E72A04043060473D31D3FCE6BA6951854D2A4 -AC73D5AB386B0573526BEB355BAF91A491F3870FD07B8E9592C92797872A8CF8 -241C96E07238E00EF4D160700B3346BC7CCA739E7D6AC5D5B94FDE46ECE525D8 -0F2198E09C91DB8078FD2BA7D9C60ED177B9CFCF29EB256B1476B202383B49C1 -1E846381CFE755AEB4C17089F2ED68C67710011C71DAAD85168CDE682189C0C1 -3D4D3D674918F9283E7000561C60F031CF5AEFA73AF875CD6D0E29C29567CB7D -4C06D26EDDD8ACCA703F886EFE79ACE9B459C306650CBD320633F90AECCDAE11 -8BCC727858F7723DF3D3F5A8A380395F2812F9C0040604FF00915BD3CCA5D519 -D4C025B3388934B612BB052A99F941C9FE952DBE81248A79DA48CF3C6071FD6B -AF74704630324E0A63D79FD6A6861F330ECFB70A7014139E7A1F4EA6BAFEBF0B -5EC72FD4E57B1CC45E16548C9965048FEEE79A95BC3117988C8CA63DC376F620 -91ED5D1AE9D3334AA14EE44DE411CE323A7BFF00F5EA6834F49602C15DDD7AA9 -700E4FA570BCCA4AF73B9601492B1CB45A2CD6BCC72A16195D8CA49FCB15AF16 -5389368DC39118F4E833DAB73EC682D43222A994ED232307FC9E3F0A6CB612C7 -725238C82880938E075078FEB51FDA7CFA343FECFE4D6E66451B61F8DAA1720E -3B7BFF00F5F35612009B83047DAD86284FDE00F4231FE15A0D6331B489E44370 -5F76CD840E5783C039C0CAF51DEB3ED2E648249640C25908E30A09E473D73C57 -0CEB4AAA6A3B763B214A349A72DC49AC966512EC432000AED1C81DF839F6A79B -5105C10ECF86DDE59C0E3EB4DBD94CB72AF1AAC3105C2B74C95E48FE553CFA66 -F586412A29754662A0009C93D33E98FA77E734BDF8A4A521DE0DDE312B4F69FD -9E617F29D836460AF1C1C1F5A4DAB2664810B9380599471D3238EB8073535D5A -476ACD3ABA480BE3CA200DD8E3A672BCE47E19A82791AE59A5197DA022CBB724 -83C0CFE06B5872B777A98CB992B2D2E25ACB13CAD6F2F0D21088C58200C78079 -C71C7EB50451196545E1998A83950063A559589D9A4B728B2AAA3643920A9E73 -83F97B7351F9490BE106FE78C019E01EE00AEC8B8544E31EBF71C9353A6D4A44 -CD72D1890191642ADB971FC5EBB723D31CF6C1E0D32F9E57B87925C24B3012B6 -7E5273CE703D734492B02EAC707031C761D09F5F4AAB7EEB630AC92379A18826 -340414604F19E9DAAE9D0707CBD5933AAA4B996C87B7976A1951CC51BB2E4B26 -09E39E3E618E6B462F0FCAB1346248C21625402C437182338E0F4E87FF00AD41 -6D8CF0643165033CB60E31D7D7D7F3A974CD65BCE1142E123DA77311C803000A -2BA9F25A9BD63B85070E7BCD6E5B1E1B9F23132C790799471F98EB8C8FCAB42C -7C1D7376CF1A845641B90B36E523A1E71D79E383F854B3CF6714059EF259A631 -1F91549DAC077CF6C01DEAB5A6B777713476E15CB26408A03F3723A7208EB83D -2BC59D6C4D48E9A1EBC2961E12EE4BA8F84C69EB3CD24E0F960E18E30BDCE71F -EE9ACBB767B630428C0BB9C86DC70471C0E71FCA8BEB98DB7CDE598959D99915 -980031C819078C8C6724E41ED515CDE09E05E64453C649C80B8C0EDE98ADA9D3 -AD38AE6D4CAA54A5193E5562492DBCA79942E245C2A9520E41C639CFA5320BC9 -7CA96359083B76E31C7AFE3514FAA468E1A32BE531DE57B67271EDF955AB996D -599A449408B79DEA10A888F755CF60D91F85743A7251F7E373994D737B92B0CB -7B8805C441F610E0AEE72418CED2BC60FBE7D38E94C4F35D43A15951F2429182 -4038E476FCEA586CCBC3324708BA9A53B620DBB763B9182067BF43D2AA3C292A -9C3EEDA41C871CFB0C71E86851A737EEE8C5CF34AEF5572DDD5D19644940DBB3 -0A41E73F51531B816EAE8F23AF9B11320DAA49CAE483D703AD67C56B39FDF6F6 -F25495382300F1E9CFFF00AAA68C348EC91FCFB881BBCBEBDFD3BE289420D7B9 -AE81194EEDCB4B8A079C810304203162EDC1E323F98A4650B23163B5C13BCE3B -74E3FEFAF4A96CBECCD342B26F9613869154E0B28C9C03D00C9EBD69C6E54895 -09F3266607733F0C060F24F707359CB9AFB685E9DC895A38C81B648919FE6C31 -E49E8319EBD3F3A6992341B15B729604B4AB80DF503BD58374F1A344CABB78C2 -BAFB0C74FC2A95D03777124B14C85994E3236EF391D874382D9EDF28F5E75A29 -B7AE88CEA3B2D1DD963CBF3D565493E4F9A2F9810F95009257A7F101D7B511DC -0B7B59308C9BDB3E675523691CE7F3F6C554FB4B2A64796A158056E981D71F99 -A984ED2C21BF74C4002460BD0A827F1E335BFB376E5EE63CEAF76B50D5F4D82E -6EA53B56E5F183205C64E071918E3F2E307DAA84DE1DB4604799B64750CA8339 -5E4F5C8F6EC7D2AC0DC92F9818B4AA38700FBF38FD33D2A769E64F32350AC1B2 -43162307803AF24607E95D119CA09462F630718CB56B739A7F0FC8B82245FBD8 -00FD7FCF3493681796D82F1FBE1793D715D5447731139C2BFDE907451EA31DBB -FAFB52ADDED815428C2EE5E99619E7D8574FD66A2BE9B187B28F739286DA5499 -55E3646CF0186335F7ED7C7765243E746D2C6F2C6802811F2CCDE80F23BF7C57 -D895F6DC335FDABACAD6B72FFEDC7CBE794FD9FB3D77BFE81451457DC9F2E15F -217ED2196F88DA892372A797F86618EBEBDAF973E3CE9F1CDE3AD54C930CC862 -0AA00C8FDCA7EB5F2FC4338C30D0E6EB25F933DCCA22E55E56FE5FD51E10C495 -3903F014CC55BBCB74B399D086C83D0E01AACEB8E718CD7C61F52370307939A4 -24E7827F1A503271411838A00B3617F2E9D3A490C854A9CE4122BB2D2BC54B7E -B12C876CAAA54AB364313DC57079E40A92D26F26E627EC1AB96BE1E9D75EF2D4 -DA9D59D37EEBB1EA6DA8CC142AED27A82EDC1079FCF38A57D42CADCA4AE12512 -7CAC17A03EFC1FE46B1C4B0DCC71A062D20FBBB471CE08FC314EFB1465523690 -119DCC00C07C743EDDEBC6783A4DF24B467A11C5D48FBC9DCD1D675696FF0063 -468FB2388AEDDF8C000740074FE7D703A545A6A417CB1AABB4AF33641E980381 -C9FEB59893B5EC8D6711585C7CADBB04953D871E940D9A7CC1D98C81D08C440E -E661FF00EAABFA9C634DD35BA2162E4E7CCF636E4B08D43AC6ACE3824C63247A -5528E06FB401B24553F292411C1E39C03C5269BAAB59DD40F09311766645EA40 -E38F4EE783E955EF356964BC65C347248C5C1C643F3C0C74FD2B9961F10E5ECD -BD0EA588A1A4ADA9AF118EE2F2D81966B744383217385E9CA9033C0CE7145E0B -69A59DD992358D9488608B01C8201E0703819FFF005D4371AA5A0B48F7C251D0 -FEF06FEA4F4E3D7DE93EDA2E1248810A665F3182A8E4827DFD0E3AD79EE8D48E -B6D0EF8D6A735A3D44226B992344C44B2105780AB8EA73EBFE714F0ADA63322C -8B741FEEB28E71EDE83A9C8F5A2758E4658C65443F27EF23018AE4E0633EE055 -A6B75B98BCF66916D8B10913004E00C90791EBD7EB50E5A599AA8EB72B4B3BC1 -B62365246F93BFCD5C3F4E410474E9D6A5B3BE68412EE530300AB939C0C638E9 -8EB53BDB5D5D9797E66553B643CE41230BF51F2FE9CFA9CFFECF96091972AA1F -F80F5E9F4A57838D983E752BA2FC77B0C376278E147488392A464376E07193CE -6B3CCCF3CE726511B29186C9C9C9C63F1153CC24D3E411EE32104731E1D7919F -6E69239192E4CD6F1FD92188B79796DEC83D0E7BE1A9A515A89B93122D45F4F8 -ED24059B12F9C006DBF30C8391D7BAF3C75A4731BB45284283231963C0C1EA71 -EB8E7A7AE29F6DA8ED5088A92DCA969219B27E401B781B4FCA791D31D49EB552 -7590C8B75CCBC81BD000AB8191D3D0FAFA56B14D36D6865277567A971E3105C7 -92D2B075E111D4E428036B01EE0B720E3AFAD3E38E091E2B789D6DD848489241 -F2E1B20F23EA0E7B605676A1797179712CF3BF9CE5880EDCF1D87F4FC29AB782 -38F323A92E028C67803F950E9CEC9846A45E869CF34B132A6C59C49200FB5762 -B76519F4181D6A9DC5D148992289AD8B10DB33B86411CF61D571F9D0F709247B -CC8C991BB61C70463D473EB4497F1CEA46C60A49C6E1CAE075273EB9E2A629DF -5894E575A488AEA592E2E0C84A9690E762600C9EABB7B73F854710C96FB9C654 -EEC7CBEFCFD29D2CF6AAD18DB9914E370391BBF0A92D23F3165509E52B65B713 -D873B79EF935EBD19C210B463F79E6558CA72F798C73E6397244B2B7CCCE5B2C -09EBC1E4F24F153269E353B398CD22245144406036EFDA01038EA70DDEAA18E5 -8E40D90AC3A2A8CE463DF9EF56A31035BDCE0AACE5E358E26C0DAA739C9EB904 -2E38E73DB158D5936F99174A292E5667A69D234B13432384400F97B7A1C9F4F5 -38E0FD6B42C6C9EEC88ED7FD63863804A97206768201DC79E83F4A83799E20AA -7684701304E01E73D07F33C55A10B585AAC65912511B6E8D7FD62838E49E392A -48C73D3DEAEAD59CE293DC885384657E84CDA74B1DC431C8A97C18796D6D1019 -036AF2DB4E472C3E53DC7B1A2557B46598AEE56428D1C885B610D80BEBC000E7 -A7359AB76197FD103A248422618EEC7CA01CE39078FC3152DCB3DA46CD25C172 -B1655A12339238C9F973C9209EBDF9159C69CD3D6D62DCE0D697B9993DEDCF92 -66C48EBBB0EFCBE32327DBBF526AB48D32DC44A5AE2DF001DB2214DEAC382727 -818ADADC82011B1760318B794E763100720F5C8C71C7E946A57CB14B03ED2C92 -801839E840191903EEE7207B015E9D29C92B28591C152117EF731952CF716CB0 -EE44B8DC701173D3B9C74FCAB56CA1924D39DC653037379C0818271D7B7B7E35 -53EDD0482448D51573BCEE51955C72054995BC9161B492E24DD1011B4898C292 -0E700919C67AD2A9CF257E5B5822A2B4BDEE59B6B5921B38E46911911CEE4798 -6E5C81D013CF43D2B42CCDBDC23BDD4B1C4214660C623FBD6DC00552BD4F5F4C -63DB9CABEB8786FE6540123766033F316C1C827D38C715656243E518672DB943 -2A8539CED1EFD8923F5F6AF3EA4135CF7B37ADCECA73B7BB6BD89AD76C644CD3 -C3B1B2BE4B315DB80339E7A73F9E6996EB2804C8A10AA890190EC38038C1CF1D -3A8A8ED9E145072BBD982813C6082BC9E7F102AF433C6113CF66D913A4691B61 -C32F560318C60FCC3271DB38E6A2A4670778ABA2E1284B47B94E2BBD82256D93 -B60828492DC83C91E83D7F3A5D6B4F92C19E17006CDA1E485D645C6376032920 -8C1F5F5E98A2ED22BA9DE08E01247800B300AE73D7BE303071CF4EBCD476B712 -4103473AEE6FBE250BB768C72000718F9875F7C56D16D72C9233693BA6C82DE7 -67F31844AD1AEC0AD9E5F7138C7BF18A21994491E54C46493AAA938193D80EB8 -F703DEA2368921972ECADBB72ECC1C1E7F91CFAE73486378FCBDBCB0C8D88338 -03A1FCB8E00AEE71854BA3913941A6694EAB32B3328599372F99090096CE77ED -E31F7B1C71D703A93456D3CB68DD9FE6EA411B001DFE5FE59A78558E52932E03 -AB6D009DA491DCE727A0CFE156EE6486EAE77AA931C98C2A64800606DEBC761F -81AE6BCA92515B1AE937CDD496D6D195616CA448CA3649BBEF11D470383FFD71 -55DE21E41334996FB8E84FDDE077CF20E7D7B52078F4FB7690C25C2A8F981CAA -9208CE01EB923F2EF5104B8BAB531878963405F3201920ED03EBFAF43514E9CE -EDB7A173A91D125A8F36EE232DB808F8F900C103B71EA471C53E169ADCDB3A2B -2C9B82F03209EC00C64E7D08E4D43725A631214190BC00777DCE3775F6CFBE68 -730F99FBB6662DB5CEFCE4608F4C739C74AEAD64F95F5399D96C5AD3E478D15C -B1840EA54ED1CF6E3F0E074AFB3ABE2EB5B89205887FAA20860F8C3A73DBB8CE -3D4D7DA35F6FC2E9A75DB56F87FF006E3E5B3C77F67F3FD028A28AFBC3E582BE -65F8BFF2FC4DD5B69DAE447C81FF004C631F9D7D354578F9A65FFDA54151E7E5 -B3BDED7EFE6BB9DF82C5FD4EA3A9CB7BAB76EC7C1FE26D25AE4FDA20527E6F9B -7115C9B295EBD6BF4728AF1A1C3CE11B3AD7FF00B77FE09EABCE2EFF0087F8FF -00C03F3881C1A462C4038E7D6BF47A8ABFEC0FFA7BF87FC127FB63FE9DFE3FF0 -0FCE0F9B3D699939F7CE6BF48A8A3FB03FE9EFE1FF00047FDB1FF4EFF1FF0080 -7E79693AB4B6F22249CA0EC30307EB5D535F85B7DF3F136EF9421E0838C1AFB8 -E8AC6A70DC6A59BABB7F77FE0971CE9C6F6A7F8FFC03E10B0DF6DAC472DD9203 -1F918A823AE067BE2AFB6985AF2495A5729290CB1B7CBCE31C1ED5F705149F0E -372E68D6B7FDBBFF00DB13FDB3A6B4FF001FF807C350DA245024313EFC038DCB -C9F7CFE7F9526A17D35AA43088B743146B1EF206554B707F139AFB9A8A6F872F -F155BFFDBBFF00047FDB36DA9FE3FF0000F886E1A79AE21589FCC5C6C5DDC724 -E793D3D6ABDBDE2C76FBE270B2601651D88E0E3F3FD6BEE6A2A3FD59F7791D5D -3FC3FF00DB14B3AB3BAA7AFAFF00C03E206D5239AEA691D4C71C68005319C2E7 -23818E9D455AB5D7A58DE5C2060EA3792B9741F43D3EB5F6AD158CB84E8C959D -4FC3FE09AC3886AC1DD47F1FF807C491CD74AF98D95F6315428C118679C1C9E4 -F39A922D6A19DA4B26203290AE7049761E87A77EBD2BED7A2B37C2145FFCBCFF -00C97FE09AAE24AABEC7E3FF0000F891F51BCD37538A12233E59C962FB8B2609 -2719C8FA915761BE8ECD1229DDC87600143F3127AF6EBFE15F6751532E10A724 -93ABB7F77FE0847892A46EF93F1FF807C70D0047966B57DBE585FDE29049EB83 -D2AA4B22B5AB468E1897DCE180C9FA30AFB4A8AE78F0659EB88BFF00DBBFFDB1 -D2F8A2EACA8FFE4DFF00DA9F135C413424ACCACAE7183E98F6FC6886EED239C2 -DE4936D380A96F8CB1C8EA4E7B13F9AD7DB34575AE14E92AFF00F92FFF006C71 -BCFF00B52FFC9BFE01F132CDF6A5D90805E44C0DA30703A8E0E38C60D59B12AB -78AFBDD510962F0AF201CE7AF5EBDFD6BED0A2B2FF00545ADB11FF0092FF00F6 -C6AF8893DE8FE3FF0000F8A4DA5CDD799343E6BDBE586FEA42E40FEB4E590584 -B3A461E1206D2546180FC791DB9FF1AFB528AD570A492B3AF7FF00B77FFB621F -102BDD51FF00C9BFE01F1444B66B672348DBE42A3089F2856DF8E7AE78FA539A -53710A46771850E234279C6E63EDD4B1E9EB5F6AD1511E11517775EFFF006EFF -00F6C54B889B5A52B7FDBDFF0000F89C45E5803EE1070170724E09E47BF4E3D6 -AB998D9A72A5783975E4F3DF3DBA8AFB828ADA9F0AA8FC55AFFF006EFF00F6C6 -53E2072F869DBE7FF00F88032CC9B368C0CC83008EA01FA5491DEEC63140CB11 -674768C06752768C9C2F504838F406BEDBA29AE168DEFEDBFF0025FF00824BCF -E56B7B3FC7FE01F162A2BDCA858B7A34659557804ED2DFC5D00232727A7D0623 -8AC23BB85DE77751B0B2919C4846303A7A6327DCF7C1AFB5E8ACBFD546BE1C47 -FE4BFF00DB1AFF00AC09EF47F1FF00807C29A868F1854B99032EEC82F1B0EBF4 -23D6A85AC5A8589FF42997F78490B26148279CF6EBC74F4AFBEA8AEDFF00575B -872CEB5FFEDDFF00ED8E579D2E6BC69DBE7FF00F8421B86BE94A5CC4472AACDB -4E0B0EB83D3AFAE6AFE9AD25AB347245BD53A397DC48EA78AFB828ACEA70CAA9 -0E4F6BA7F87FFB62E39E38BE6F67F8FF00C03E2CD46D8DBBB6E5F9BE5DCC3683 -9C9F41CF7A7D9F98C2DA6B68D6E64447BA1991419147CC57923070A4E07383D0 -9C57DA14573C7851A8F2BAFF00F92FFF006C6AF3FBBBFB2FC7FE01F155D5CDDC -F68B195591645693318504FF00BCC79FC2A38AD36FEF9E4101888458D0025C74 -C8E3A0C0AFB668AD23C2FCBA2ADFF92FFF006C43CF6FFF002EBF1FF807C4AC52 -667318915C2060AFF8E49E3D85356E17ECECCE84A05F9198672783D31EBD3FAD -7DB9455AE184BFE5F7FE4BFF00049FEDDFFA77F8FF00C03E29B9CC719DC892B8 -2BF2AF2776471DFB13F8D2188C325C0DEF19E8125CEE5EBF293C64AE08E2BED7 -A2A570C34ADEDFFF0025FF00ED83FB73FE9DFE3FF00F84E7D46EA39B60104CCA -3764FDD638EC734EB2D7A6B797FD26D6370571C00CA01FC4D7DD5456EF86A125 -6753F0FF008267FDB52BDF93F1FF00807C3EB772CF2111C6A6346E323AA93D7E -B5695A12C19A2DB1E7734FD5B2A3BFB7CA6BED6A2B3970C45FC356DF2FF8252C -EDF5A7F8FF00C03E399A17B6B9579230AD20DEA5970483DFD474AFB1A8A2BD8C -AB2AFECCE7FDE73735BA5AD6BF9BEE7998EC77D75C7DDE5B5FADF7B7920A28A2 -BE80F2C28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A00FFFD9> -%%EOF diff --git a/Docs/InstallGuide/SOURCE/opengl.tex b/Docs/InstallGuide/SOURCE/opengl.tex deleted file mode 100644 index e94c0b1e0..000000000 --- a/Docs/InstallGuide/SOURCE/opengl.tex +++ /dev/null @@ -1,250 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Chapter file -%% -%% Written by Michael Basler % Bernhard Buckel, starting September 1998. -%% -%% Copyright (C) 1999 Michael Basler (pmb@knUUt.de) -%% & Bernhard Buckel (buckel@wmad95.mathematik.uni-wuerzburg.de) -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Getting the engine: Installing \Index{OpenGL} \Index{graphics drivers}\label{opengl}} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\markboth{\thechapter.\hspace*{1mm} GETTING THE -ENGINE}{\thesection\hspace*{1mm} 3DFX UNDER LINUX} - -\FlightGear's graphics engine is based on a \Index{graphics library} called -\Index{OpenGL}. Its primary advantage is it's platform independence, i.\,e., programs -written with \Index{OpenGL} support can be compiled and executed on several platforms, -given the proper drivers having been installed in advance. Thus, independent of if you -want to run the binaries only or if you want to compile the program yourself you must -install some sort of \Index{OpenGL} support for your \Index{video card}. Naturally, you -can skip this Chapter in case you already did (maybe for Quake or some other game). - -Unfortunately, there are so many graphics boards, graphics chips and drivers that we are -unable to provide a complete description for all systems. To give beginners a hand, we -just describe what we did to install drivers on our systems, which might be not too -exotic. - -By any means, try getting hardware \Index{OpenGL} drivers for your system, which is -exemplary described in Sections \ref{3dfxlinux} to \ref{3DFXwin98}, resp. If you are -unable to locate any such drivers you can try software support\index{OpenGL!software -support} as detailed under \ref{softrend}. - -\section{\Index{3DFX} under \Index{Linux}\label{3dfxlinux}} - -%%Bernhard, 21.02.1999,25.06.1999 -An excellent place to search for documentation about Linux and 3D accelerators is the -{\it Linux \Index{Quake} HOWTO} at - -\web{http://www.linuxquake.com}. - -It describes all the following steps in an in-depth fashion and -should be your first aid in case something goes wrong with your 3D -setup. -%% - -The \Index{3DFX} graphics card is a quite popular one (We tested -the \Index{Voodoo}1 to work). At first, you need the \Index{GLIDE} -library installed. Grab it at: - -\href{http://www.3dfx.com/software/download_glidel.html}{http://www.3dfx.com/software/download\_glidel.html} - - \noindent -and install it. -%%Bernhard 21.02.1999%% -Be careful, you need different Glide libraries for the different types of VooDoos (I, II, III Banshee). -%% -There is even an install script included that will do things for you. The canonical place -for \Index{GLIDE} is \texttt{/usr/local/glide}, if you prefer another location, you'll -have to edit the Makefile for \FlightGear by hand. Be sure to read and understand the -file \texttt{/usr/local/glide/README}. Next, you need to install the \Index{MESA} library -version 3.0 (or later). Grab it at - - \web{ftp://iris.ssec.wisc.edu/pub/Mesa}, - - \noindent -unpack it and run - - \texttt{make linux-glide} - - \noindent -in the \Index{Mesa} directory. Follow the instructions in the \texttt{README} file, take -a close look at \texttt{README.3DFX} and play with the demo programs. - -Besides these, you need the \Index{GLUT} library version 3.7 (or -greater, aka GameGLUT) installed. Grab it at: - - \web{http://reality.sgi.com/opengl/glut3/glut3.html}. - - \noindent -Note: Glut-3.7 is included with \Index{Mesa} 3.0 so if you've already grabbed the latest -version of mesa, you should have everything you need. - -%%Bernhard 25.06.1999 - -For the lazy of you, there is of course the possibility to install the 3D stuff included -in your distribution. At least \Index{RedHat} 6.0 and \Index{SuSE} 6.1 are known to -contain all the necessary stuff. - -Finally, some more notes on the behavior of \Index{Voodoo} boards: - -Your card comes packaged with a \Index{loop-through-cable}. If you -have only one monitor, then the Voodoo will take it over when -used. This means that all the applications on your desktop will -continue running but you'll only see the \FlightGear screen. If -your window manager uses a focus-follows-mouse policy, don't move -the mouse. If you lose the focus, there's no way to shut down -\FlightGear graciously! Better solution: Use two monitors, one for -your desktop, connect the other one to your accelerator. You'll -then get a window on your desktop which manages all keyboard -events and you're still able to see your desktop. - -Running \FlightGear under Linux using a 3DFX accelerator board is -somewhat tricky. Most of the boards behavior is controlled by -environment variables.\index{environment variable} The two most -important are: - -\begin{itemize} - -\item{\texttt{MESA\_GLX\_FX}}: When set to \texttt{f} rendering will be in - fullscreen mode, - %%Bernhard 21.2.99 - \texttt{w} will perform rendering in a window at a significant speed penalty. - %% - -\item {\texttt{FX\_GLIDE\_NO\_SPLASH}}: - When set to \texttt{1} the rotating 3DFX logo - won't appear. For a description of all environment - variables\index{environment variable} for VooDooI/II have a look at - -\href{http://www.bahnhof.se/~engstrom/e_3dfxvars.htm}{http://www.bahnhof.se/\~{}engstrom/e\_3dfxvars.htm}. - -\end{itemize} - -This completes preparing your \Index{3DFX} equipped Linux PC for running -\FlightGear\hspace{-1mm}. -%%B.B 21.2.99 -Now proceed and install the support files as described later in this document. -%% - -\section{Rendition Chipset\index{Rendition chipset} under - \Index{Windows 98/NT}\label{renditionwin}} - -This Section serves as an example for installing \Index{OpenGL} drivers under -\Index{Windows 98/NT}. The \Index{Rendition 2100 chipset} is, for instance, included in -the \Index{Diamond Stealth II} card performing especially well in somewhat weaker -machines. - -Diamond itself does not provide any \Index{OpenGL} driver support for that board. -However, Rendition, who make the graphics chip, do. Go to their Web site and grab the -latest \Index{OpenGL} \Index{Windows drivers} from - - \web{http://www.rendition.com/download.html} - - \noindent -Follow the description in \texttt{readme.txt}. We recommend making -the drivers the default ones by copying them to -\texttt{$\backslash$windows$\backslash$system} (which avoids the -hassle of not being sure which driver actually runs). - -With this step you're already done. - -According to our experience, so-called \Index{mini-OpenGL} drivers -provided by some manufacturers for making Quake playable do not -provide the level of OpenGL support required by {\FlightGear}. At -least, Rendition's \Index{mini-OpenGL} driver definitely does not. - -\section{RIVA TNT Chipset\index{RIVA TNT chipset} under - \Index{Windows 98/NT}\label{rivatnt}} - -Because of its high performance, the RIVA TNT is one of the most popular chipsets today. -The \Index{Diamond Viper 550}, ELSA Erazor-2, \Index{Creative Graphics Blaster}, and -more cards come equipped with this chip. At least the default Viper 550 drivers are known -to us having native built-in OpenGL support making any add-on OpenGL drivers obsolete. -Similar things should apply to the other RIVA TNT based boards. In any case, NVIDIA's -reference drivers being available from - - \web{http://www.nvidia.com/} - -\noindent - do the job as well. - -\section{3DFX chip based boards\index{3DFX chip} under - \Index{Windows 98/NT}\label{3DFXwin98}} - -The \Index{3DXF} based 3D add-on or 2D/3D boards are perhaps the -most popular ones today at all. \Index{3DFX} made Beta OpenGL -Windows 98 drivers available on their Website at - -\web{http://www.3dfx.com}. - -\noindent - From the main page go to \texttt{Develop 3DFX} and further to \texttt{SDKs and -Demos} and grab them there. - -First, make sure you have the file \texttt{glu32.dll} either under -\texttt{$\backslash$Windows$\backslash$System} or elsewhere in your path. If not, install -the MS OpenGL kit \texttt{opengl95} available from Microsoft or elsewhere on the net -(which by itself only provides software rendering). - -Next, locate the file \texttt{3dfxopengl.dll}. in the 3DFX driver package, rename it to -\texttt{opengl32.dll} and copy it into \texttt{$\backslash$Windows$\backslash$System} -overwriting the file with the same name installed from the MS kit. This should get you -going. - -\section{\Index{OpenGL} software rendering\index{OpenGL!software rendering} -under Windows 98/NT\label{softrend}} - -If you have an accelerated 3D card, it is highly recommended you -install hardware \Index{OpenGL} drivers for your specific card. - -However, in case you are really unable to find such drivers and -want to try \FlightGear despite this you can install SGI software -\Index{OpenGL} rendering. For this purpose, get the file -\texttt{sgi-opengl2.exe} from - -\web{ftp://ftp.flightgear.org/pub/fgfs/Misc/}. - - \noindent -This is a \Index{Windows 98/NT} self extracting installation -program. Install it by double-clicking in Windows explorer. The -package includes some demo games you may wish to try by invoking -them from the Start menu. - -%% Revision 0.00 1998/09/08 michael -%% Initial revision for version 0.53. -%% incl. Linux stuff from b buckel -%% Revision 0.01 1998/09/20 michael -%% several extensions and corrections -%% revision 0.10 1998/10/01 michael -%% added 3dfx stuff from b. buckel -%% final proofreading for release -%% revision 0.11 1998/11/01 michael -%% Remark on mini-OpenGL drivers -%% revision 0.12 1999/03/07 bernhard -%% Complete rewrite of 3DFX/Linux part -%% revision 0.12 1999/03/07 michael -%% Added Riva TNT Win95 -%% Added 3DFX Win95 -%% revision 0.20 1999/06/04 michael -%% corrections of links -%% revision 0.21 1999/06/30 bernhard -%% updated and expanded 3DFX/Linux diff --git a/Docs/InstallGuide/SOURCE/panel.eps b/Docs/InstallGuide/SOURCE/panel.eps deleted file mode 100644 index 98bfc7164..000000000 --- a/Docs/InstallGuide/SOURCE/panel.eps +++ /dev/null @@ -1,2855 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: jpeg2ps V1.5 by Thomas Merz -%%Title: panel.jpg -%%CreationDate: Wed Jun 02 03:07:25 1999 -%%BoundingBox: 20 20 663 521 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -%%EndProlog -%%Page: 1 1 -/languagelevel where {pop languagelevel 2 lt}{true} ifelse { - (JPEG file 'panel.jpg' needs PostScript Level 2!\n) dup print flush - /Helvetica findfont 20 scalefont setfont 100 100 moveto show showpage stop -} if -save -/RawData currentfile /ASCIIHexDecode filter def -/Data RawData << >> /DCTDecode filter def -20 20 translate -643.00 501.00 scale -/DeviceRGB setcolorspace -{ << /ImageType 1 - /Width 643 - /Height 501 - /ImageMatrix [ 643 0 0 -501 0 501 ] - /DataSource Data - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - >> image - Data closefile - RawData flushfile - showpage - restore -} exec -FFD8FFE000104A46494600010100000100010000FFDB00430003020203020203 -03030304030304050805050404050A070706080C0A0C0C0B0A0B0B0D0E12100D -0E110E0B0B1016101113141515150C0F171816141812141514FFDB0043010304 -0405040509050509140D0B0D1414141414141414141414141414141414141414 -141414141414141414141414141414141414141414141414141414141414FFC0 -00110801F5028303012200021101031101FFC4001F0000010501010101010100 -000000000000000102030405060708090A0BFFC400B510000201030302040305 -0504040000017D01020300041105122131410613516107227114328191A10823 -42B1C11552D1F02433627282090A161718191A25262728292A3435363738393A -434445464748494A535455565758595A636465666768696A737475767778797A -838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7 -B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1 -F2F3F4F5F6F7F8F9FAFFC4001F01000301010101010101010100000000000001 -02030405060708090A0BFFC400B5110002010204040304070504040001027700 -0102031104052131061241510761711322328108144291A1B1C109233352F015 -6272D10A162434E125F11718191A262728292A35363738393A43444546474849 -4A535455565758595A636465666768696A737475767778797A82838485868788 -898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4 -C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9 -FAFFDA000C03010002110311003F00F9D754FDA5356D0EF6F2D750F1AF88AD64 -B5744766BABA6425D37AE19491C8DC30707E56E38CD67E97FB477C46F16EAB0D -9F8526F12EBAB34AF6F148FADBDB196448DE5608ACC491E5A1619C13D319C03E -2FF142EAEF4EF13EBCE247B74925B428EF06E04792C328C50E3953D197956E1B -04AEB7C134165E3AD375FF0016E83E25F107866DE696EEEC69D78F67752AC96C -E91CB6EDE6216915CA3FCA790814F0D83F1F1CABD9E5D3C7CAAABA87324EA5DC -A5CB751514E2F99BD15E495F76B73FA438938AB3578BC5655936163EDA12A8A2 -E3878CADCB39C62E77E7BC128A72E5845B57B491F58FC1DBCF1F7C6C83529B4B -F1F5F68D6BA768727886EAE756D4EED563B58F617388448C580901DA01CE0E39 -C03B563A0F8DF57F0EF897C41A67C608B51D0BC3BFD9FF00DA3A845A8EAA8917 -DAEE1A04C2496EAEDB0AEF7C29F948DBBDB2A39FFD907E20E97F0AB40F14CDAD -DC269F7779E00BAD2EC61BBB237292DF3AC3E5C2F11465C12841120D9C10DC1C -57A27ECE9F1CFC3BE1AD3FC6B378B750B4D26FF55D6FC2F790C361A5082168AC -F50596E1962B688469B625DC4000B1CE033135E15274DB509547AF3757A593B7 -5EF6F5EE7EAD8CA78C8D39E22960E2D4550B254E3EF73CA1ED2CB91B768B96A9 -FBB6D62CF16D43E2578C2CEFEE6DE1F1CEB17F1452B469756FA8DC88E650480E -A1F6B053D46E55383C8078AEB7C7D2FC46F86A9E19FED4F1AEA57075FD12DB5E -B5FB26AB72DB209F76C57DDB70E361C8191D304D7D9BF08BC5F07897C5BE1AF1 -26817BA8F87FC1B67E20F16EABAE5E5C69D7B69A7EB504F24AF6D76D388BECEE -B1A28526E5D190C5B40C85CF90DEFED21E15D5FC156DE13BCF117DABC3707C25 -1A4A6992D8CAD0FF00C242046141063F99D3C98CA4A7288412AC0B313AD4C3A8 -53E6957777B6BA6C9FF36DADBE5D4F269E733C562951A3952B53FE22E5BCB594 -E2B6A764FDC52B6CD4AD78B4D1E0BE39D5BE26FC36F14DEF873C47AFEBBA76B3 -65B3CFB6FED779766F45917E649194E55D4F04F5F5AEC3C6DE10F885E059B57D -3B56F8B16B6BE26D22C63BEBCF0EC9AF5E4574AAC91B98D249116DE5942CA0F9 -71CCC5B0C137918ACBFDAB7E2469BF16BE30DDF8A346D5A6D4B48BDB2B436D6D -70B2AC9A7810A892D995C6D5612091CF9659099321892D8F65F1CFC59F855E35 -D77E2CF8A751F106877B1788BC3E4683A25EF865E6D4AD75136114419EEDADCF -94C8F0ED558E578F3217CA9196D61CAE7522AA6CF4BCBA6BAEFE4BEFD8EAC4BA -F1C2E0EB4F02939C39AA28D2BDA7CD4928DB964D2B4A6DDEDF0FC7A6BF2BFF00 -C2D2F19FFD0DDAF7FE0CE6FF00E2AA5B7F8A1E326DD9F16EBA7EBA94DFFC557D -13AB7ED01E139BE06D9787F4CD4B48B3B44F04268B75E1EBBD32FEE2E65D4C4A -77CA912CA960997C5C0BA3BE6041CAB13B0763A1FC75F855A4F87E1D361F137D -AF45D3F51F0BDDE856FAA8D52F352B15B59E1378D30955EDA1754F380167B559 -7728046D156A95FF00E5FF004BEFF86E71D5CC3920DFF6436F9B96CA3D2F15CC -DF279DF4BAB27AE87C93FF000B3FC65FF436EBBFF8329BFF008AA7C7F13BC624 -9CF8B35CFF00C194DFFC555BF8D5E2C8FC75F177C65AF5BDFCDAA595FEAD732D -A5D4E5F73DB798C20003FCCAA2308029036800606315C745D4D79F1A93557954 -DB5AF53EB686070956842A4F0D18C9A4DAE55A36B6D96DB6CBD0E92E3E27F8C5 -76E3C5BAE0FA6A537FF1550FFC2D0F19FF00D0DBAEFF00E0CA6FFE2AB9FB9FE1 -FC6A1AF41549DBE27F79CD532EC1733FDCC7FF00015FE4761FF0B3BC63FF0043 -66B9FF008329BFF8AA3FE16778C7FE86CD73FF0006537FF155CCD159FB5A9FCC -FEF385E5F83FF9F31FFC057F91D38F89BE30C7FC8D9AE7FE0C66FF00E2AA37F8 -9FE310C7FE2ACD73FF0006537FF155CF0E95149F7CD7561EA4DCB59339ABE030 -8A3A518FFE02BFC8EA61F89DE3139CF8B35C3FF7129BFF008AA93FE16678C3FE -86BD73FF0006337FF155CAC1FC55357639CAFB9E5CB0385BFF000A3FF80AFF00 -23A4FF008599E30FFA1AF5CFFC18CDFF00C551FF000B33C61FF435EB9FF8319B -FF008AAE6E8A4E72EE43C0E17FE7D47FF015FE46F41F13BC6265507C59AE11EF -A94DFF00C555BFF8597E2FFF00A1AB5BFF00C18CDFFC5571F6FF00EB96AE577D -394ADB9E34F0786BFF000E3F723A36F897E2FF00FA1AF5BFFC18CDFF00C552FF -00C2CBF17FFD0D5ADFFE0C66FF00E2AB9A6A5AD399F732783C37FCFB8FDC8E93 -FE165F8BFF00E86AD6FF00F06337FF00154D8BE2678BCA0CF8AF5B3FF7119BFF -008AAE769917FAB14F99DB73871384C3A4AD4E3F723A91F12BC5F8FF0091AB5B -FF00C18CDFFC552AFC4AF177FD0D5ADFFE0C66FF00E2AB9A1D29CB5E8C1BE547 -9AF0D43FE7DAFB91D2FF00C2CAF177FD0D5ADFFE0C66FF00E2A90FC4AF1763FE -46AD6FFF0006337FF155CE507A555CCAA61A8723F716DD91D0FF00C2CAF17FFD -0D5ADFFE0C66FF00E2A9C9F12BC5C587FC555ADFFE0C66FF00E2AB9AA747F7C5 -5C3E2478FEC297F22FB91D39F893E2ECFF00C8D3AD7FE0C26FFE2A93FE164F8B -BFE869D6BFF06337FF00155CE9EB495E959197B0A5FC8BEE475371F11FC5ABB7 -1E28D687D3509BFF008AA87FE164F8BBFE869D6BFF0006337FF1558773FC3F8D -414452B1E554A34F99FBABEE3A51F123C5B8FF0091A75AFF00C184DFFC5509F1 -23C5A73FF154EB5FF8309BFF008AAE7074A58FBD6B4D2E7460E953FE55F71D4C -3F11BC58739F146B27FEE212FF00F1544DF11BC58318F146B23FEE212FFF0015 -5CF41FC544FF00C35D9CB1BEC7157A70517EEA3747C47F16E7FE468D6BFF0006 -137FF154A7E23F8B71FF002346B5FF008309BFF8AAE7075A53D2AF963D8F3B92 -3D8E87FE163F8B7FE868D6BFF06137FF001557BFE161F8ABFE866D63FF0003E5 -FF00E2AB8EAD0ADE9423AE86138C74D0DA97E22F8B039C789F591FF71097FF00 -8AA67FC2C6F167FD0D1ACFFE0C25FF00E2AB025FF5869B5D8A9C3B23C99A5CCC -E87FE16378B3FE868D67FF000612FF00F1553C5F113C565067C4DAC9FF00B7F9 -7FF8AAE5EAC45FEAC529538764632D8E953E21F8A8E7FE2A6D63FF0003E5FF00 -E2AABAFC45F15FFD0CFACFFE0C25FF00E2AB1E3EF5596BBA8528382F757DC79D -5DB4D58E8BFE162F8AFF00E867D67FF0612FFF00154E8BE2278ACB8CF89B593F -F6FF002FFF00155CE53E2FF582B7F654FF00957DC71CA4EDB9D3FF00C2C2F14F -FD0CBAC7FE07CBFF00C551FF000B0BC53FF432EB1FF81F2FFF00155814567ECA -9FF2AFB8E7E69773657E2278AB68FF008A9B58FF00C0F97FF8AA77FC2C3F157F -D0CDAC7FE07CBFFC5573A9F7452D7AD0A34B957BABEE3C9F693EECE993E2178A -4A8FF8A9758FFC0F97FF008AA93FE160F8A7FE864D5FFF0003E5FF00E2AB9B8F -EE0A96A5D1A5FCABEE399D49DFE266ECBF107C5210E3C4BAC0FF00B7F97FF8AA -807C43F1567FE466D63FF03E5FFE2AB1A5FF00566A01D6B5A74695D7BABEE470 -D7AB514BE27F79D3C3F107C52739F12EB07FEDFE5FFE2AA4FF008581E28FFA19 -357FFC0E97FF008AAE6E0FE2A9ABD0787A37F817DC8F3E55AADFE27F79BE3E20 -78A33FF2326AFF00F81D2FFF001551DC7C41F14AEDC7897571F4BF97FF008AAC -41D6A3B9FE1FC68587A37F817DC8C2AD7AAA2FDF7F7B367FE161F8ABFE866D63 -FF0003E5FF00E2AAEAF8FF00C4FB47FC547ABFFE074BFF00C5572557D3EE8AE9 -A587A3CDF02FB91E64F115BF9DFDECDFFF0084FBC4FF00F431EAFF00F81D2FFF -001547FC27DE27FF00A18F57FF00C0E97FF8AAC1A2BABEAD43F917DC8E7FACD7 -FE77F7B36AE3C7FE285DB8F126AE3E97D2FF00F15490FC40F141CE7C49AB9FFB -7E97FF008AAC2B9FE1FC6920FE2ABFAB50E5F817DC8F3ABE2ABA93FDE3FBD9D2 -2F8FBC4FB87FC547AB7FE074BFFC557B57ECFBA037C4AD27C537FE22F1478AE3 -4D25ECD224D2F54F2CB79DE76E2DBD5F38F2D718C753D6BE774FBC2BE90FD967 -53B3D2BC11F10A4BDBB82CE37B9D2D15AE24540CDFE9470093C9C0271EC6BC8C -E230C365756B518A5256B3B2FE68A3D4C8273C56674A8D693945DEEAEFF95BEE -7A27FC2ADF0AFF00D0D1F113FF0007717FF19AF3DB9B7D0347D6FE2E5D6A5E20 -F1F7FC233E03D074DD5CADAEB31B5EDC1985FBCFF7A30980B691845E392E4B10 -C02E3F80BE3C78F3C43E2CB1D3FC4DF0C34FF09E893799F68D63FE134B1BDFB3 -E23665FDCC60336E60ABC74DD9E829DAFF0097E24B2FDA8B4FD3EEAD26B9D63C -25A2E9F61BAEA38D279E48B59548D5D982E49CF5381839C60D7E4FFDA78BFE7F -C17F91FB2FF65E0FF93F17FE6721A8FC7AF05E91A7DCDF5F781FF69EB2B1B589 -A79EE6E2CE18E3863504B3BB1C055001249E0015D86936635DFDAB7FE15B5B78 -8FC5B0786A2D262BD79E5D5F75E3CAD0DE4870C1022AFF00A3C400D8C7EF9CFC -C02D4F8A7F13F51F1BFC31F17F872C7C09AD457DAC68F79A7C125C6ADA22C6B2 -4B0BC6A5C8D4090A0B0CE0138EC6A4F879A9D9BFEDED797CB7703592F876276B -9122F96156D352DC4B671818393DB15E86071F89A955C672BAE59BD96EA126BA -746AE79D8FCBF0D4A8C6508D9F3D35BBD9CE29F5EA9D8EDE48FE16DBF89B5BF0 -FDD7C40F1F586ADA358AEA97B0DFEB296CA96641CDC2BC902A49129043488595 -08DAC54F15E55F17FC6BA4693E17F879AD7C3FF12F8D6F6C7C537D220BBD76FA -48C1B65B59A5568E23144E0BB2210EDC14E4060EAC2D7C72F8496DFB41789A01 -ADF8ABC3BA2F87B418BCFD05ED52DEFAEE6BF600B4976278F67D994AAAFD9909 -137DE771B51579AFDA1F5AD4758D1BE119D726D164F10C7AADC0D41340BB6B8B -4127D86E46E8CBAAB856037056195C95DCD8DC4CBB1F89AB8DA34E72BA728A6A -CB66D79066597E1A960ABD4846CD424D3BBDD276EA765F14BFE47BD4FF00ED97 -FE8A4A28F8A5FF0023DEA7FF006CBFF452515F367D31D2FF00C30DF843FE833A -DFFDFD87FF008D521FD873C23FF418D6FF00EFF43FFC6BE95EEFE34D725F0C78 -5F50D5218D2596DA30EA92670DC81CE3EB50F87EEB5FD412CAEAEFFB34594F10 -959601279832B918C9C771FAD68F20CB2F6F648FBCFF008881C53BFD7E7F7AFF -0023C39BF61AF07B023FB6B5CFFBFB0FFF001AA8CFEC2DE0FE7FE273AE7FDFF8 -7DFF00E9957B5F887C5915BEB7A7E9767AAE9F6F7A6EE24B9B7BA2DE632363E5 -4C0237104633EA2A9789F5AD6FC3FE27D0E317D6F369FA95F0B7FB38B5DAD1AE -3FBFB8E4FE028FEC1CB56D4912F8FB89E4F5C74FEF5FE47917FC30AF83BFE835 -AE7FDFE87FF8D5387EC37E104181ACEB7C7ACD0FBFFD32AF7CD4FC55A468F742 -DEF75086DE72036C63C81EA7D3F1AD48DD65457460E8C32194E411EA0D379065 -CF4F64897C79C4DD71D3FC3FC8F9CBFE1877C21FF419D6FF00EFEC3FFC6A98FF -00B0DF841FFE633ADF1FF4DA1FFE35F4AF74F1CF8826F0AF856FF5582249A5B6 -552B1C99DA72EA39C7D693C3779AD6A5141757ADA70B49A11228B50E5F240C02 -49C71CFE557FD8980BDBD990F8E7891AD71B3FC3FC8F0BFF008617F077FD06B5 -CFFBFD0FFF001AA727EC39E108F38D675B3F59A1F7FF00A655EBBE3EF88365E1 -FD17535B1D4ACDB59B74565B7670CC0EF50415CF5C13C75EF5A1A9F8C2D34BD0 -2D6E2F6FAD74FBCBCB5F320F3C9085F603EE700B2D0F25CBF6F6688FF5DB889F -FCC64FF0FF0023C53FE1877C21FF00419D6FFEFEC3FF00C6A81FB107849738D6 -35AFC6687DFF00E9957ADEABF1021F0AF836C754D4A48750BA9E252A2C49F2E6 -6E325491C0E4751F85749A46BB63AF42F2D85C0B88D4E0B056183F8814D64B80 -BE94D5C5FEBA7117FD064FF0FF0023C064FD87BC212633ACEB7C7FD3587FF8D5 -467F61BF0873FF00139D6FFEFF0043EFFF004CABE89D4659E0D3EE65B68C4D70 -9133451B670CC0640FC4E2B8C5F88D2CDF0F6D35C86DE29353BA956D62B31B88 -69CC9B3671CF404D5BCA704BEC19BE31CFE4EEF172FC3FC8F2EFF8621F08FF00 -D0675BFF00BFB0FF00F1AA43FB11784B9FF89C6B5FF7FA1F7FFA655EDFE2DF12 -5BF8774DC4BA8DA58DF4F1B0B77BBC88CB0C64E064E0647E62A487C456DA7F87 -B4FBED56FED94CD046CD3464EC958A8C941D4824E471D28FEC8C15EDC843E2EC -FBFE82E5F87F91E1DFF0C45E111FF319D6BFEFEC3FFC6A98DFB0FF00844927FB -635AFF00BFD0FF00F1AFA57BDFFC24FA57F64BEA9F6E88D8230469F3C2B16030 -7B8392063DEAD49A9DA46C55AE620C24584A8704876380B8F5354B29C1C5FBB0 -B132E2CCF25A3C54BF0FF23E7C4FD887C2299C6B3ADF3EB2C3FF00C6A94FEC4B -E13E7FE271ACFF00DFE87DFF00E9957D178AE4BE2578CEE3C17A225CD9C31DCD -DBC98114B9C6C00976E08E831F98AA79661777133FF5A73A7FF3132FC0F22FF8 -624F097FD0675AFF00BFB17FF1AA43FB12F84F9FF89C6B3FF7FA1FFE355EF967 -ACDBDCE8716AAEEB15AB5B8B876DD908B8DC727DB9FCAB27C29E24FF00848B54 -D5DA1D4AC2FEC2231FD9D2D0B178C10D9F332075C0C609E868796613F943FD68 -CEBFE826478BA7EC43E11460C358D6F3EF2C3FFC6AA43FB14F84C67FE271ACFF -00DFE8BFF8D57B6C1E37D06EA5B38E1D56DA592F0ED8115F2CE73E9D47E38A9F -56F15693A1CE90DF5F4504CE0958B24B63D7039EF56B2FC325A44C9F11E6EF7C -448F0B3FB14784CFFCC5F5AFFBFB0FFF001AA43FB15784C67FE271ACFF00DFD8 -BDFF00E9957BC4FE25D2EDAC6D2F65BE863B4BB758E0999B0AECD92067B743D7 -D28D3BC49A66AED762CEFA1B8FB21C4E51B223EBD4F4EC7F2A3EA187DAC2FF00 -58B36FFA0891E11FF0C53E13FF00A0BEB5F8CB0FFF001AA68FD8A3C26A30358D -68E3A7EF62F7FF00A655EEBA578AF48D6EE5EDECB5086E2E1064C41B0D8F500F -247D2B93F1AFC453A4F8AACF428351B4D2C34665B9BDB88CCBE59C6553664727 -8E73DE8781C3A5B112CFF349FC55E479C0FD8AFC25FF00418D67FEFEC3FF00C6 -A8FF00862DF0A0CE356D6BFEFEC5FF00C6ABD8EFFC5B1F867C1C9ABEA57315F9 -31EE8E4B58CA2DC672536824EDCA804F3EB577C31E28B1F1669B15D5A382C624 -792239CC45973B4920671C8E3D2AD6128EC911FDB9997FCFE6788FFC316F84FF -00E831ACFF00DFD87FF8DD34FEC5BE14E7FE26DAD7FDFD8BFF008D57D1200078 -15C1E91E2BD7BC45AD6BB67651E950C7A6DD35B8FB40937B804F3C1FF39A7F54 -A5D84F3BCC5AB7B667997FC316F84BFE831AD7FDFD87FF008D503F62DF0A29C8 -D5B5AFFBFB17FF001AAF77D4B5ED3B43681351BD86D64951D9779DA1C2005C8F -A67F5A81FC5FA226909AA1D420FECF91FCB5B8072BBB9E3DA9FD569232FED6C6 -FF00CFD67889FD8C7C267FE62FACFF00DFD8BFF8D527FC318F853B6AFACFFDFD -8BFF008D7D2BE819AEEDE0B9B7824955269C911479E5F032703D80AE575BF19D -B7F6D5869BA76B1A74575F6D486EA0B9DDBCAEEC144C291B8E71CE3B7356E841 -0BFB571BFF003F59E5727EC6BE149319D5B59E3D2587FF008DD33FE18C7C29DB -57D67FEFEC5FFC6BE95EE5A9F89B48D1AE1E1BEBF86D654884EC92360EC2C403 -EFC83F9539BC45A5A68E9AAB5EC434F906567CFCADD7A71CF7A7EC21B19BCC71 -4F57519E19FF000C65E141FF00316D6BFEFEC3FF00C6E907EC67E141D356D64F -FDB58BFF008D7D2BDE74BD5AC75B84CD63751DCA29DADB0F2A73D08EA3F1AA36 -5E33D0752B9B6B7B6D56DE69AE54B448ADCB8C91C7E20D354609DD0BFB4312FE -DB3C613F638F0AA671AB6B3F8CB17FF1BA47FD8E7C2AF8FF0089B6B1EDFBC8BF -F8D7D2BDA1BC63A1477EF64FAA5B477492189A391F6ED603241CF1D01AB49AF6 -992690BAA2DEC274F6048B82D853824719EBC8355C8BBB25E36BCB79B3C33FE1 -8D7C283FE62DACFF00DFD87FF8DD1FF0C6DE15238D5B58FF00BFB17FF1AFA57B -A691AD69DAF4724961771DD2C642BED3CA9ED91D79FD6A9D9F8D740D42E2D60B -7D56DA59AE8130A2B72F82471C7A834DC177667F5AABFCC78BFF00C31A7853FE -82DACFFDFD87FF008DD4DFF0C7DE17EDAAEAFF00F7F62FFE37F4AF52D77E23E9 -5E1FF13D968F705BCC9831966C1DB061772E401CE7A71D335D3DADC437D6D1DC -412096195772BAF420D34ADB364BC4D47F68F046FD8E7C2AC49FED7D63FEFE45 -FF00C6E93FE18DBC2DDB55D60FA7EF62FF00E355ECBE31F121F0B6951DC456A6 -F2EEE274B5B6815B68795CFCA09F4E0D67C3E26D4B4CF1469FA3EB9059A8D463 -91ADAE2CD9B6974C16460DC8E0F5EF9029F34BF9999BA927ADCF2AFF008637F0 -AFFD05F58FFBF917FF001BA78FD8EFC30A30355D63F1922FFE375EC92F8DB40B -795A39356B48A45B836ACAF2004480F2A47B7AF4AADE3AF1BD9F8134A5BBB989 -AE2591B6C502705F919E71C6334372FE662736CF275FD8FBC2E3A6ADABFF00DF -D8BFF8DD45FF000C71E1719C6ABAC7FDFD8BFF008D57B6C5E27D2A5D2E7D496F -13EC50B6D9262080A78EBC7B8FCEB33C2DE261AF6A3AD489A9E9F7BA6C263300 -B563BE2521B779848039DBC60F63D2AD54A91D14D99C9296E8F27FF8639F0B7F -D05F57FF00BFB17FF1BA07EC75E185391AB6AE71D3F7917BFF00D32AF6AD3BC5 -5A46AD786D6CF5082E2E067E446EB8EB8F5FC2A3D4BC67A1E8F35C457BA9C16F -2DB945951CE0A96195E3DC0A7ED6AFF3BFBC8E48BE878EFF00C31F7863FE82BA -BFFDFC8BFF008DD21FD8FF00C33CFF00C4D756FF00BF91FBFF00D32AF6EBFD73 -4ED2ECD2EAEAF2186DE4C6C919C61F3D36E3AFE14FD2F57B3D6AD8DC594EB710 -86D859411C800E39FA8A3DA54FE77F78BD943B1E1A3F63AF0B818FED6D63F192 -2FFE3747FC31DF863B6ADAB7FDFD8BFF008DFD2BDFB15E6D73F152E21F86B6DE -22482D5EFA494C6D6DB8ED03CC65CE339E8A0FE356F135E3A7B4665F56A2FECA -38C1FB1FF865463FB5757FC648BFF8DD3BFE1907C35DB55D57FEFEC5FF00C6FE -95ED1AB788F4CD09E35BFBC8ED9E404AAB72481DF03B536F4DCEB1A6C32E8DA9 -416DBC87170D079EAC983C01B97BE39CF6A6F115FF009DFDE4BC250FE4478CB7 -EC7FE196047F6B6ADFF7F22FFE3751FF00C31DF86074D5B56FFBFB17FF001BFA -57A3780FC7EBAAF83ECB54D72E6DED65B8B936CAFF007119B2768F63807F2AEA -749D7F4DD744E74FBD82F040FE5C9E4B86DA7FCF7EF8A238AAFBAA8FEF26581C -3BDE9A3E69F14FECA3A8D86A289E19B3B5D5EC0C41A49F56F11358CAB265B2A2 -38F4E9C15C053B8B039246D18C9C8FF865EF1A7FD0BDA17FE16937FF0029EBEB -F51914BB47A0AF4635EBCA29BA92FBCC9E5F84FF009F68F8FC7ECC1E3407FE45 -FD07FF000B49BFF94F4D7FD973C692633E1ED0F8F4F1A4DFFCA7AFB08003A0A3 -68F4157EDABFFCFC97DE4BCBB06F47491F1D9FD95FC643FE601A17FE16B37FF2 -9EA65FD983C6A063FE11ED0BF1F1A4FF00FCA7AFAF8003A0A5C607A552AF885B -5597DE66F2AC0BFF009748F900FECC5E351FF32FE83FF85A4DFF00CA7A5FF866 -1F1AFF00D0BFA0FF00E1673FFF0029EBEBEEF462ABEB389FF9FB2FBC9FEC9C07 -FCF947C7F27ECBBE359319F0F683C7A78D26FF00E53D09FB2EF8D1338F0FE83C -FAF8D27FFE53D7D818A314FEB58ADBDACBEF21E4D974B57411F208FD987C6C0F -FC8BDA0FFE16937FF29EA86B1FB1FF00883C41E57F6A782FC27A97939F2FED9E -2C925D99C671BB4638CE067E82BECDC7346293C4E2651E47564D7F5E411C9B2E -84B9A34527F3FF0033E21FF861CBAFFA26BE07FF00C290FF00F2968FF861BB9F -FA26DE06FF00C290FF00F296BEDEC518AC79EA7F33FC3FC8DFFB3B09FC9F8BFF -0033E21FF861BB9FFA26DE06FF00C290FF00F296ACC1FB16EA96B6773690F803 -C1B15ADD6DF3E04F1432A4BB4E577A8D170D83C8CF4AFB5714B8AA552AA7A4DA -FBBFC8979660E5A3A7F8BFF33E20FF00861BB9FF00A26DE06FFC290FFF00296A -CE9DFB166ABA45E477763E00F06D95D479D93DBF8A1E375C820E1868A08C8247 -E35F6B628C50AA558B4D4DDFE5FE40F2CC1C934E9E9EAFFCCF917E297FC8F7A9 -FF00DB2FFD149451F14BFE47BD4FFED97FE8A4A2BE04F74FA47E26D9CF7FE04D -62DEDA092E279210122890B331DC3A01C9A97C23E15B0D1AC2C6E22B67B7BC6B -6459773BE73B46415271D47A5771F61B6CFF00AC98FB6D0475FAD1F62B6C67CC -980FA0FF001AFA6E477BD8C8F35F88BA6DD6A17BE166B6B696E160D5A096531A -960881812C71D00F5A3C7FA5DDDF6B7E1192DADE49E3B7D496499A352446B8EA -71D057A48B1B52DF7E627FDD1FE349F60B4FEFCC3DB68CFF003A3925AE807816 -A5A06A5A47897C46B7D16B73DA6A72B491CFA4DAADC078893846C82576E718F6 -AF4FF07D8A69DE19D3EDA35BB548A3DA05F00261C9FBC0703FC315D6FD82D71F -7E7FFBE47F8D1F61B51FF2D26FFBE47F8D11A6D3BD81B3CFBE2B58DC6A3F0FF5 -7B6B4B792EAE24440914285DDBF78A780393C555F03C5A4D8359C76BA15F69F7 -CF008A49A5B19635E14160588C0C95FCEBD28D95AFF7E6FC87F8D1F62B5FEFCD -F90FF1A7C92BDEC17D0F9F7C45A5EA3FD99E2ED2D3C2B73757B77A849730EA31 -C0194C4640461B19240E303B127EBE9B7B612CBE009AD7C866B83A698C43B72D -BFCAC018F5CD76A6CAD47F1CDFF7C8FF001A3EC56BFDE9BFEF91FE3495392E81 -73C6F58F0C6A37FF0004AD34D8ACE46D422B78C9B665C4990790011D6BBAF0E6 -B5FDB766CE34CBDD2C464208AF60F28F4FE11E82BA93656A33F3CDC7A28FF1A3 -EC7699C169BFEF91FE34D424BA0AFA58CCC5790E81E15D560F88CFA64B65347E -1DB2BE9B5589DA361133B2058D55FA12A5B38CF66F7AF71FB1DA633BE7FF00BE -47F8D1F63B4CE0B4DFF7C8FF001A25093E81738FF1CDA4B7BE10D56082279A67 -8182471AE598FA015E75ADF87B5AB58BC15A9087506B6B1D3A282582C63F327B -6976005BCB20F3D8FA6DE715EEBF63B4C677CFFF007C81FD68FB1DA6EC179BFE -F91FE343A727D0773C3BFE11A9750F0678C3ECB6DAD3DD5E88EE76EA76C22792 -5462FF00220EBF747D78EB553C1FE0ED734EF14E8CD7714FF65BD51A85DB146D -B14CBBB6A31E80E08183CF5AF7C367680677CDFF007C81FD68FB1DA6EC6F9BF0 -51FE353EC9E9A31F31998AE2FC47A2EAFAFF00882716BF6682D6DECCDBAB5E46 -ECAE65077B2608190001DFAD7A31B3B4033BE7FF00BE40FEBFE7F3A0DA5A06C6 -E9CFD157FC6B47093E84DEC79EFC2AB7D42C7C1F0D8EA56F25BCF652C96EBE62 -152E80E55867A839EBED51783B4BBBB3F1C78C6E66B692182E5EDCC32B290B20 -024CED3DF191F9D7A3FD92D3192D38FAAA8FEBFE7F3A0DA5A06C6E9CFD157FC6 -9724B4D360B9E55F0AFC0963A7F8474C9EF74B30EA9BFED0E6E232B2A386217A -F20631C7BD2CF7973E12F1E6B97D3E85A86A36DA8A4260BAD3EDFCF640881590 -81D01393F874AF54FB25A6325A718F5551FD7FCFE741B4B40D8DD39FA2AFF8D2 -F6724AC90EE7927C54D3A7F157853414B6D36F0A3EA50BC96C212258A3D8E096 -0B9DA0647D335D26A9A227877C3DAA49E1DD3205BF6B70890A270FB410A31D09 -009FAF7CD76C6D2D00C969C7FC047F8FF9FCE8169684E374E7D7E51FE3FE7F3A -3D9CB7B05CF07F0F26B12F8E7C3BAB5DE9DACC9198DE0B892E2C44422765C7DD -1D23071C9ED5D86A9A65DCBF16344BD4B695ACE2B1951E708762B1DD804E300D -7A41B4B40325A71FF011FE3FE7F3A3EC96B9E1A73FF0103FAFF9FC0D0A9CBB05 -CE3BC7BA54FAD783758B2B54125C4B6EC234FEF30E401EE71557E1E6A52DCF87 -AC6C66D3350B09AC6D618246BD83CA566540A7664E587079C5777F64B41D5A71 -FF00011FE3FE7F03486DACC1C6F9BF1503FAFF009FCE9F24AF7B0AE6762BC834 -6D1ECADBC4BE29975AF0E6A177E7EA0EF6F2A584922B264F20818C57B80B6B3E -4EF9BFEF91FE3FE7F0349F66B3FEF4E0FA1551FD7FCFE06874E4FA0268F37F13 -E90BE22F17F8327974F96E2C112EA4944B09DB1131A14120C7CA723A1EE31597 -E18F064BA8F817C4FA25C5B4963F6AD42E4DB89A32800CA98DC0C72B900F1D71 -5EB9F66B307EF4E47A855FF1FF003F8506DACC0C969C7B151FE34BD94AF7B0EE -AC796FC318B57D5122BED7ACE7B49F4FB75B0B74B842A58E732498233C8118DD -ECDD6ADFC47D2AEF50D4BC24F6B6D2DC25BEAD0CB2B468488D030CB1F41EF5E8 -C2DECC93F34FC770A3FC7DA836F66A3969FE8547F9ED47B295AD615D1E6DA8F8 -561D6BE2A47797D60D71696FA52797249193179BE6BFCB9C609C1CE2A2F18F87 -0E9F73E179EC34E7B9D274B9DDA6B3B7432300D8C385EAD821B8F7AF4D305983 -F7E7FAED028FB3D9E3EF4E4FA6D1FE7B53F652FE50E6479C78534FBABBF1CEB3 -AEAD9CDA769971047024573198A49641825F61E83B64F5AE3F45F074F67E1DF0 -1CCBA3CD0DFC7AA092F1BECEC2445DEDCBF19030075E3F3AF7730598FE29FEBB -54668F22CFD673FF00015FF1A5ECA5D87CC8F9CF5FF086A377E2ABF9FF00B1EE -A54935866120B672AD1143CE718DB9EF5A71786356FF008557A6C29A7DE24F67 -AAB5D496AB1626F2C33F2A8C39FBCA40C76AF78305A63EF4E3DCAAFF008D1E4D -9FADC1FF0080AFF8D2F632EC1CC8F2CF00D999BC5979A9BC7AF09E5B5F2A4935 -6B410236197681EA7AFE19AE7740F06CB69E0FF03CDFD8F343AA47AD249744C0 -C2548F7C992FC642E0275E3A7AD7BB791663BCFF0052AA3FAD1E459FF7A7FF00 -BE569FB197617323CBFC736B77A778EBC33E208F4EBBD42CECD278E75B184CB2 -A964217E51DB2DFA1FC7BBB1B8FB6DA4339865B732207F2A750AEB9ECC06707D -AB54DBD98FE29FEBB40CD29B7B351CB4FF004DA3FCF6A6A9C9740BA385F889A4 -DF6A3A5584FA7C02E6E74EBF82FBC8CE0C8109CA8F7E7F4ACAB982EBC69E37F0 -F5F47A65F58E9FA48965966BC8BC96677550A8AA79382A32471D7DB3E9E2DECC -93F34FC770A3FCF6A5FB2D9E3EF4E0FA1551FD7FCFE149D295F60BA3E6F3671D -F0F1DDA47A0DD6A9A8DCEA73C56F73041BD613E613F337F07AE7BD77BF10BC31 -A86A3F0B2DF4E8206BABFB68EDCB449CB3150036DF53D4FE75E87A5786345D12 -5BD92CA29E16BC99AE2760776F90F24F24E33CF0303F2AD0FB359FF7A707D0AA -8FEBFE7F0A954656B343E64739A0EB5FDBD68D702C2FB4F01B6F977F0F94E7A7 -21739C7BD79E4FE14D6350B9F8910DA4735A4BA87D9FECB33828B305DC5955BA -723E53FEF735ECDF66B4CFDE9CFB855FF1FF003F851F66B4FEF4F9F7551FD6A9 -D293DD0AE8F2036F71AE8F065A59E8779A7CBA5DCC52DC4B71018921445C3A2B -11F36E38E9D71EF4DD5BC28D7FAEFC46BC9B4B7B8924D3E24B191E02DBDBECEC -0F97C72DB828E3907EB5EC22D6CFAEF9FF00EF95FF001FF3F81A0DAD9838DF39 -FAAA8FEBFE7F0A5ECA4FA0F991E2F378612F3C09E1586FEDF58B5D42D222D14B -656AD23C0FF2E43A633C8C63E879F5EA3E1ADC7882E34EBB5D7637CC7285B79E -687C99664000CB2F51D0727935E822D6D3192F3FFDF23FC7FCFE06945A5A138D -D39F5F947F8FF9FC0D0A9496B60E6B99B8AF08BDF00C83E0F5A347A25C7F6E99 -CEF516EE67DBE73755C671B71DBA57D126D2D00C969C7FC047F8FF009FCE8169 -684E374E7D7E45FF001FF3F81A254A52E8099E2BE2DD1753D33C7F79AB347AAC -F617B6EB14726936E2E1E2C280C8CA41C0241391C73F515D87C38D2A2D27C349 -0431EA31A79AEFB7538C472E4E33F28E83D3F1AEE8DA5A0192D38FF808FF001F -F3F9D06CED036374E7D70ABFE342A724EF6072B9F37DEE8F75A57C28F0EDAEA3 -633452FF006E296B69136BB02B27183EB5DC781B4A77F1DEABAB5AE8D73A2E94 -D6696E915CC3E49790104B6DFA0EBDFF001AF49D63C2BA2EBF15BAEA114F3A5B -4E2E2304ECDB228201E186782783C73ED57CDA5A06C6E9CFD157FC692A524F60 -B9410714EC55A6B78D0931EFC639F30007FCFF009FA27919241207D07D7FCFF9 -E3D286914999B2B629761FEE9FCBFCFA55930E013DF9F6FF003FE7F004592410 -BF80FF003EFF00E7A5DC2C55DB8ED4BB0FA1FCAAD7923AE31EB818FF003FE7F0 -0C3CF419FA71FE7FCFD0B88ABB08F6A361F43F955A11601E3F21CF4FF3FE7A28 -B71DD41FD3FCFF009FC15C2C54D87E94BE591FFEA3FE7B55B31718FEBEDFE7FC -F45F2F1D8F1EFF00E7D3FCF62E3B14F61F61FD28298CF3D3DBFCFA55CF2B8C63 -F127A71FE7FCF43CAC773C7BFF009F4FF3D8B858ABE49F423F0E9FE79A411939 -C11C7E156FC9F97A71EA7B7F9FF3ECE11E3039FF003FE7FCF65CC1629F9471C8 -23F0E94795D791D78E6AE18B2BFD71D3FCFF009F65F2FA0FD303FCFF009FC8E6 -1D8A9E5633FE07FCF6FF003D9DE41F43F97F9FF3FA5A11818FE7D3FCFF009FC0 -F2C7A0CFA63FCFF91F91CC163E33F8A5FF0023DEA7FF006CBFF4525147C52FF9 -1EF53FFB65FF00A2928AF873A0FB5360FF0022831E3B639F4FF3E953ECC73D3F -4A4299EDF97F9FF3FCBEBF988BA20D9EC051B3E953ECC73D3F4A36649FF3FE7F -CFE0F98342BECC62902000633EB560A5214A3983420098C71D0FF87F9FF3C26C -E9807D471FE7FCFE93F9783D314797EDF9D3E60B1079647A71FE7FCFF9C013D0 -1F6E3FCFF9FD2711F3D3F1C5218F8E9FA51CC1644013A7F87D3FCFF9E17CBF63 -FE7FCFF9ED308F9E9F8E2831F1D3F4A3982C88367F9FCBFCFF009E0F2CFA7EBF -E7FCFE93F97CF4A3671D053E60E5441B3FCFE5FE7FCF09B71E9F9FF9F4FF003D -AC6CC1ED9FCA936679A3985CA43B3FCFE5FE7FCF09B71FFEBFF3E9FE7B4FB31F -5F5E946CFC68E60E52009EC47F9FF3FE7A05319E474F5FF3E9FE7B4FB31EC7D6 -8DA7EB473072906CCE383FE1FE7FCFB063C7A71CF5FF003FE7F49CA6719EBEA6 -8DA7EB473072A2B88FA718E7D3A7F9FF003EC9B40F4E39FF003FE7FF00AD60A7 -4CF5F5229429F734F98390AE23E9C639F4E9FE7FCFB2141F97F9FF003FE7160C -78EB9CFBD1B3D327F1A3985CA41E574E08E7F2FF003FE7D93CB1FE7FCFF9FE53 -ECC1E47E268D9C0E4FE7473072907963E9DFE9FE7FCFB1E5FF00F5BAF5FF003F -E7D27D9FFEBA36F1DF3F5A3987CA41E5FE1FD3DFFCFF00FA90C7E99F6C7AFF00 -9FF3E96367346DE3FF00AF4F985CA5630839E3FCFF009FF3E81841E8319E3A7F -9FF3FA59D9CD279631D3F5A398394AC611CF0071E9D3FCFF009F63C9CF6EBC74 -FF003FE47E5644783D00149E5FB0CD1CC2E52B987AF007E1D3FCFF009F64311C -1E00F4FF003FE7A7E5676739E83B607F9FF3FA1B3248C01F853E60E52AF93EFF -00A7F9FF003FA0613CF4FF003FE7F4FCAD6CE41FFEB7F9FF003F8279679F5F61 -FE7FCFE873072958C5FE78F7FF003FE780C279E9FE7FCFE9F95909C838E3F2FF -003FE7F0361FC7D87F9FF3FA3E6172958C5FE78F7FF3FE780C279E9FE7FCFE9F -95909D0FFF005BFCFF009FC14276E33F4FF3FE47E4B987CA57F2B39E00FC3A7F -9FF3EC7939EC0678E9FE7FC8FCACEC1907B7B0A4D9EC33F4A5CC1CA57308E780 -38F4E9FE7FCFB1E4E7B75E3A7F9FF23F2B0130738E3D87F9FF003FA1E5FB0CD1 -CC1CA41E48E78C71E9D3FCFF009F63C907F87AF1D3FCFF009FD2C08F07B63DA8 -F2C63A7EB4730729018FAF51DFE9FE7FCFB1E5E7D47A7D7FCFF9F4B1B39F6A36 -F1FF00D7A3987CA41E5FE1FD3DFF00CFFF00A8F2FF00FADD7AFF009FF3E93ECC -9A36FD7E99A5CC1CA4023CE3FCE3FCFF009F6360FCB9FF003FE7FF00AD3ECFFF -005D010E3B9F5E68E60E5211174E08E7F2FF003FE7D93681E9C73FE7FCFF00F5 -AC7978EB9CFBD0131EA68E61F29008FA718E7D3A7F9FF3EC7978F4E39FF3FE7F -FAD394E99EBEA4528538F5A5CC1CA88047D38FD3A7F9FF003EC79607A71EFDFF -00CFF9F49F674CF5F5346D3F5A3983951004F623FCFF009FF3D02B8F4FCFFCFA -7F9ED3ECC7B1F5A027E347307290ECFF003FE7FCFF0044DB8F4FCFFCFA7F9ED3 -ECC7D7D7A5284E3B1A3983948367F9FCBFCFF9E0F2CFA7EBFE7FCFE93ECE7A73 -4797EA28E61F2A2009FE7F2FF3FE785F2F1D01E3A7F9FF003FE1308F9E9F8E28 -31F1D3F4A5CC1644013A7F87D3FCFF009E1C100C601F5FF3FE7FFAD308F9E9F8 -E28F2FDBF3A3982C421318F63FE1FE7FCF02A0E3AD4DE5E0FF00514BB3EBF8D1 -CC164401318F63FE1FE7FCF0A231C75F5E95314E68294730EC8842631FE7D280 -BD3FC3E9ED536CE69427A669730880274A3663FCFD2A7294BB334730687C4BF1 -4BFE47BD4FFED97FE8A4A28F8A5FF23DEA7FF6CBFF00452515F1E59F70518A5A -315F5460251B7EB4B4629809B7FCE690AE7D69D45003367D28D94FA28B85C66C -FA51B29F45171DC66CFA51B0FA0FF3FE7F4A7D145C2E3367D29361F41525145C -2E30A7E149B0FB54945170BB23D9F5A361F6A928A770BB23D9F5A361F6A928A2 -E17647B3EB49B4FF009FF3FE7F94B45170B91ECFAD26CFF3CD4B45170B917978 -E99FCE9027D7F5A9A8A2E3BB21DB8FFF005FF9F4FF003D809F5FD6A6A28B8731 -0EDC7FFAFF00CFA7F9EC6CC7AFEB52D2D170E621DB8FFF005FF9F4FF003D8D9E -C7FCFF009FF3DA5A368F4A2E1CC43E58F6FCE8F2FDAA6C01ED46D1E828B87310 -6CC7A51E59F4FD2A7031ED46D1E829DC3988367D28F2CFA7E953ED1F4FA51B47 -A0A2E1CC41B3E94850FB0AB1B47D28DA3D05171F315FCBF7A4D87DAACED1F4A4 -0A051CC1CC401314BE59F4153ED1F4A368F4145C3988367D28F2CFA7E953ED1F -4FA51B47A0A2E2E620D9F4A3CB3E9FA54E063DA8DA3D05170E620F2F1E94BE5F -B1FF003FE7FCF6980C7B51B47A52B873116CC7FF00AFFCFA7F9EC6C3E87FCFF9 -FF003DA5C01ED4B45C398876E3FF00D7FE7D3FCF6027D7F5A96968B87310EDC7 -FF00AFFCFA7F9EC04FAFEB535145C3988847F5FCE9027D7F5A9A8A2E17647B3E -B48109A968A2E2BB23D9F5A361F6A928A2E17647B3EB46C3ED52514AE1723F2F -DE8087DAA4A28B85C66CFA51B0FA0FF3FE7F4A7D145C2E3367D28D94FA28B85C -66CFA51B29F45170B8CD83DA9760F4A7518A2E2B8DDA3FC9A5DBF5A5A314009B -7FCE68DBF5A5A3140098A314B462901F0F7C52FF0091EF53FF00B65FFA2928A3 -E297FC8F7A9FFDB2FF00D149457CA9B9F4F68DF1E3C2BAAC25A67BED2E4DC544 -57B66F9200CEECA065C76E4E78E9D2AD5FFC68F0BDA421E1BA9AF98B6DF2EDE0 -60C3AF3F3ED18E31D73CFE5F2E3F8E3C3C99D92BC8474251803FE7E9FF00D6A7 -37C48B357611A6141C831A0FEA7FA76AEFFAECD69A1E77B5F33E97BEF8F164A1 -0D86917370304C86E645876FA631BB3DFD318FCB0AF7E3CEA9F6990DB5958C50 -71B5240F230E39CB065079CF615F3BDC7C4385A30104D230ECEDB40FE7558FC4 -225085B6557C705A4E33DBB7F87F862F1937D45ED7CCF72B8F8CBE2692791D75 -1F25198911A4116D4193C0CA9381EE73C5618F1AEBFF00F41CD44FFDBDC9FF00 -C557927FC2757B24640F214918DCA0E47EBFE7F9322F18EA11A9DCF14A739CB2 -E08FCB1E9FE7B62F12DEED92E57EA7ADE83F12B53D197CAD2B58DA8A84085641 -2A202724846C81CF7C7735DCD97C7ED5D6756BAD3ACA687F8921DF1B1E3B312D -8E71DBB7E5F388F1D5F2000C707D76B7F8FF009FE4E4F1BDD82C563B7058E4E1 -08C9E9CF3EDFA7B554315282D18D4BB33EA24FDA0A23F7B4365FFB7ACFFEC957 -EC7E3B69B34A45D58C90A05C868A40E73E9860BEFDFF000F4F947FE133BE6230 -21FAED3FE356E0F185C004BA4527A05F971FCFFCFE9BAC64FB8FDA347D7107C6 -2D0A7911765DC6ACC0191A35DABCF5386278F615A9FF000B1FC3B8CFF681C7AF -912FFF00135F1D43E3928EBE65B6DE79657E83F2ABF1FC428BEE98E761F51FE3 -FE7F96AB1B2452A87D6FFF000B17C3C33FF130E9FF004C24FF00E26947C44F0F -374D43FF002049FF00C4D7CBD67E3DD36260CEC49F746FF0FF003FCB72CFC6FA -7CCC82368DE4238412FCDFF7CE3D01FF003D2D631F916A69F53E92B7F1668D73 -0ACA9A9DAAAB7412CA236FC55B0474EE2B42D2FADAFE3325ADC4573183B4BC2E -1803E991DEBE6793C4DE736121455C7F164E0FE9E83FCF4ACBA94FE6B1DC3E63 -D00181EC3D3FCFE17F5C4B745731F53D15F3869FE2AB8D2C36C9E5B40E46E7B6 -94C7BB1D32075EA7BD6947E339EE471AF5DC44F387BA61FD6B558A8BE81CC7BE -D15E45A5FC40D62DD1185DC57F084D8BE6A861C606772E093C773EBF874B61F1 -421688FDBAC648E40060DBB070C7BF0718E7A726B555E0C7CC8EE28AE7EDBC7D -A1DC3448D7A2DE4719C5C2140A719C16236E7F1FA56E5ADD437B02CD6F3473C2 -D9DB244C194E0E0E08F715B29296CC7724A2968AA189452D14009452D1400945 -2D14009452D14009452D145C04A2968A2E02514B45170128A5A28B809452D145 -C04A2968A2E02514B45170128A5A280128A5A28B809452D145C04A2968A2E025 -14B45002514B4500252D14500252D14500252D18A3140094B4628C500252E28C -518A004A5C518A3140094B8A3146280129714628C500252E28C518A004A5C518 -A3140094B8A31462803E1DF8A5FF0023DEA7FF006CBFF4525147C52FF91EF53F -FB65FF00A2928AF963A0F1C13E0FFAC23F0A912E571CBFE95E5C3E274C5B26CA -2CFAF9A7FC3E9FE7A1FF000B2D8E49B28B3FF5D4FF00F13FE7F9795ED61DCF07 -DA5CF54FB42FF7A8331CF04115E583E27153816698F5139FFE27FCFF0027AFC5 -461D6CA3CFA79BFF00D8FB51ED61DC14D753D444BC7714A2E42F76C57961F8AA -CA7FE3C631EE2623FF0065FF003FC9E3E2CBFF00CF8467FEDBFF00F63FE7F93F -6D14F71F3459EA69780746FCCD3C5D9ECF5E523E2C8500369A9FF811D3FF001D -A70F8B6BD469887D47DA7AFF00E39FE7F957B68F70E681EACB78EBDF3522DF37 -751F85793FFC2E1DBC1D357FF0271FFB2507E308EDA601F4B8FF00EC3DBFCF64 -ABA0E68F73D6BED9EC57FA7F9FE9F9482FF68FE227DCFF009FF3FA78FF00FC2E -1C018D380FFB79FF00EC3FCFF255F8C84633A70207A5C7FF0061FE7F95FB78FF -00570E65DCF635D57031B987D47F9FF3FA29D44727CCE7FCFF009FF3C78EFF00 -C2E703AE9609F7B83FFC47F9FE47FC2E951FF30A00FF00D7C9FF00E228F6F161 -CCBB9EDB1F886ED15552F2608A30144C4003D3AFF9FE5A96FE3BD4A36CB4A928 -C7DD75007D78C7A1FF003D3E7E1F1AC7FD0287FE049FFE2297FE175AFF00D028 -7FE049FF00E22ABDBC7BB1F39F495BFC4062104F6A09CE19E37E83D811FD7B76 -ED7ADBC6D6124A44AD2C2B8CEE74C8FA719AF97C7C6C03FE61583FF5F27FF88A -72FC6F00FF00C830E703FE5E7FFB0AA58A5DC6AA1F59DB6BD617610457B11DE7 -0A8D26189C918DA79FD2B4A3B996DD8BC72344C460943B78FC2BE3DFF85E6179 -1A5673FF004F1FFD854D6DFB415C5996F26C25877633E55D15CE3A67095AAC5C -3FAB82AAAE7D95FF00091DE903CC90B60F5185E3F0C55AB4F11C96B3ACF0CB35 -BCE324491B15619183C839F51F8D7C7F6DFB52EA76FB01D384E8A00DB24A39E3 -B9080FEB5A96BFB5C3A21F3BC32B23E7831DD9418FA6C35A2C5D3EE69ED51F6B -691F15B59D3C44A2F85E4499FDDDD286DD9CF56FBC7AFAF6F4E2BAFD27E33A48 -235BFB01C67CC96DA4C7AE308DF803F37A9F6AF8047ED789FF0042AB0FFB887F -F6AA51FB6114FBBE17707DB50FFED55BC71F18ED2FC194AB25D4FD2BD3FC7DA1 -6A042ADFA5BC9B37325C8316DE99049F973CF404F435ACBAB58BA865BDB76523 -208954823F3AFCC78FF6CF962071E1676CF5FF00898E3FF6955BB7FDB7A7B66C -C5E13911B18CA6A7838EBD7CAAE859A53EBFA97EDE27E977F6A597FCFDC1FF00 -7F57FC68FED3B3FF009FB83FEFE0FF001AFCE6B6FDBF6FEDD707C1A66006017D -4BA63FED97F3AD48BFE0A19B461FE1CC921EC46B183FFA22B4599D1EAFF32957 -83EA7E837F68DA7FCFD43C7FD341FE3562BF3D0FFC1439863CAF873247EA7FB6 -339FFC8155F52FF8287EBAFA6CD168FE0DFECEBD3831CB3EA0D344A7233BA344 -8CB7CA081F30C71D718A7FDA9875D47EDA1DCFD13A40CAC580209538201E87AF -F515F99137EDEDF11AE5834BA2E872B0180D25B5C138FF00BFF4DFF86EDF883F -F401D033FF005EB71FFC7BE9FE7A67FDAD408FAC40FD3AA2BF3321FDBDBE23DB -06F2748D0A2DDD765BDC8CFA749BFCFF002B107FC141BE28C0C5974DD049231F -BCB7B961F919A9ACDB0FD6E3FAC40FD2BA2BF3565FF82847C519E4DCFA6E81D3 -F82DAE107E4261FE7F4862FDBFFE255B0023D2BC3F1AE72552DEE403FF0091BF -CFF23FB5B0FE61F5881FA61457E6EC7FF051DF89B1312DA3F8665E08DAF65700 -7E930FF27F297FE1E4BF127241D07C2A39FF009F3B9FFE3FFE7F957F6AE1BCFE -E0FAC53EE7E8ED15F9C27FE0A51F1194F3A07858FD2D2E7FF8FD27FC3CB3E229 -CFFC483C2FEFFE8971FF00C91F5A3FB570FE7F707D629F73F47E8AFCDF3FF052 -CF88BD7FB03C2FCFFD3A5CFF00F24521FF0082967C4824E340F0B63FEBD2E3DF -FE9E29FF006A61FCFEE0FAC53EE7E90D15F973E26FF82807C5CD76F92E2CB53B -1F0EC4B1EC36DA6E9D13C6E72C779F3C4ADBB90386030A380724E49FDB9BE349 -CFFC56247FDC2AC7DFFE987F9FE59BCDA827F0BFC3FCC97898799FABB457E509 -FDB9FE3583FF00239907DB4AB21FFB429BFF000DCBF1ACFF00CCE87DF1A4D8FF -00F18A3FB5A87F2BFC3FCC5F5A87667EB0515F93FF00F0DCFF001AD4F3E326CE -3FE81563FF00C62AD59FEDABF1DF53121B3F125D5DECFBC20D1AC9F6E738CE20 -E3383F97E47F6BD0FE57F87F994B1117B267EAB6314BB4FA1AFCD9D1BF68DFDA -06F5B75EF8C934F4DC436ED36C647C638202C38C67FDA07835D95AFED21F13ED -E22B278AE5BA7273BA6D3ECC11EC36C207E9FF00D6C9E77875D1FE1FE675C539 -6B66BD4FBCF14BB4FA1AF8487ED2FF00134B123C45C7FD78DB7FF1AA53FB4B7C -4DEFE22C13FF004E16BFFC6BFCFF0025FDB787FE57F87F997C8CFBB369A369F4 -35F09FFC34AFC4DCE4788C63FEBC6DBFF8D529FDA53E269C8FF848803FF5E36B -FF00C6BFCFF23FB6F0FF00CAFF000FF30E467DD7B4D1B4FA1AF8507ED29F13B7 -13FF000910C7B58DB7D7FE797F9FE41FDA53E26FFD0C4013EB636A3FF697F9FE -47F6DE1FF965F72FF30E467DD7B4D2943FE41FF3DABF3F357FDA13E315C3349A -778DCDA1C1FDD3E9564E84E3819F2B2BDF3D7DB18C5711AB7ED59FB40E8EF289 -FC46EC880B99A2D22CDA3DA33F36E10F0383D707D8766B3BC3BE8FF0FF003309 -CBD9EE99FA73B4FB52943FE41FF3DABF2ACFEDB7F1AC138F18027DB4AB3FFE33 -FE7F921FDB6BE3673FF15801FF0070AB2F7FFA61FE7F93FED9C3FF002BFC3FCC -C7EB30F33F55369F6A5287FC83FE7B57E557FC36E7C6B0491E3007AF4D2ACFDF -FE98535BF6DEF8D6339F1873E9FD9367EFFF004C3FCFF27FDB343F95FE1FE62F -ACD33F55B69F6A5287FC83FE7B57E540FDB83E35E49FF84BFF00F293663FF685 -21FDB87E3573FF001571E7FEA1365EFF00F4C3FCE3F23FB6287F2BFC3FCC3EB3 -0ECCFD57DA7DA94A1FF20FF9ED5F94C7F6E2F8D40E478B5BFF00055643FF0068 -FF009FE437EDC7F1A79FF8AB4FFE0AACBDFF00E987F9FE4FFB6287F2BFC3FCC3 -EB30ECCFD58DA7DA94A1FF0020FF009ED5F94BFF000DCBF1A7A8F17FFE52ACBF -F8CD3BFE1B8BE3413FF238019F5D2EC87FED0F7FF3D8FED8A1FCAFF0FF0030FA -CD33F55F69F6A5287FC83FE7B57E548FDB87E34727FE131507FEC1965FFC63FC -FF0025FF0086DFF8CE7FE6725E4F3FF12BB2FF00E31EFF00E7B2FED8A1FCB2FC -3FCC7F58833F55369F6A5287FC83FE7B57E548FDB7FE339FF99D003EA34CB2FF -00E314BFF0DB9F1A483FF159AFE3A5D97FF18FF38FC8FED9A1FCAFEE5FE61F58 -81FAA9B4FB52943FE41FF3DABF2B7FE1B67E346ECFFC26807D34AB2F5FFAE1FE -7F9387EDAFF19CF5F1A1E7AFFC4A6CBFF8C7F9FE4BFB6B0FFCAFEE5FE63F6F1E -C7EA7ED3ED4A50FF00907FCF6AFCB1FF0086D4F8D1D7FE135619FF00A84D97FF -0018A53FB69FC66E73E356FF00C14D97FF0018A3FB6B0FFCB2FB97F987B78F63 -F53369F6A361C7FF005BFCFA57E597FC36A7C662723C6CC0FF00D826CBFF008C -D29FDB5BE330CE7C667FF05365FF00C67FCFF23FB6B0FF00CB2FB97F987B78F6 -3F53369F6A0A107A13F857E58B7EDB1F19C10478CC8FAE93643BFF00D71FF3FC -93FE1B63E341CFFC56233FF60BB2FF00E31FE7F91FDB587FE57F72FF0030F6F0 -3DAFE297FC8F7A9FFDB2FF00D149451F14BFE47BD4FF00ED97FE8A4A2B98F40F -828CCA3F898E3D10FF009FF3ED49F68518C6F3FF006CCD5A1A3EAC47FC7B15F7 -F2FF00CFF9FD13FB03542395DA475CAA8FF3FE7F0F9FBAEE7CCF2900994E080F -FF007C7F9FF3FA2891B1C46DF97F9FF3FA4C7C3FA8AE72F8F7F947F9E94CFEC2 -BDEF27FE3CB4AF1EE165DC68793B291E9914E1E69C6169ADA3DC2310651D3AEF -0334D3A5BAF59475E479B45D741F2A250B37A28EDC914E11CC71CA7E7557EC65 -73FBC1F8B934BE4E3F894FFC0A905A25AFB3CDFDE4FCE836F373F3A7E75540C7 -653EF9A559B1FC31E7D0D1663B2EC58FB34C3F8D3F3A3C997FBCBFAD44B7447F -CB38FEBB6A45BC973C46B9F68E9DA43B2144120FE21F99FF003FE7F277912FF7 -87EBFE7FCFE40BAB8FF9E607FDB3FF003E9FA53CDDCECC7800FA6C153EF0B4EA -47F6790775E3DBFCFF009FA70081C7F747E1FE7FCFD3897ED771D881F82D21BB -B8C7DEFF00D0452BC857433C9971D07FDF34DF2E5E3A0FF808FF003FFEAA71BA -9C9E64033EAC3FCFF9FCA379E427FD720F5CBFFF005AA9730EDE7F90E2AE3A90 -3FE0229B86EECBF90A6191FA9993EBB9BFC2A3271C6E8C9FAB7F85524C2CFB92 -EF207253FEF914865FFAE7FF007CFF00F5AA1F30E4FCAADF453FE7FCFE4F1216 -2310163FEE1AAB00A6E40EBE5FE5486F957FBA7FE027FCFF009F6E103301C5A3 -63D9314F552D9FF426FF00C77FCF6A2C896D8CFED303D33EBB0D07531C73F903 -561621DECDFEB91FE7B7E9520B643D6D9C7E3FE7FCFE9178AE8172836A67D48F -F809FF001FA7F9E89FDA67B37D3E53EFEFF4FF003D3523B1576C04753EF9A98E -929FDF65F4E7FCFB7F9E89D4A6BA05AE631D4B93F7B8F407FC6946A40F42DF91 -AD73A447FF003D9D7F2FF3FE7F261D263DA40B99BFEF8538FD3FCFF23DA531D9 -999FDA07B6FF00A806945FCA0E0097DBB7F5ABC74B551C4F2E3DE31FE150BD81 -1D0C8C7FDCFF00EB55294186A8885F4E0F593F3FFEBD385DDC1E37C9F9D21B59 -1738593EBB2986D6E08F9636FC50D1EEF61FC897CE95BABCBF9D2005872D20FA -D426CEEFAED007BA11FD6816B73DDA307FDD3FE34AE896CB220041CC8E3F1A5F -B14241FDEC9FF7D1A9EDFC29AE4EB1C89653189C065912DA4208EC471CD6ADAF -C34F105CDBACA96E42B67024C237E2ACC08E952E4975348C672DA3730FEC36C3 -9F324FCCD29B5B75C90CE78EE6BAB83E0F6BB346ACF7B6B6EC7AA3EEDC39C76C -8FD7FF00AD722F81F75242AD36B891CBFC4B1DB1603D39DE3B7B52E75FCC6AA8 -D77B43FAFBCE176C0A7A161EA4FF00F5E8C460F0ABF891FE35EA167F04F4884C -0D73797D70E9B4BAEF544723AF006403EC723D6B76C3E1BF86F4E99A5874985D -8AED2272D32E3AFDD72403C75C669F3C7B9B470955EF64788FDA113A88BF103F -C6B6ADFC25AE5D4CB1268B32B3743242635E99E598803F1AF74B5B5874F8120B -6823B68533B62850228C9C9C01EF9A9724F6FD2B373EC74C705FCD23C7AD3E14 -EB777117962B4B36071B2690E4FBFC991FAF6AE8EC3E0DE9F1F99F6DBD9AE338 -D9F674F2B6F5CE725B3DBD3A7BF1DF6E20F4A42C71C019FA54B949F53A6385A7 -1E97326C3C0BE1CD37CCF2745B76DF8CFDA079D8C67A6FCE3AF6C74F6E37CCCB -CFC83F2FFEB7F9FE557CC2A7A0FC3EB49E69F4FD3FFADEF59B57DCDE318C748A -B16FED00FF000FEA3FCF7A5371D7F763FCE7DAAA79A41E83F0A0393D852E5459 -6BED0A7F83F5A0CC3FB9FAFF00F5AAB076EB81F9D2EEFF00668E5112F9A0F6FD -7FCFAD2993AE33FAD45BB07A7EB49BBDA8B0EC49BF3DCFE7465BD7F5351F9801 -CED6E7D28F301E8ADF953B0B424DEC3B9A52CE3BE7F3E7FCE2A2F3307EEB0FC3 -DE80E181C2B7E2290F4286A5E1DD2F58DE6EECA099E4C16976ED90E318F9C61B -B7AF4E2B94D5BE1158DDB17B0B99AC1890761FDEA0007380486CE79C963DFF00 -0EEB7E1B9047E1EF46FCE7E53F9552935B194A8D39FC513C7750F84FAF5A9636 -F241789BC850ADB5F6F38243600E9D326B9CD4345D47487097C86D589655F353 -01F1D769E8473D457D0BBF073834BB81CF15A2A8CE5960A9BF8743E7358589FF -005E9FA53CC2EBD6E5063A74FF001F6FF3DBDE6E744D2EFA769AE34DB59E57C6 -E925B75663E99247A60565CDF0FF00C372C8F21D3143312C42BBA8E7D00381F4 -14731CF2C1BFB2D1E3A2203FE5E53F31C7EBFE7F91E59FF9ECBC7B8FF1F61FA5 -7A649F0A745689FCB9AE91F042B395600FA918191F88FC2B26EBE1214809B7BF -8259863092406353EB9218E3F2EDDBB2E65DCE7785A8BA7E2710410789071FED -0FF3E9FE7A0781912018E4648FF3E95D25D7C30D560452B1D95C127056295811 -C1E7E60BE9EBFF00D6A927C3AD5D22677D3A3DA83242CA09E39E00392783C0F4 -A778F5664E8D45F64C3326D3FEB40C73C629BE701FF2D471C8E055F1E10BFF00 -BC34A9C7BFD9E5FF000FF38ACC3676A5793113E809AB5CA66E0D6E8944A9B799 -C2E39E838A0CC83FE5E00FF3FE7F2F6AAAD636C7A6CFC0E3FCFF009FC19F6180 -9C71F837F9FF003F4AA4A24E8B745B1731FF00CFCA8A5FB4443FE5E947FC04FF -009FFF00555036108F6FF817FF005FFCFF0026FD862CE3771F5FF3FE7F4AE588 -69DBF32FFDAA21FF002F2BF91FF3FE452FDAE219FF0048527D81FF003FE47E19 -FF0060847FCB551F507FCFF9FC97EC70FF00CF507BE3068E58F71D91A22F2DFF -00E7BFE43FCFA0FF003D156FADF8F9F1E9FE73F4FCAB34416AB9FDF0CF7C8A0C -76A01FDF293F4A3923E634EC6AADFDB769338FF67FFAFED4A2FA0E319FFBE7FF -00AFED58FB6D48FF005AB4D2B6C380E8697B28F9873A67DF9F14BFE47BD4FF00 -ED97FE8A4A28F8A5FF0023DEA7FF006CBFF452515F447D19F15C66F5FF00E594 -E7EB363FA7F9FE4F36B72C3FD4383DB74B9FE9F4FF003D2BC7A6EB657F797E17 -DC1A9D349BB19F3B547527B06AF99708AEC791EEF51C34D9DF831E07BB9FF3FE -7F25FEC666FF00964A47BB1A7A69B1E079BA8CCDEE1AA65B6B08BEFDC4D277C1 -7FF3E959DD225B876201A1A1FBD127EBFE7FCFE49FD83163EE463F3FF3FE7F2B -61F498BF81C9F52FFE7FCFE8EFED5D322007911FFC0989FF003DFF00CF4973F5 -31935D8A2743848FE01FF00FF3EFFE7A31B458578C2F1E898FF3FE7F0BDFF092 -69F18388A103FDDCD45278C6CE3071B01F4098A8E79FF2B317AECBF02936911A -67F7478F418FF3FF00D6A69D3D57810B1FCEA49FC736BBB97381D303FCE3FCFE -1464F1C5A1EACD8F61FE7FCFE873557F649F443DED18702DCE7EA7FCFF009FCA -AB42F18DCB1051D32C33FE7FCFE0C93C6D6C4E006C7A853FE7FCFE54E6F185BB -FF00CB390F1FDDADA3ED1EF11352E88B465981188E3FFBE454125E5C2F022887 -FC005566F1442467C97E7FD8FF003E94C3E228CE711B7FDF3FE7FCFE9D3184DF -D92942A4B6448F7773D9507D13FCFF009FD216BBBA2A71B47BEC3FE7B534EBA8 -4E42BE08FF003FE7FC84FEDA87A98DC9FA9FF3FE7F2E854A5FCA1EC2B3E827DB -2F50E565D9EE108A69BBBC618F3DBFEF834A355889CAC0DCFF009FF3FE70F5D4 -538C438FA8FF003FE7F4AF66FF00949746BAD2C406E2E8FF00CB793FEF93FE7F -CFB530B5CFFCF693A7F74D5E17FF00F4CC67D42D584BC8F1CA1FA7F9147BCBA0 -B92AAE9F918DBAE57FE5A487FE014864BB1FC528FF00808AEB2C2C2EF5288CB6 -BA75D5CC4A76992184B8071D32075E9FA56DDA781F55BA85645D266C13C091D2 -33C1EE18823A7A7FF5B295571DD2368D3ACF68FE079B79F7C3F8E461E871FE7F -CFE4D3757CA78DD8F7FF003FE7F97B2DBFC2ABB9234764B48C95076B48DB97A7 -070B8C8F6F4AD787E10D88914C973BD01E54458247D777150F116DD23A161F10 -FECAFC0F051A85F83D547F9FF3FE7A39755BC52327F25AFA2A2F849A26E53E5C -AE01076991707DB8FF003F971A317C2DD0A3955D74C877290C374848E3D416C1 -FA1F4AC5E217636583AF2DEDFD7C8F9A575CB95033BBFEF8FF003FE7F4993C45 -32F2770FC07F9FFF00557D34FE08D194E5B4AD3F1FF5EB1E3FF41F63FE7A6979 -400FBC49F7FF00F552F6D17D0B5829AF8A56F91F378B6F11A9FF009026A80FFD -79C9FF00C4FF009FE5BABE0CF188E7FB2DB8E98B987FF8AAF732157A93FAFF00 -851BA3EEC47D7FFD5FE7F94FB45D8E858382DE4CF261F0CBC47FF3FD643FEDAB -FF00F115A9FF000AA6E40CFF006FB63D7ECDFF00D9FB57A2EF8C004124FB534C -ABD8127E953CEFA1AAC353FE9B38E87E16D908904BA9DFB4800DCCAC8A09E324 -0DA703DB35A29F0FB4448911ADE4959460BB4F202C477382067E80574025EE14 -FE22977139C2F1F4A96DB355460BA19D1F867498A248C69F68CA8028DF12B1C0 -F524649F735A31C6B04691C6AA91A00AAA830001D001DBA52EE2A7214D1BF049 -31B1EFC607AFF9FF003C4EA68A296C2F3EA3F3A395E78FD7FCF6A7061FF3C9FD -BE71FE7B0FF3D24503760C720FF812D05597720DE7D87E2690B1FA55968F1C80 -E38E0975FF003FFEAA611263E570BF57FF003FE47E4C69220C9F5229039F7A7B -19571FBC07FE0678FF003FE7DA36B9707E66E7FDF3FE7B1FF3D15FC8761FB88A -4F31BD07E66A25BBDC71B49F53FE7FCFF499599BF83F0C0FF1FF003FC8BADC41 -BCFF00934A1BA73FCE9FE4B819F28E3E83FC6A26053AAB67D303FC680B120507 -F880A5545F553F9D566B8443F3061F863FCFF9F7C21BB8B9F958FF009FF3FE73 -81BF324B7843DC0FC3FF00AF48428E3711F4154DAF231D15B8FF003FE7FCE1A6 -F171C29CFBFF009FF3FC969DC0BB81FDF346DC7F1B7E5FE7D2A87DB5867200EB -DBFCFF009FD1E2EB3D5C03FEE7D7FCFF009E105CB981FDF228E01C6E271EC7FC -F6AAE2F1573F3AFE31FF009FF20FE0BF6F4518C29F5F94D3B816001FDEFF003F -E7FCFA1C0EC78F73FE7B0FF3D2A7F6A153FEA97F0247F9E9FE71C4A9A92B0C18 -D463D58FF9F5FCBF25743BA2C029DF23DB3FE7DBFCF4783111CEE53FE7DBFCFF -002892E430FF00551E7D779FF0FF003FC8DC707F751671FF003D3FFADFE7F902 -1E23849FBE07F9FF003FE7A2F9311190FF00A7F9FF003FA5673203FEAD47D1FF -00FAD5034B3007111C8FC47F9FF3EB81E83B97FECC0F4208FA1FF3DA99F66181 -9D9C7AD5317770AD9F287E287D7FCFF9E8BF6C918FCD12AFBEC3FE7FCFE53762 -D3B967C941D42F1FE7FA527D9D17F8178F6FF3E95009B7FF00CB68D3FDE523D7 -FCFF009E2616CCDC8BA887B107FC29F3025E62FD9631FC0BC7F9FE9FE7B1F654 -18C44BEA38FF003E8290DACEA72B2A1C74C123FCFF009FC1AC2E63072A723B07 -3FE7FF00D5F909A6165DC905A27FCF11C7B0E3FCE3F4A4FB1A7188978E463FCF -B542D7B383CA49C770C7FCFF009FC982F9D9B90FBBFDF3FE7B7E9F9174B70D0B -1F6341FF002C80C73D7A7F9C7E94D3669C623C7A60FF009F6A8FCE2F8CC721FF -00817F9FF3FA3C1661C41267EBFE7FCFE94985914E7F0CE9D773349369B6F34A -7EF3C91066F4E491FE71ED542EBC01A25EC81E4D3110818FDD33463F25207E35 -B7C93CC7228F5C1FF1A50CA3AB48BDFA1A7ED2DD4870A6D6A97DC7297BF09F45 -BAD9E5C57367B739F26627774EBBF774C76C550B8F835A7B42CB05E5F472E3E5 -772ACA3D780A33DFBD7A02185464CD281F503FA7F9FE4FF3A051FEBA6FA6F5FF -000F6FF3D97B597432F6149FD947964BF04A408E535793780768684819EC09DD -543FE14BEAD9FF00908443BF57FF000AF6092F21423123F1EAC3FC3DBF4A89B5 -2500E093FE7A7F9FE9C5FB59D89786A5D8F1697E11EBE8EE177B85270CB20C1F -CCFF009FE5467F86DAEC129468AF091FDC8CB8FCC020D7B89D5242D9DA07B938 -FF000FF3FA2A5FCCFF00DDC0F46FF3E9FE7B2F6933278483D99F3E5FF83F51D3 -36FDA9EE2D77676F9D1ECCE3AE3239C7F9F6A0DA24AB9FF4C3D38F947F9FF3F9 -7D331CACC3E603F093FCFF009FD0BAB0B0D4E011DE5A43748ADB824D87507A67 -047A67F3AA55A4B73196053DA47ADFC52FF91EF53FFB65FF00A2928A3E297FC8 -F7A9FF00DB2FFD149457D51E81F1AB5CA1E4FF008546F3AE08DA07A5554B299B -1F29FCAA75D2A6603E53F8F15F21CB6EA783EC90C7981E981F8FF9FF003FA42C -D9FE2AD28F41958F43F80A9E3F0DCADD8FE54AF142F62BCCC068549E9C5466DC -90485FF3FE7FCFA7591F85989EE066A78FC2A33F330A975621EC23D8E15AD720 -92A38F6A8DAC571CA11FA7F9E9FA57A2C5E0F2E84AA3B8CE32AA48FD3FCFF4B0 -9E0C92400AC1CFA1700F7EC7E87FCF46AA47B07D5A4F64796B6971E3FD5FE63F -CFA7F9ED19D241FF009663F2AF608FE1FC8E80F996E848C9525B23DBEED692FC -35B0F314B5F48E80FCCAB08524679E4B1C7E556AB35B44A583AAF647867F6480 -73E5FE54C3A3B93F2AE3F0FF003E83FCF4FA0A3F87BA2C32ABE2E2551FC12CAA -01FC803FAD5987C27A3DA485E3D3EDC9231FBD2641F93123B75AD56226BA1A2C -0D57D523E72FEC2909E98EDD3FCFF91F959B5F066A17B1992DED2E278C1C6F8A -26600FA640FA57D1B05ADB69FBFECF1DBDAEFC6EF2630BBB19C671F8FEBF83C3 -C6CC019598E7B0FF003FE47E57F5AA9D8DA38197599F3FC3F0BF5AB888482C5D -14F41232A30FC090474FD3F2D383E0BEA9246AC66B58C919D8D23657D8FCB8C8 -F63DBF2F6F48206C1F9B3F41FE7FCFE527D92D9BA83CF1D7FCFF009FA52FACD6 -66F1C1C16EDBF99E516FF01E1F36332EAAED1023722C41588CF38258E0E3A1C1 -ED5BD65F04B40B69D656371708A3FD4CF78A15B8EFB114F1C7423A0AEED6C2D9 -8E7A1F5CE2A74B0848E1C8007663FE7FCFE594AB567BC8E88E1E8AFB3FD7CCE6 -6C7E18E81A7CAD241A4DA3B11B712C8F380320F47C8CF1D7AFEB5B363E1D8749 -F33EC3616F69E66377D9EDC26EC6719C019EBFCEB4869409F965E3FDF34E6D3D -C706E140F4DC4D61ED24F797E674469C63F0C6C55304BFC4AC3FE0005466DF9E -64DBEE4AFF009EDFE7B4ED079647FA44647B29FF003FFEAFC98678E3E1A407BF -0BFE7D29DFCCA6990AD8C24F33A93EEC7FA7D3FCF69459A2A8DAD1B7A005BFCF -F9F6A3FB5ADA3FF962EDF90FF3FE7F07FF006EDB28C2DAB67A72DFE7FCFD38A5 -DEE34D21A6071D230DEE3351B8911F06151EE58FF9FF003F913EB4B267F758FF -003FE7FC8E2A497C5BA2E0FBFD3FCFF9E8FE60DC7A16B7803E65507EA6955E1C -90F2EDFF0077FCFB56649233B12491FE7FCFF9E8D2383C73FF00EBFF003F87E4 -737626E6B79B69FF003F127E83FA7F9C5299ED7FE7B4A3EA7FFADF5FC8FE1900 -7CDE9EE78C73FE7FCF49E38E1FE26073FE7FCFD3DB87CCD93B97FED76E011E6B -FE3FE7FCF3E9C31EEA2FF9ECE3F03FE7FC9F4E235FB329E7683F4F4FF3FA54F1 -AD9927E453C7A7F9F4A8B2DC2C4064898604CE48FF0064FF009FF3EDC3542023 -05C9F743FE7FCFE5A31C56B8383B7FDD5FF3FE7F49D2DE23C09DD7E8B8A9BD86 -919204A08290EFFAC59FF3DBF2FCA5864B8006608D40E9FB91FE1EDFE7B6B7D9 -0E3E5BA9873DB8FF003FE7F089F4E949F966908F53FE7FCFF2CB9937A9AF2904 -6E33F3AC6B8FFA663F2FF3FF00EA9D7EC6412C5010380100FF003FE7F0ACFA25 -C9FE3C9C75DDFE7FCFE90B681701B73107D48233FE7FCFD2AEBA304DAD2C5994 -5A0FBA81B1E831E9FE7FCF156448F9DB064FD7FCFA0FCBF2069AF1F059B8E383 -D3FCFF009E9C0220BD59C9F5FF003FE7FA6AACD6E437E457E5381680739EBFE7 -FCFE88D2C8A48580291C7F9FD3FCF49C98DD78697D39C8A430073C338FC6AAC4 -A2B1BD991B9017BE36FF009FF3FA598EF71D4A83F4E9FE7FA7B534E9AD272092 -7AE7FCFD3FCE381747939C8CFE1FE7FCFE8B50B32DA6A2A060CA001EF52B5FC0 -3BC671EB9FF3DBFCF6A1FD9AAA7255BEBD3FCFF9F4E17EC708C831B67BFF009F -F3D286AE3D4B4DAAC6BC6C808A826D5B048FB3C0D8F4047F9FFEB7E5135BC20F -11383D47F9FF003FE11B5B211C42FF00E7FCFF009C70B942E39F530FD6DA21F4 -CFF9FF003F9426E9474B78C63A707AFF0091FE7B23DAB03F2C6DF5FF003FE7FA -37ECB2907F7673EFFE7FCFF25625EE4F15E44AC375BC631CF4E07F9FF3D38B71 -5DDAF1BA080639C94FF3FE47B719A6D25073B0FD7B8FF3FE7D8FB24BCFEECE7F -0FF3FE7F27A8236967D371CAC0847A213FE7FF00ADF935C5812312C0B8F4888C -7F9C7E95906CE6073E59FAFF009FF3FD0FB1CC41FDD9CFE1FE7FCFE52D3EE55D -7634B6590076CF10C7FD32FF003E9FA7E4E0B6C38F362EBDA1FF003E9FE71C66 -0B5B853C21C7F9FF003FE789425D28FBA49F7C7F9FF3F9167DC6A49742F06863 -E8B137D233FE7B7F9ECD3731AF0B6E83B709FE7FCFD2AA8378A78538FF003FE7 -FCF0E57BD00FCB93EF8FF3FE7F2BBB0E761F6C20F16F8FA20FF0FF003FC98D77 -291F2C583FEEFF00F5BFCFF2984B760F31E47F9FF3FE7878B8B9031E5647D7FC -FF009C7E0C8B9545D4C0FCD19F5E011FE7FCFE0D3724E331B01D39761FE7FCFA -717FCD9CF583F1FF003FE7FA308720E60C11DBFCFF009FE827AEA1A9555D1F92 -AA39FF009EA78FF3CFE5F92ADBA13D153E8FFE7FC8FC9EF6AEFC980E7AE41FF3 -FE40FC2092CA4E711153CE47F9FF003D3F006585B25FF9E857E8FF00E7FCFE8E -166BDEE1C7D1AA81B6914FDC3F5FC7FCFF009E8D68D9739520FB8FFEB7F9FE4B -611A5F625EBF696FC4FF009FF27F243048338B91F8FF009F6FF3DB39622CDC63 -EBDC7F9FF3D389059B91DB3EFF00FEAFF3FC8DF60D4B9E54E3A5C27F9FF3FE7B -465663FF002DE3FF003F87F9FE510D3E5278DA3DF3CFF9FF003F40E9D3007E50 -4FB7FF00ABFCE3F27A80F78A6192D2A71DFD3A7F9FF3C44C93264F980607186C -7F9FF3F80D632A9CEDFC47F9FF003FC98D6D20CFC9CE71FE7FCFFF00590C7ADC -4A9D652BFAFF009FF3F84BE7B9FF0097923EABFE7FCE7F0ABB0E727E51D32463 -1FE7FCFB3D6DF77F12FF009FC3FCE3F25A88B0096CFF00A520FAAFF9FF003FA0 -D181FF002DA16C7AAFF9F4FD3F28858B13C3283EBE9FE7FCFB3869CE7F893F3F -F3FE47E4F518B9DA7FE5DF00FA7F9FF23F2634A57FE59C3EA303FCFA7F9ED27F -65C99EAB9F51FE7FCFF206992672081FE7FCFE5F91E82BA2BB4C0E3F76831CF0 -3A7F9FE9F926D2C78551DC7247F9E9FE71C5B5D3A75E430EBF97F9FE9F93C5A5 -D2F523F1C7F9FF003F9203D87E297FC8F7A9FF00DB2FFD149451F14BFE47BD4F -FED97FE8A4A2BEC483C02DBC0D33C61FECECA0E787C03DFB120FAD68C7E060AA -0968D73CE09231FA7F9C574A3ED4FD23DBF51FE7FCFE81B5BB3D703F2FF3FE7F -2F8AF77ED48A587A7D998F1F83AD632332F4E0809FFD7AB4BE16B057CEE76C76 -E31DFD3FCFE556CE9F73C932807EBFE7FCE298DA64E4E4DC631E9FE7DBFCF69B -53E8CD552A4B6891A787B4E43BBCA24E31F3723F5A78D2ECA1CF963667AEDC0A -61D39D7FE5AB37F9FF003FE7A1F630A7E62C715A28C7A0ACA3B46C35ECAD0F39 -62473927FCFF009FD233696A9D88C1FF003FE7DBF2936443D4F6A4F3221FC00D -5A44DEE4262B751D0F1E84FF009FF3F9309B553D1B83EFFE7FFD5EDC4E6741FF -002CF1F414C6BC0318889FA0FF003FE7F4761598C26DBFE79BF1EDFE7D0530F9 -3FC30371D323FCFA549F6D38E226FCBFCFF9FD145E3118109FC47FF5FF00CFF2 -9B30D595D8203F2C18C7B7F9F4A8DA3E788B69EDC77FF3FE7D2E1BD71FF2C739 -FF00647F9FFF005FE4BF6C7231E48C7B81FE7FC8FC128B7BB2B97BB338DBBF61 -8FA0E9FE7FCFB208645E8B9C74E3BFF9FF003E9AA2E5FBC680FD28F39D873B6A -B93CCB508AFB466ACB3003E5C7E1FE7FCFE8A6E6E1491DFE87FCF6FF003DB430 -1FABA8FC29A618C8FBE3FCFF009155627DD281BBB81D588F5FF3FE7FC1A6EE63 -9F9CFE5FE7D3FCF6BA6DE22738E7FCFF009FCA811A2FDD4FF3FE7F952B317A14 -0F9CE79DC7FCFF009FF3D13C9909FBA7DBAFF9F4FF00238D1DCEA7023C8A7ABC -83AA01458563305BC9C610FE1DBFCFF9F65FB24B9FB840F6EDFE71FE7B6BA48D -9E703DCFF9FF003FCA74319FBCC339A8BA4249B31E3B729D61638E7A8E3FCFF9 -F69946CFF9619C7E1FD7DBFCF6D80F66A397C9A1AF2D101C75F6158B927D0D12 -33E3B80839B40C47AFE3FE7FCF0F6BC20616C947E1FE7DBFCF4926BF840E3A01 -DF8FF3FE7F0AF26A2074E08F7FF3E9FA7E5568F606DA18F348C4FEE140FC3FCF -F9FCA37498E71180714D935376C8519F73C63FCE3FCF60DE5C3AFDDE7DCFF9FF -003FA68A289BB18B6AE5B7381C761FE7DBF4FCAC2204E08C0A8B75C337551EF9 -FF003FE7F44F2676E09FF3FE7FCFA5592E822FC572917607F0AB4BABC512E42A -8FF3FE7F2AC46B199B966E7D7FCFF9E3F2516000F9BF1C7F9FF3F9625C13E835 -26B635DF5E519C05E3FCFF009FA1AAF26BAFC8040FF3FE7F5FC2A8B78D4E7680 -7E94E11C2A46540FF3FF00D6FD28F669741DD83EBD367A9F7C1C7F9EFF00E7A4 -7FDB131E02FB7A7F4F6FF38E25DD6A83EE8CFF009FF0FD2A3335B9048033EBFE -7E94EDD89BB106A52E3EE0E3FCFF008FF9E87F68CBFDC5F4EBFF00D6A634D083 -C0C7E1FE7FC8F6E217954F0076FF003FCBFCF68B4897745AFB7CB8C6D51EBFE7 -1FE7F9392EEE73C003E9FE7FCE3F2A313319318CFF00FAFF00CFF9E9750703BD -09CAFAB2E37EE4DE7DD31EA33FE7FCFE1F93964BB239217D3FCFF9E94E8622C3 -27A7AFF9FF003FD2F450B741F4E07F9FF22B4E6B6ECE88A9357E628892E5064F -1EBFE7FCF4A537327F1367F0AD26B3665C9E73D8FF009FF3FCA1934C2DC81834 -9D48F70716FED147ED607DE1F90A6B6A31038E9FE7FCFE5F9587D29F1C1FCEAA -CBA331EBF9FF009FF3C7B707345ECCC5C2C31B514ECDFA7F9FF39A8DB502410B -9DDD0707FCFAFF009E922696D1E0F27FCFF9FF00238956C8A80A78C7AD56867A -149AFA72C40CFE5FE7FCFE8D37D71CFF0081FF003FE7F2D35B6EF81522C2AA46 -547E3F5A480C9FB65CFA1FFBE7FCFF009FD13ED775EFFF007C9FF3FE7F2D9F29 -36E428CFB7D3FCFF009E8C2AABFF002CC67BF140B43356F67FE256FC01FF003F -E7F2B0974EDD8FE22A62EAA33B00A619C0E8B4D0F7E8489704F6E3E952AC80E7 -23F21548DF2A67E5C0F5C714F4D42376E393E98FF3EF4BD056EC5C2739C60FBE -3EBED4C6908FE1EBD38A896ED48E00A7F9E87AE28B30D46B5CE0F2BFA542F77B -7F84FE1563F76C3EF73EF513C4A7B8A7A068576BE4271B88FAD0250E7890FF00 -9FFF00552C902F278E6AB3DA0032A7E6FF003FE7FCF06A914591164FFAE6FD28 -368AFD663FE7F0FF003FCA83C4E9CE78F507A7F9FF003ECC248F507FCFF87E9F -92B8AE687F66C671FBEC7E3D3FCFF87E0F5B00872253C7BFF9FF003FA66B48D9 -E58FD49F7FF3FE7A2F9AE3F8DB3F5FAFF9FF003C2035D6DB1FF2D726A68E03C0 -DF8C7F9FF3FE718A2EE443D78F7EBFE7FCFD245BF71DBEB8F4FF003FE7D1DEE3 -375615C72D8FAFF9FF003FCA4167039E5BF2AC11A9BAF51FE7FCFF009EB870D5 -A41D8FE7FE7D3FCF686AFB31A696E8DB7D2EDDBF8C8FAD5797438DB90C38E7DF -FCFF0087E59FFDB520E4E7FCFF0093FE7A3C6B6D8E41CFB0FF003E9FE7B34BCC -D138751F2688C9921B1F438FF3D3FCF6ACFA74A8321D87F9FF003FE7A595D5C6 -7938F7231FE7FF00D7E9C4A9A9231C1504F7EDFE7FCFE15CBE63FDDB329A09D3 -8C9F4E0F4FF3FE7DA32D32F771E9C9FF003FE7F2DBFB540FD53273DBFCFF009F -E4C22DDB9C60E7D7E9FE7FCF0EC4351E8CC81772AFF19FF3FE7FCF67FDBA71FC -5F9E7FCF6FF3DB48C16DBB3C7F9FF3FE7B37EC56C7D3A738A4433D6BE297FC8F -7A9FFDB2FF00D149451F14BFE47BD4FF00ED97FE8A4A2BEC0CCF376D6E319E9F -97D6A23AC6EE8185666F863190A07F9FFEB7E94DFB6C6AC30B93EC3FCFF9FD3E -33922BA1D3ED0D5FB7B3F45CFF009FFEB7F9ED224AEF9C0E9FE7FCFF009C6625 -E3F64C0EB922A78EEA638DA3A73FE7FCFF00F58E66B634551F53496290F63FE7 -FCFF009ECEFB264F200C5558669980F988FF000FF3FE7D2C46AEE066B3739F56 -5295C1AC10027A1F61D3FCFF009E9511B48FB1FE95685B9EED8A77909EF52A7D -D8AD0EA5336683B11FE7FF00AD4D36D12FAD5E3082300E2986DD73FF00D6AD55 -5885A9F6293470A8E86ABC8E80FCAB8C7F9FF3F4FCB41ED73D7803A7F9FF003F -E101B02F9E3FCFF9FF003E95ED22C9928F4467BCBCF000150BDC6DF527D00AD2 -6D388F7FF3FE7FCF44FB085EBC7F9FF3FE4715CEBA18EDD0C56BA9327008C727 -8E9FE7FCFB303C87A97E4E3BFF009FF3F96E359A8FFF005527D95738345EE499 -2B2EDE02B1C7B7F9F4FF003DA5FB4A8EC4FF00C04D681B78C0CE39F5A69897D2 -9A62BD8AAB72491F211F87F9FF003F4E255B861FC207E14A507718FF003FE7FC -F46107D298F463848CD4A1598F5C7D2A222419DA31EF48B1CC7D3F2FF3FE7F47 -B0137919EAE298F6AA4F2DF88A72C1263BFD6A74B727A9C7E1FE7FCFE99B61A9 -49ACD7FCF6FF003FE7A70C36A0763FE7FCFF009C71B515A210323FCFF9FF0023 -B585B3813B566EA25D0D3919CBBDB118C2F4F4FF003FE7F9305A499FBBB476F6 -FF0038FF003DBAB7FB3AE3E5CE3D2AACB344A78078EC4FF9FF003FA2526FA09C -52EA63C56C506318C7F9FF003FE713AC78C71803B54D2CA8090A07D71FE7FCFE -959E623DAB5526BA1362C281DCF4A955D00E4F35912DD9070BF99FF3FE7F9446 -790FF11CFF009FF3FE7877B92D1B4F329E41A85E51D73594667CE771FAF7FF00 -3FE7E885D8F5249F7FC7FCFE1F91748342FBC8A38CE31CD549A4EBB7A76FF3F8 -7E9F9444907A91FD3FCE3F4F6E108E0F1CFF00FAFF00CFE1F90DDC1EA1D3DB1F -A7F9FF003EC608E9C63A75EBFE47F9ECF58598E40C76CFF9FF003FD1E2D5987F -F5BFCFF91F924AE043D3DB1FA7F9FF003EC608E9C63A75EBFE47F9ED64591EB9 -C1FE5FE7FCFB3C69F9C649C9EBD3FCFF009FC9D80A8AC50E4718FF003FE7FCE2 -4170EA31E9D38FF3E9FE7B591A6E0E4E49FCBFCFF9FC17FB373FFEAFF3FE7F45 -CA1720FB6B0CF18FC7A7F9FE9F93FF00B4655E9FCCFF009EDFE7B4834D19CF39 -F6E3FCFF009FC14E9A3EBFE7FCFF0091C2E51DD8D5D62740064803D0FF009FF2 -3F2906AF31EA4FA73FE7D8FF009E8D1A68CE79CFE5FE7FCFE01D3003820FF9FF -003FE71C2E51F33EE4C35123AB01FE7FCFE5ED527DB8F1923FCFF9FD2AA1D3C0 -20F3F5E9FE7FCFE09F63C63AFF009FFF0057F9C0C5DBC85A9785D03D47E94F37 -69CF1FCBDEB2DAD7818247BFF9FF003FA621685D7A6739E3FCFE5F97E401B46E -E3E78FE5EF41BB4E78FE5EF5824B2F19207F9FF0FD3DB891173DFF00CFF9FE5E -DC1E82D0DA3769CF1FCBDE91AE90E4F4FF0026B316D81C649F7C1FF3E9FE78C3 -96D063927F0FF3EDFE78C03B175E64278A85A453F8D345929238C7D0FF009FF3 -F4E17FB390FF0008FF003FE7F9552D034444CE9D3207E98FF38FD2AB48AB9F97 -803A7B7F9FE9EDC5E3A70EBB71EE3FCFF9FC2A26B01E9F5CFF009FF3F80C2B5C -5B948315C8071F4FF3FE7F0E1E8CE4F0C41E9D3FCFF9FA713B5960F1C1F5FF00 -3FE7F4C466D1979079FF003FE7F0FCA5A760B0F8C4BFDF23B74FF3FE7F49024A -47FAC238F4FF003FE7F4AD99213D3804F3FE7FCFE5C3D2ECA8E4127FCFF9FF00 -3C3D0699604329FF00969DBD071FE7FCFB06CA423873EC08E9FE7FCFB44B7BB4 -739E3FCFF4FF003CE1E351C7AF1E9F8FF9FF003C3D03710D949FDEC7F4FF003F -D3F28DAC9F271F87F9FF003D3F2B0752F5248F5C7F9FF3FA34DFA9E4E41FA52B -2158AC6D1D7A7E9DBFCFF9F66185D4E36FD3EBFE7FCF1C5B6BD5CFFF005B1FE7 -FCFE11B5D03C638EFF00E7FCFF0081643D0AB8DBED8FD3FCFF009F630474E31D -3AF5FF0023FCF699E556C92B83EBFE7E9FA7E51360F41FA7F9FF003FA2109D3D -B1FA7F9FF3EC608E9C63A75EBFE47F9EC1E0E7A7BF7EBFE7FCF408E0F1CFFF00 -AFFCFE1F9001D3DB1FA7F9FF003EC608E9C63A75EBFE47F9EC1E0E7A7BF7EBFE -7FCF431C1E39FF00F5FF009FC3F2003A7B63F4FF003FE7D8C11D38C74EBC1FF2 -3FCF63041CE3A77EE3FCFF009F65D84F01493E98FAFB7F9C7E4009923BE3FA7F -9C7E9F9296619E4FEBFE7B7F9ECA22727214FD71D39FF3FE7A0626C7DD209F51 -FE7FCFE8009BDBFBC47E3FE7FCFE86F719C311DBBFF9EDFE7B2F94E4F0A7EA3B -7F9FF3EC189B1F74827D47F9FF003FA007B87C52FF0091EF53FF00B65FFA2928 -A3E297FC8F7A9FFDB2FF00D149457D89078CA5B28209C923FCFF009FF389D635 -1D00150AC338E78CFA9FF3FE71F94AB04C3A9FC08FF3FE73F87C7A68D7D49942 -8C1E01FF003FE7FCF132B2AF02AB882451C83F9548B0B8C0E47E14F460D5F52D -C728539E3AFE5FE7FCFB584B9E833C7B7F9FF3FCA92DBB91D31FE7FCFF009E93 -240E38CFBFD6B370B8D7322F24EAC39C83E9528607A5678465C0FD476FF3FE7D -94BC80727F4FF3FE7E9C64E9334BBEA8D0C814332A8C9E07BD671673C93F88E3 -FCFF009F4E02EC4F247E5FE7FCFD385EC58B9BC8D06915464F4A63CEABEFF4AA -04B0190707DB8EDFFD6FF3D9BD09069FB2EE4B9762EBDC803A67FCFF009FCBF2 -81A6F9B80303A63F0FF3FE78AECFC631F8D319C915A2824439B64AEF9E09E9DB -FC8FA7F9E885979C7F2FF3FE7F4AC4B77CFF009FF3FE7B31B70E95AA88B72C99 -179FFEB7BFF9FC290CABF4FAD5321BD48A88C7211F7C83FE7FCFF9E0B058BE67 -4A699D39C0ACF6B7727FD61FAFF9FF003FD1A6293FBEDFE7FF00D7FE7B2B20B1 -A7F6851FFEAA4FB481D8565B238CE5C9F7CF4FF3FE7D98C6419F9CE7EBF5FF00 -3FE78340D0D8FB4AFF009147DAF1E9588D23E4E58FD4F5EBFE7FC8E1E8CCE46E -66233D33D7FCFF004FC93B2048D9FB691D33FE7FCFE8290DDB30EBC7D3FCFF00 -91F9518CF1D727D6A456DA6A799762EC582E4FB7F9FF003FE7A1E5B39E339FF3 -FE7FCF091DC2AF0541FAFF009FF3FCAC25E20F41ED8FF3FE7F45CED6C0A2BA95 -FEC721EC690E94EE3EE91FA7F9FF00EB7E5A29A9228E801FF3FE7FCF0AFABA76 -03D6B273932ED1EE639D2768E878E7FCFF009FFEB30E9C17B118E7AFF9FF003F -4E34DF520738C7E03FCFF9FD2BBDEB1ED83EBFE7FCFF00469CBA89A5D0A06CD5 -71D47E3FE7FCFD386FD900E87A74FF003FE7FC2CBCE07A0C542F32A83EB549B1 -59752B4B1F97ED8FF3FE7FCE183E53D381FA7F9C7FFABB3A472C79E3FA7F9FF3 -D38458F776E7E9FE7FC8FCB4443268E609C7403FCFF9FF0038985C2AF4E9F97F -9FF3E9C565832C3F9E3A7F9FF3ED2ADA29EBD7FCFF009FF3C526D01616E54752 -3FC3FCFF004F6A78BA0BFC4063DFFCFA1AACB66B9C91F8F4FF003FE7F070B152 -3919CFF9FF003FFD618AD43D4B3F6D001E40FAFF009FF38A537C07751F5FC7FC -FE155FEC29C1DB8FA7F9FF003F85235927F771FE7FCFF914ADE42B22737EBEA0 -7F9FF3F91A537AA33C8FCFEBFE1FA555FB1AA9E9FD0FF9FF003E986FD8D7BFE3 -FE7FCFF2C0F4E8162DFDB97D47F9FF003FA1A537AA33C8FCFEBFE1FA5506B600 -8C039F5FF3FE7FA44D115CF1CE3BFF009FF3FC90AC8D13783BB0FF003FE7FCE2 -A36BC04E727F97F9FF003E9C679183E9EFDC73FE7FCF408E0F1CFF00FAFF00CF -E1F9171973ED6A7DBF1FF3FE7F1C46F7191D3FCFF91FE7B573C1CF4F7EFD7FCF -F9E811C1E39FFF005FF9FC3F24DDC771CEC0FF003CFA7F9FF3EC8094CE38FCFF -00CF6FF38E10F073D3DFBF5FF3FE7A047078E7FF00D7FE7F0FC8112ADC141D31 -8FF3FE7FCE2517781C83FE7F0F63FE7A553C1CF4F7EFD7FCFF009E811C1E39FF -00F5FF009FC3F22E05C17C07AFF9FF00F57F9E712FDB401D7A7F9FF3FF00D6AC -E3C1CF4F7EFD7FCFF9E811C1E39FFF005FF9FC3F2776173406A00E3271EBEDFE -7FCF4E037809273FE7FCFF002F6E33CF073D3DFBF5FF003FE7A047078E7FFD7F -E7F0FC8BB02E1BD5F4FF003FE7FCF5C31AEB93807D891FE7D0FF009E958F073D -3DFBF5FF003FE7A3D319048C7AFF009FF3FA705D85C73CA0FE1E9FE7FCFF0028 -DBAF0318E9DB9FF23FFD5DACC71838E3A7FF005BDBFCFE1C4A215EEA01F6FF00 -3FE714ACC12B9430476231FA7F9C7E9F91823DB1D3AF07FC8FF3DB496151D00A -90459AAE51DBB993823B118FD3FCE3F4FC8DA738039EDC1EBFE47F9EDB1F670D -8E3F3A71B5C76C52B0B431B691D88C73F4F7FF003FFEA3637653EDC1EBFE7FCF -A6CFD933CE3FCFF9FE541B5C76C516EE1A18DB48EC4639FA7BFF009FFF0051B1 -BB29F6E0F5FF003FE7D3645A77C7E3FE7FCF14A6D70718FCC51641A18BB4AF62 -31CFD3FCE3F4FC93047B63A75E0FF91FE7B6D7D901E71FA7F9FF002291ACF246 -473EE3FCFF00914583431B0476231FA7F9C7E9F92825738FEBFE7B7F9C71A9F6 -3DBD140FF3FF00D6A61B618FBBDBFCFF009F6A2CC114A3940C03C01FE7FCFF00 -9C584742703AFB8FF3E9FE71C21B3C74C03EBFE7FCFE988DAD08391D7DBFCFF9 -C7E459F4196976F6EDC53D428F4C567B47245EE3A923B7F9FF003EC34D20EB9C -FBFF009F6FF3D9A6173502A7A814E1147EB5962E9973927F1FF3FE7F93BED87D -3FCFF9CFF9E85D07CCF69F8A5FF23DEA7FF6CBFF004525147C52FF0091EF53FF -00B65FFA2928AFAF333CEB6A0E857FCFFF00AA93E41E9F9565FDAD8F73CFE148 -276F53F9D7C728773D0E681AA59171823D3FCFF9FF00EB27980F7ACCF39B1D4E -7D69EB213D7F1E7FCFF9FD36568F41FB482344371D7FCFF9FF003E80719EB8C7 -AFF9FF003FCA8EF63D7FCFF9FF003ED22B11D307DB1FE7D3FCE381CCCDD55D0B -9BC0CFB7B534BAFE5FE7FCFF009C4032727BFA8FA7F9FF003D14707078FF00F5 -FF00F5AA398CDD41E587A1E3D07F9F4FF3D99907DBF11C7F9FE9F91D57FCFA7F -9FF3D0048383FD7D7FFAD4AE66E4D815EBC7AF6FAFB7F9FE49807FC8FF003DFF -004FC97AAFAFFF00ABFCFF009E80241C1FEBEBFF00D6A44885319FF3EBEDFE7F -926C53DCFE63FCFF009FC9DD57D7FF00D5FE7FCF40120E3FC7D7FF00AD400D31 -75EBFE73FE148635C77F5A71E57FCFA7F9FF003D118738FF003E940889A3507A -63DBD2A32B8CFF009FF3FE7F09CA1FC3D690C7F9FA1A2E22B3271C530A9156CC -5ED91ED4D30F620FE35572B9AC5178CE38C7B7B74A81A076E9C7F9FF003FE7A6 -A1B7CF2052FD9F9C631F5A5A05D331FECAFF004E7B76F7FF003FFEA516CE3D3A -7F9FF3FE46B9B7C8CE28FB3F38C73EF4AC82E8CA104831C8183E9F4FF3FE7851 -14C31CFF009FF3FE7D350DB67FC697ECE3F1F4A2C87732C24C3F8875F4FA7F9F -F3C0167E391F97F9FF003FA699B7FA63D697ECE3F1F43C52B442E6688E5FEF8F -CBFCFF009FD1BE5CFF00DE1FE7FCFF009EDA9F671F87AD1F671F8FA1E28B442E -65F9329FF969FA7F9FF3FA27D9E423EF63FCFF009FF3D3545BE39EDEA28FB38F -C7D0F14EC82F7328DAB1FE2FFEB7F9FE9F4C37EC6DEB8F4E7A7F9FE9F975760F -A5C5A36A305CD8BCDA848A0DB5D890E2260E871B4103053CDC93BB92980B824E -86AF6FA049E12D2DED4226BC58ADC436F14AAAA83702D23C8EC19DB08C3CB0A0 -65C11F7715C89ABA62D0E14591F5FA7B7F9FF3ED32C0171ED5BFA1DAD9BEA0AB -78D0C71F0564B9690400821B1208D4B95601970B820B03918A6788059BEAF706 -C23852D46D0A2DD2458F21406D824667DBBB241620907385FBAAD256B85D18E1 -00ED8A785C76FCE9E571DB07FCFF009FF3C3181CF43422AE3D4803FCFF009FF3 -F93D5F1DAAEF85E6D3A1D7ECDF578527D3B71134721902B0208193190CA338F9 -972475DAF8DA7AB375E081E37F366B2B3FEC3FB2FEEADAD6EEF7C8F3B3CF9D2B -C5E6F4DC479698CF960F1BCD5A826AF7134713E70A619856B587897408AE3533 -7BE19496CE6795ED922B9984F00620246252FB40404B6E68DC92B8230494BB61 -A8F8567F004F05CE9D0DB788A3DC12F16E6E1E794EE0CA443B0421483B093202 -02B36D240533CB1EE8564732641D862A367CF35B5E28B9F08AE8F609E1EFED76 -D4A37637736A50C6A9282ABF70248768565242904FCE72DF28AE58CEE33D73EF -FE7DBFCF64FDD76434CB8CE075E00EA6A17700640C0F718F4FF3FE78AED23924 -FE67BFF4F4FF0038E10B11DB07FCFF0087E9EDC4360D849C11DBFA7F9FF3D386 -E08E9C63A75EBFE47F9EC1EB9FD7B8FF003FE7D82383C73FFEBFF3F87E4841D3 -DB1FA7F9FF003EC608E9C63A75EBFE47F9EC99E7FAFF009FF3FD3ADF091F0CFF -00674BFDB0B019FCD3E7FDA3CFF37C8C0C7D93CAF93CEFF599F3FE4C88BB6FC5 -463CCEC2393E9ED8FD3FCFF9F630474E31D3AF5FF23FCF64DDCE718F7FF3FE7F -A21618F5FF003FE7FCF490BA1DD3DB1FA7F9FF003EC608E9C63A75EBFE47F9EC -DDC0374C7BFF009FF3FD0DC36E71CFA63FCFF9FD0B315D0EE9ED8FD3FCFF009F -630474E31D3AF5FF0023FCF669600F039F5E9DFF00CFF9E86E041E3FCFF9FF00 -3E8ECC2E8774F6C7E9FE7FCFB1823A718E9D7AFF0091FE7B34B007D0FAF4FF00 -3FE7F0370C7F9FF3FE7F2560BA1DD3DB1FA7F9FF003EC72338E3F3FF003DBFCF -66961B8E07E3FE7FCFF45C8F4FC3FCFF009FE88399122CC571EDFE7FCFF9C4C9 -7047B0E9E9FE7A7F9ED549C738C7BFF9FF003FD17049231CFBF1FE7FCFE0730E -E5E5B9E7D3D79E9FE7FCF7C4893E7D7F1ACDC11CE303D47F9FF3F870B9603B83 -EFFE7DBF4F6E1F38EE6A0B9CF7E69C2EBDC5656E619E703D7FCFF9E3DB842C40 -EE0FF9F6F6FD3F26A480D9FB4D28B8F7AC5DECB9C1C01DFF00CE3FCFD38719E4 -C1F98E7FFD7EDFE7F92BA0D0D95B8CF5C5384D9F4AC5170EAD9273EE47FF00AB -D3FCF6996E8E00EFDC9FF3FE7F3C3BA0B23544B9FA7D29C24CE71FCAB3926CF4 -271EB528909A764C394BDB81FF003F5A0A291C679F7AA824FC2A4593F1F7A561 -598F6876F6FC6A26878A984B907269F95239C7E145DA029343F424544D003838 -C63FCFF4AD131E47B63AD46D17518FC29DD31DFB996D6BE9F2FA63B1FF003FE7 -D2178190E075ED8FF3FE7F96ABC5F8531A3039145BB0F43D73E297FC8F7A9FFD -B2FF00D149451F14BFE47BD4FF00ED97FE8A4A2BEBCCCD9F811C7C11F87C4707 -FE11DD3F273CFF00C7B47FE7FCF1DD124679C7F4FF003FE7DB84F81233F043E1 -F71FF32F69FF00FA4D1D774475E074FF001FF3FE78F989C9F333805248CF38FA -76FF003FE7D8248CF38FA76FF3FE7D908EBC0E9FE3FE7FCF011D781D3FC7FCFF -009E239980A4919E71F4EDFE7FCFB04919E71F4EDFE7FCFB211D781D3FC7FCFF -009E023AF03A7F8FF9FF003C1CCC05248CF38FA76FF3FE7D8248CF38FA76FF00 -3FE7D908EBC0E9FE3FE7FCF011D781D3FC7FCFF9E0E66029EBF4FD3FCFF9F60F -7FF0FF003FE7F4423AF03A7F8FF9FF003C0475E074FF001FF3FE7839980857AF -F9F5F6A0AE33FE7D7DA948EBC0E9FE3FE7FCF011D781D3FC7FCFF9E0E664F2A1 -0AE33FE7D7DA82B8CFF9F5F6A523AF03A7F8FF009FF3C0475E074FF1FF003FE7 -8399872A10AE33FE7D7DA82B8CFF009F5F6A523AF03A7F8FF9FF003C0475E074 -FF001FF3FE78399872A0036E71C7D3FCFF009FE430CFE1FE7FCFF9C0475E074F -F1FF003FE7808EBC0E9FE3FE7FCF07331F4B085319F6FF00EBFB505319F6FF00 -EBFB5291D781D3FC7FCFF9E0284E781FE7FCFF009EC733172A14F7FF000FF3FE -7F43A7B63D3B7F9FF3EC15F603FA7F9FF3EC6DF61FE7FCFF009ECEECA1338F6F -C3A75FF3FE7852C7DC7E1D3FCE3FCF6368F41FE7FCFF009EC631D80FF3FE7FCF -45760183F4FE9FE7FCFB183F4FE9FE7FCFB2E31D80E7F2FF003FE7DB275AF19F -877C37751DB6AFAE69DA45D3C6264B7BEBB8E1728495DC031048CA9EDFCB8B8A -727657035829FA7F4F7FF3FF00EA531FB8E9E9D3F4FF003FCB991F14FC14338F -17E823FEE270F1FAFF009C7E47FC2D3F050FF99BF411FF00713878FD7FCE3F2D -BD8D4ECFEE1E874C221EC38F4E9FA7F9FE49E574E71EBC741F97F9FE5CD8F8A1 -E0C3C8F1868007FD84E1E07FDF5FE7F92AFC50F058FBDE30D001FF00B0A43FFC -57F9FE42A753B3FB8564CE9555802304607E5FE71FA7B71205C019047E3D3F4F -F38F6E397FF85A9E0A1FF336F87FFF000670FF008FF9FE47FC2D3F050FF99B74 -0E3FEA270FF8FF009FE54A9D45D1FDC4291D5282380A71DC67FF00ADFE7DB1C2 -05C63287F1EDFA7F9FC38E587C52F0567FE46FD0171FF51487FC7FCFF25FF85A -3E0AC71E30D0063D753878FD7FCFF21C2A767F7169A68EA02F4F908E3F2FD3FC -FF00215771E13EBEDFA7F9FC38E617E28782B8FF008ABF41CFA7F6A43FE3FE7F -9387C52F048C7FC55FA00FA6A70F1EFD7FCFF25ECA6FA313763A811AE324608E -C7FCFF009FC38555C63E5C6393EDFA7F9FC38E587C53F04F7F17683F41A9C3FE -3FE7F96CE85E20D2FC4B66F75A4EA169AA5B472189A6B2B849915C052412B900 -E0838F71F8371715AA62B9764648103CB88D3BB31C7F4FF3F870FF002B6E0951 -CF3F87E5FE7F970DF12B41BBD40E9F729672EA1616EF996CA16C396ECC38E475 -E3DFB638CF6F1658FC1AF862FA9F88E5FB3244D23DB590606672C4B470AE76E5 -CE09CE30393C638129492E5EA173D2963380766003D79E3F4FF38F6E058B6B0C -A8C75FF3C7F9FE5F999F123E2AEBBF13BC677FAACB77269F1C9BDEDED3ED3B23 -B785012B1A9006E38EF8196CF4EDC9A6B1A91552750BB071CE277E3FCFF9F6EF -A7817769CACCD791F63F589542EDF971839EBFFD6FF3FC95540006DFC3FC8FF3 -FCBF277FB5F5218FF8985D8C71FEBDF81FE7FCFA28D5F52E3FE2617631FF004D -DF81FE7FCFA6DF50FEFA0E47D8FD6108015FDDF43E9F4F6FF3FC90463E5FDDF4 -39FF003C7F9FE5F93FFDB3A90C6751BC1DCFEFDB8FF3FE7D946B5A91C7FC4C6E -C7AFEFDB81FE7FCFA3FECE97F3A0E47D8FD60585720ED23E83A7E9FE7F0E1E3E -5C6171F874AFC9CFEDBD481E750BBE3923CF6E9FE7FCFA69E8D61E28D7407B29 -2EEEE3513B49E55D1CAAC31F9B2B9DC461513E663C800F27AE25E5EFF9D072B5 -D0FD5124F1904648EB467047047D074AF857F67EF8F57DF0A2ED34CF10DC7F68 -785EF2E0A9905C47249673165064CE49281472B903A30E783F7440F1CF1A4914 -89344E032C8982A46060823A8EF5C15E8CA84ACC9774EC380FF671CD281ED8FA -5281D381D2803A703A57385C368F4E3F9579B7C75F8C70FC0FF095B6BF71A53E -AC93DFA58ADBC5288B1BA391F76483D3CBFD47E1E92074E074AF99BF6FC18F83 -BA3FCA07FC4F61E9DBFD1EE2AE9A529A4C6B569339FB3FF82805AEA1796F6969 -F0FEFAEAEEE245861B782F84924B2310AA8AA222589240007538AE83C45FB5F6 -BFE0E92C63D7FE0DF8974296F9B65A47A9F996CD72D9036C61E005CE5946064F -22BE34F831AC59F86BE31F8135AD4AE96CF4DD3F5EB0BBBA99C65638A3B94777 -3F45535F54F8AFE387C31F0BF8E86AB6777A74E2F7C5D3EBA27F0A7DB6773E6C -57117DB2EFED61424F119E3912380EC25640401B48F5FD853EC6DECE2BA1D35D -FED6DE25D3F5ED3F43BAF82BE2AB6D6B50567B2D3A54956E2E554659A38CC1B9 -C00092402062B161FDBB1AE23D35E1F86DA9CC9A94EF6D6463BCDDF6A990A878 -E3C45F3B2EF4CA8C91B97D4573BFB3C7C4AF047C17F18F83AC35AF1AE9DE27B7 -5F115E6BD71AD5945706DEC227D366B60AE1E357F3A6728594060BE4A7CCDBB8 -741F1EBE1BD96B3E07F1E477D3DBEAFA74BACF88353F0FAD89774D5AEE3B3802 -C5B9B6F9625F3AE532E36A45B30A718161E9F61FB38763A87FDB6AFA2BBD5AD5 -FE156B91DD68E8D26A3034CC24B2552031994C398C02403BB1838AD5D23F6B0F -13EBF73776FA5FC16F13EA5716690CB710D98925785264DF0B32AC0480E83729 -3D40C8E2BCD350FDA17C276FE25F1278F57539758BAF12F84EC74ED5B4FD4201 -15CDF4B15F5B5B5E42C115E38FCFB1859B2A4EDF3188DA40A7FF006F7C39B5F8 -93E31F177873C75A043AD5AE9DA5691E19BDD7A1BA863B731E996F1497E238A0 -9B74C8D1EC442368667627E4406BEAD4FB07B28763B39BF6DBBDB68B59965F85 -9AD451E8938B6D51DE7602C252CCAB1CE7C9FDD3164650AF8259481C8C533C2F -FB79D87897C4DA468CBE0DB9B63A85DC3682637EAC2332384DD8F2C6719CE322 -B81D3BE22F8034CF015B7C2FBDF144B7975AA58EA6FAE6BB6B6F2CDA55FDFDCB -892CA791E42938FB3BDBDA92C22E732290416CFCF7F0B940F8A3E1001964035A -B3F99338FF005E9D323F5E3F0A9786A76BD84E9C52BA3F51FE26A83F0E7C57C0 -E349BB19FF00B62D5F9AE72724F5EB93FE7FCFF2FD27F89631F0E7C57F281FF1 -2ABAE9FF005C5BDABF3682600E2B6CB3E093F3472498CC11DB1FE7FCFF009E86 -08ED8FF3FE7FCF493CBC7623071F4FD3FCFF0023CBC7623071F4FD3FCFF2F72E -223C11DB18E7FCFF009FFEB1823B63FCFF009FF3D24F2F1D88C1C7D3F4FF003F -C8F2F1D88C1C7D3F4FF3FC8B811E0FA74FF3FE7FCE0C11DB1FE7FCFF009E9279 -78EC460E3E9FA7F9FE47978EC460E3E9FA7F9FE45C08F0476C7F9FF3FE7A1823 -B631CFF9FF003FFD693CBC7623071F4FD3FCFF0023CBC7623071F4FD3FCFF22E -047823B63FCFF9FF003D0C1F4E9FE7FCFF009C49E5E3B11838FA7E9FE7F91E57 -5C0208FD3F4FF3FC8B811E08ED8FF3FE7FCF430476C7F9FF003FE7A39A375FE1 -FF003FE7FCFA26C65CE5718FD3FCFF009F6570130476C639FF003FE7FF00AC60 -8ED8FF003FE7FCF45C63B638FCBFCFF9F6318ED8E3F2FF003FE7D8B80983DC71 -FE7FCFF9E03DFE5E073CFF00FABFCFF25C63B638FCBFCFF9F6318ED8E3F2FF00 -3FE7DA5EA173EE3F8A5FF23DEA7FF6CBFF004525147C52FF0091EF53FF00B65F -FA2928AF20F4CD8F81233F043E1F71FF0032F69FFF00A4D1D774475E074FF1FF -003FE78E17E048CFC10F87DC7FCCBDA7FF00E93475DD11D781D3FC7FCFF9E3E5 -A7F133CF023AF03A7F8FF9FF003C0475E074FF001FF3FE7808EBC0E9FE3FE7FC -F011D781D3FC7FCFF9E2060475E074FF001FF3FE7808EBC0E9FE3FE7FCF011D7 -81D3FC7FCFF9E023AF03A7F8FF009FF3C000475E074FF1FF003FE7808EBC0E9F -E3FE7FCF011D781D3FC7FCFF009E023AF03A7F8FF9FF003C000475E074FF001F -F3FE7808EBC0E9FE3FE7FCF011D781D3FC7FCFF9E023AF03A7F8FF009FF3C000 -475E074FF1FF003FE7808EBC0E9FE3FE7FCF011D781D3FC7FCFF009E14AF5E07 -F9CFF9FF003C34AE2108EBC0E9FE3FE7FCF011D781D3FC7FCFF9E14AF5E07F9C -FF009FF3C057AF03A7F8FF009FF3C5FB3905C423AF03A7F8FF009FF3C0475E07 -4FF1FF003FE785F2C9CE17FCFE5FE7F926DCE4ED18FF00F5FF0087F9ECB95DED -60023AF03A7F8FF9FF003C285C93C0FF0039FF003FE783664FDD18FF00F5FF00 -9FF3C382E39C01CFF9FF003FE45C6124F541B863A70063F4FF003FE7D8031D80 -FE9FE7FCFB00640200C6783FE7FCFF0043046381D7F2FF003FE7DB5F4430C631 -C018FD3FCFF9F6318C70060E7E9FE7FCFB2846240039CF6FF3FE7F9220DEB951 -9039C8EDFE7FCFB1AF600C631C018FD3FCFF009F631D381C1FCBFCFF009F650B -8EDD3FCFF9FF00385DA076C01CFF009FF3FF00D6767D8040B8078C77FF003FE7 -FF00ADF1DFED9831F11F4AE31FF12B4FFD1D2FB7F9FE5F629E9D0F4C83FD7FCF -FF00ABE3AFDB3063E23E95C63FE2569DBFE9B4BEDFE7F97760BF8E80F01A28A2 -BE84A0A28A2800A297047634631D8D020C7B1A31D78239A31D78239A31D78239 -A6018EBC11CD18EBC11CD078ED8A704273C63EB40063AF18E7BF6AFB43F6308F -3F0CB54054F1ACCBD3B7EE60F6FF003FCBE3155C13C74FD2BECEFD8C405F865A -A64600D6A5FC3F7307B7F9FE5C78DD28BF524F7D45C01C15ED9C648E9F4FF3FA -7C9DF0E7C01A97EDEDE2AD7EE750F15FFC215A768B7105BE99A67D83EDCB99A2 -9D9BE7568883B6D198B303D4018039FAC36E17A11FE47B7F9FE5F9A1F0BFE38F -8ABE0CA6A0BE1B9B4E54BC9ADEE665D474F86EC2CB0F99E5489E6236C61E6C80 -32E0FCC7F0F1A8D3A9384DD1B732B5AE694FBB3E81F1BFEC2DE1BD0BE1A6B1E2 -BD2BE305AEB3F64D29B54B5B6FEC136E6E479334AB1ABBDC1DAE56DA6046D2C9 -E5B6546315F1F7C6DF0B1F00EBD636105D5D10F0B5C7EF6036EC1598F9595248 -C98BCB623F859D93AC671EEFE25FDB23E2978ABC3F73A36A77BA41D3E7B0974D -6F2B46B68DE2B6950A3C71B88F746A54E3E523AFE23E7DF8DBE26BFF00166B1A -75EEA96D05BDDEC909102326FDF2198C8DB892CCCD23B649E9B42E15540F430D -1C4C69CBEB325277E86EBE2D0E086A17591FE977191FF4D0FF009FF3F902FEEC -63FD2EE3FEFE7F9FF3FA57518CF6A760FA1FF3FE7FCF6E867459130BFBA18FF4 -B9F8FF00A69FE7FCFE80BFBB18FF004BB8E3FE9A7F9FF3FA43B09EE47F9FF3FE -7A285E9C1A42B236BC2F753C9AEDA87B9948C3E4BB123853CE0F15EF5F0BBC43 -E3FD2AD2E6DBC177D79A7D8DA24F2DC5C09638ED6C84E042D399641B2062A3CB -59B7230F994365883E01E17C0D6EDC918C2C9D7FDC35F65DCD95A785FE10F843 -49D335117B06B9A443AB4DA73DB09F7DEDC5E5E5B4938473B0B4296B1408240D -B5A790A0F31C30DA1B184D5A48F21F19F847C6105B3F8835D86E350B09EF0C67 -5982EE2D42D65B965CB27DAA2674329550C50BEF006EC0041AFA27F628F891AE -6A9A96A3E0BBE9DAE34BB4B137966D2365AD82C8AA501C65949941009C2ECE38 -381CA7839A6B0D0355D3116CB5ED127BBFEC5BED47C9E2182E6D6E26FB4CEA54 -ACB342216B88665632204915C9564544FD869B3F15F54218303A24B81B76E079 -F6FC0A8C4C54A949346535747DC8074E00A00E0718A5A2BE5CCC2BE65FDBF87F -C59ED18ED1FF0021F879F4FF0046B8AFA6ABC3BF6BFF00863E21F8A5F0CF4DD2 -FC2FA7AEA7A8C3ABC574F099E38488C432A31DCECA0F2E9C67B9F4E35A4ED34D -827AA3F36EBEF8F01FECEFF0FF00E22F88BE125EF87741B2B8BAD174DD2078E3 -47962216EE3BCD3A3960BB119F9241E6BBABEC05B2D96C05CD7CD7FF000C75F1 -83FE8521FF00833B3FFE3BFE7F97AAF81FC1BFB44FC3DF891A5F8D748F0659C3 -7D61A6C1A3FD8DF5183ECB756F05A25AC6278D2E94C9F2C6AFF780F3141C6300 -7B5ED21DCEAE78F7377E117C16F0D7FC2BAF0537FC237E1FF17EB9E37BBD6A63 -A1EAAD716D777B1DA92B1C1677B1A3476C63F2DA4767DBBF784CE01C65787B45 -F03EB7FB3DC1E1CF02E9DE0CF167C40FF84664D52FA3BBD326FED7562D234C63 -B821635781190AA1259FCB255578265F877A07ED13F0CFC3834ED37C03A2DCDC -DACF7575A5EABA94D6B737DA3BDCA84B8FB1B9B80230C064AE082724F5229B65 -E1AFDA1AC3E1CC5E14B7F87DA1DAC91699FD8B0F88A192CD75782C320FD9D671 -718DA42EDFBA4E19B9C9C83DA43B87327D48356FD96EEFC03FB297885F53F04D -ECFF0010D2EACB53BABC3632C9F63B7732130ABA82AC91C5124923A7DD336C72 -0C66BA2FDA13E13FC3ED02F56DF4CF0CE98FA3691E2ED0EC6E74EF0EC72C9AC5 -A595C4123DC417AC1CF9B2CB228488A6EC6C650C0F15CEAF87FF006A97F04EB3 -E15B94D5F51B3D5E48DE6BEBEF1224B7712A860628E4375811B6E2194A9071CF -4AD0F1F69DFB46F8FA38A67F87FA1F87F56FED3B7D62EB58D065B5B6BBBEBBB7 -52209266372C1B6649030006E71C6035520BA8F9977297C76F067872FBE1DF8C -6FBC15E16F066B5A0E8F25B8B6D5341B892C757F0DC7F6808D1EA16529124ECE -018F73FDD2AEE403923E64F84EBB7E2678386DC6359B3EDFF4F09FE7FC3B7D63 -F10AC7F684F887E10D73417F857E11D01B5F68DB5CD57435B4B5BDD4CA4BE6E6 -6945C9C932658E00CEE7C100D7967C3FFD933E2AE8BF103C35A85FF85D6DEC6D -353B5B89E51A85AB7971A4AACCD8121270013800934A55A167762728DAD73EEE -F897C7C3AF15FF00D826EFFF0044B57E6C6381C7715FA53F1340FF008573E2A2 -3FE81377EFFF002C5FFCFE15F9AC07CA38F4FF003D2AF2BFE1CFD51C12176E33 -F2E3047E1FA51B719F971823F0FD2931EC3A8FE9ED463D8751FD3DABDA245DB8 -CFCB8C11F87E946DC67E5C608FC3F4A4C7B0EA3FA7B518F61D47F4F6A005DB8C -FCB8C11F87E946DC67E5C608FC3F4A4C7B0EA3FA7B518F61D47F4F6A005DB8CF -CB8C11F87E946DC67E5C608FC3F4A4C7B0EA3FA7B518F61D47F4F6A005DB8CFC -B8C11F87E946DC67E5C608FC3F4A4C7B0EA3FA7B5007B0FF0038F6A005DB8CFC -B8C11F87E946DC67E5C608FC3F4A36E33F2E3047E1FA51B719F971823F0FD280 -0DB8CFCB8C11F87E946DC67E5C608FC3F4A36E33F2E3047E1FA51B719F971823 -F0FD28010C6B83F291CE0FB527978CE0600FD3FCFF009F676DC67E5C608FC3F4 -A36E33F2E3047E1FA5219F6FFC52FF0091EF53FF00B65FFA2928A3E297FC8F7A -9FFDB2FF00D1494578E7A86C7C0919F821F0FB8FF997B4FF00FD268EBBA23AF0 -3A7F8FF9FF003C70BF02467E087C3EE3FE65ED3FFF0049A3AEE88EBC0E9FE3FE -7FCF1F2D3F899E7811D781D3FC7FCFF9E023AF03A7F8FF009FF3C0475E074FF1 -FF003FE7808EBC0E9FE3FE7FCF103023AF03A7F8FF009FF3C0475E074FF1FF00 -3FE7808EBC0E9FE3FE7FCF011D781D3FC7FCFF009E00023AF03A7F8FF9FF003C -0475E074FF001FF3FE785D848270319DBC7AD717F123E2E7877E16E9C6E357B8 -12DD38530E9D6AC8D732024E1821230B80DF31E38F5C0AD29C25525CB1407664 -75E074FF001FF3FE7808EBC0E9FE3FE7FCF1E45F0ABF68FF000F7C4529617863 -D0F5A6C85B6B89144731270A2272796236FC846724E323A7AE91C13803FC9FF3 -FE78AA94A74A5CB241B6E057AF03A7F8FF009FF3C2918CF03FCE7FCFF9E023AF -03FCFF009FF3D823AF03FCFF009FF3D9A49127CC1FB6D0C27834E00C1BCFC3FD -4D7CBBDCF15F51FEDB43F77E0EE31CDE7FED1AF9748AFA6C1A4E8C6E5A2EE8A7 -FE26B63C7FCBC479FF00BE857B9FED9C367C42D1D00010E98ADB703AF9B273D3 -3FE7F2F0BD107FC4DEC38C7EFE3FFD0857BAFEDA031F11347E31FF0012A4FF00 -D1B2554E2BDB434EFF00A0CF9FB201E9D2BB1F83AC3FE16A784832EE53AA5B02 -338E3CC19E7E9C571A4735D87C1E1B7E2A78473C7FC4D6DBF0FDE0AE9A89723D -3A03D8F4BFDB29107C4CD2F6A155FEC88F8C923FD74DEB5E0DC0ED5EF3FB648C -7C4BD338C7FC4A23FF00D1D35782E2B1C2A5EC63A023A7F86007FC2CDF086464 -0D62CF20F43FBF4E2BDF3F6DB8E30BE0B2B16CE6F724127A7918FEBFE45783FC -2919F8A3E0EC8E3FB66CFF00F47A57BBFEDB0311782B8C1CDEFF00ED0ACA71FF -0069A7A7711F2F66B43C3C33AFE9A01C137310CE01C7CC2B3EB43C3A71E20D30 -FA5D447FF1F15D724ACF403F4CCEE2AA48190A31FE7FCFF87C75FB658C7C46D2 -B8C7FC4AD3B7FD3697DBFCFF002FB1D5301331E300678FFEB7F9FE5F1D7ED9AB -8F889A4305DAA74A4EDFF4DA6F6AF0B056F6E8957EA7CFF4529146D3CF078AFA -0284C6697691D4114BB4FA1A36FB1A10098EBC11CD18EBC11CD2ED3CF047D682 -A47634C04C75E08E6976FB11F5A50B807E5FCFB5388EBF2E3F0E9FA7F9FE5490 -AE27978CD295EBC0FF003F87F9FE4BB4F3F281FD3FCFF9F60AF5E00FF3FE7FCF -4D2C9137003058E3A7A7F9FF003FCBED0FD8C231FF000AC754CAF4D6653F4FDC -C1ED5F1795C062476AFB43F62E19F861AA1038FED9947D3F730579D8EFE0B5E6 -80F7C68F2B8DA07F4E9EDFE7F97C8FFB27F8D744FD9EF57F1E689E3CD7A1F06E -ADFDA1A54AF6D71A6CB7FF006D8615BA778018924118632C0DE6609C7407F87E -BA09EAAB8C7E5D2BC93F686F81169F197C388D6E16D3C47611BB58DD07DAADDC -C2FC72AC40C1FE13CF735F3B1E59C5D19BB2975EC6917CAEE73DE2EFDA37C277 -FF000CFC45A6CFF152C35CB9BBD2AF2D1AC63F0FDCC22E8B584C91A79925A0DA -4CF22924B05C4684151B92BE10FDA26FE7D63C676AE64FB5C526F368C215131B -791FCC843855037EC74C28E1576A8E1405B1A9E9577A0EAD77A6DF5BC965A8DB -48D14F6F2A6D92370704118FA1FC8F4C6332FEC65D46EE1BA6BAB98AE215D91B -A1C955DA100E4740BC0F41FA7B386C12C2D371A7272BF73A69C9392E7DBC8F35 -96CEE6D40335B4B08233F3A1518F5E9F4A6A9E9918FAFF00FABFCFF2F43BDD06 -4D4A0F2AE6F6E24427382A831DFB27BFE83D06281F01D895189AEBE995E3FF00 -1DFF003FCBA553A9F68EAAD2A29FEE5B6BCF7FC0E3608A4B89A38624F325760A -A8BD492400071EB8FF003D2D5CE917B636E93DC5B98A17728AFB81048C67A7F9 -E9F876161E0FB7D36FEDEEEDEE2E966824496366DA76B2B023F87D40FF003D24 -BCF0CFF685B245757D793AACD24FB9D95A42EFB0312DB7272113E841A1D2A9CD -64B408CE8FB3939DF9BA5B6396F099235EB6E31C3F3FF0035EFDE08F8A87C3BA -03E81AB69EFA8E886E4DD79B633FD9350B66640922C33EC61B245551247223C6 -DB41DAACAACBE51A7784EDF4DBC4B98E49D9D33B43E31C8C1CE07F9FE5B3E416 -1B482067A6381FA7F9FE5D10838A7738A726EC7A7EBFF19ACADB47D4B48F0469 -DA8689A75FC66DE7BED52F96E35016ECA7CEB68DA28E2822864E0BAA45BDF1F3 -395F907A17EC29A55DCBF1235EBD5819AD6DF4B78659B1954779A365527AE488 -DCFF00C079C578F7C28F859AA7C5AF1641A2E93198A3187BCBEDBF25AC59019D -881D7B05EA4F1C751F76C9A4D97C1CF0DE85E1AF0C2C3A5D96E91DAE2F06F323 -8DA4B3100E5D8B679E005C0C002B87175A308BA71DD994A5A1EA3803B51583E0 -7D6E7F10F86E0BBB908660EF134B182124DAC4061919E40FE75BD5F3CF4330A2 -8A2900BC7A5251477C7D7FC680D85A70C2F5535C6F8EFE2EF83BE19C7237893C -4363A64C89E67D9649035C30CE01588658F3C74C578ECBFB7EFC3B819A31A478 -92754C9F3A3B284AB0F6266191D7FCF4D5529CF643B367D264E3B5267DABE7DD -03F6E6F865AE6A1F67BA7D574007832EA36ABE5FD731BBEDEB9248C01D4D7BAE -8DAEE95E24D396FB4AD4ACF53B2248FB4594E9347C641F99491FAF1FC89D2943 -742D56E5D3F4A29E6320138C62956267CED52C07715885CE5FE258FF008B71E2 -BFFB04DDFF00E897AFCD7C600E3B8FF3D2BF4ABE26AE3E1B78AB8FF9855DFF00 -E897AFCD60BC0E057D1657FC397A99C98DC7B0EA3FA7B5477332DA5ACD3BA9DB -129720019C019FE953F978FE1C7E1FE7D3F4AA3E20CAE87A860153F6793A718F -94D7B8F66095CC33F10F4C1FF2C2E0743F7538FD7FCFF23FE161E99CFEE6E073 -E89C7FE3DEDFE7B79BB29CF4FD28D87D2B87DACCEBF6513D23FE161E9833FB9B -81CFA27FF15EDFE7B1FF000B0F4C19FDCDC0E7D138FF00C7BDBFCF6F37D87D28 -D87D28F6B30F6513D23FE161E9833FB9B81CFA271FF8F7B7F9EC9FF0B134B048 -F22E473FDD4E3FF1EFF3FCBCE361F4A3691DA8F6B30F6513D1FF00E162E97FF3 -C2E47FC0538F6FBDFE7F91FF000B174BED05C8E7FBA9C7FE3DFE7F979C6D3E94 -6D3E947B598FD944F46FF858DA667882E7FEF94E3FF1EA3FE1636998E2DEE41F -A271FAFF009FE5E73B4FA51B0FA51ED661ECA27A2FFC2C6D37B5BDC8F4C84FFE -2BE9FE7A28F88DA67FCFBDC8FC138FD6BCE7CBFC293611D8D2F6B30F6513D1FF -00E163699DADEE47A709FE3F4FF3D13FE1636999FF008F7B903FDD4E3FF1EAF3 -9D87D0D21523B628F6B31FB289FAA5F14BFE47BD4FFED97FE8A4A28F8A5FF23D -EA7FF6CBFF00452515C86E6C7C0919F821F0FB8FF997B4FF00FD268EBBA23AF0 -3A7F8FF9FF003C70FF00032329F043E1EE79CF8774F3FF0092B1FF009FF3C770 -475E074FF1FF003FE78F969FC4CF3C08EBC0E9FE3FE7FCF011D781D3FC7FCFF9 -E023AF03A7F8FF009FF3C0475E074FF1FF003FE7881811D781D3FC7FCFF9E0DB -D4E3000C9E3B7F9FF3E811D781D3FC7FCFF9E192FDD3F2E3FA55477133E6CF8E -5FB4B6A3E16D6B56F0EF87ED8D9EA16CCB0CBA84E237109DC0931A953BB70C0F -9B81D973F30F95EFAE25BFBC92EEE6469AE2562F2CB21DC5989C9663DC927AD7 -71F1FF00FE4B2F8A8723FD2FF2F947F9FF003C7051823AF1ED5F6387A50A74D3 -8AD4D52B6A380C906BDB7E11FED3FAC780C2699AEACDAF68C8AA91FCCA2E2D97 -2776D623F7991901598738F9940AF113C0F4C7E9483391D78FF3FE7FCE34A94A -356369A15AE7E9ED8DD2DFD8DB5D22E22B885664C8C1C30C8FE7FE7B4E475E07 -F9FF003FE7B64F8587FC531A571FF2E917FE8B5FF3FE78D6C727803FCFF9FF00 -3D3E45FC4D191E5FF1BBE099F8C234703581A47F6779C7FE3D7CEF33CCD9FEDA -E31E5FBF5ED8AF2F3FB12904E7C658C7FD42FF00FB757D4417073803FA7F9FF3 -EC6318E00C1CFD3FCFF9F6EA8626B538A8C5E8347CC965FB169B3BC82E3FE130 -0C22915F6FF6663A10719F3BD8D775F1A3F67A3F17B5FB2D606BBFD9096F6A2D -4C66CFCEDC4333673BD48FBC7B76AF61C631C0E39FA7F9FF003ED4759D6F4EF0 -ED97DB354BEB5D3AD016CCF752AC6831FED3601FC3FF00D43C4D69493BEABC86 -7CD67F626233FF001590FF00C15FFF006EAD8F07FEC8C3C25E2AD275B6F167DA -469D751DD187FB3B66F087711BBCD38E9D71F976EBFC41FB53F80340898DB5FC -DAD5C2E479163030EF8277B85523E84F4AF3EB9FDB5E012910784259221F75A5 -D4950FE4213DBDEBAD4B1B515ADF808EE7E31FECEEBF177C496FAC2788869820 -B34B5108B2F3738776DC4EF5FEFF004C7F09FC3823FB11B73FF158E3FEE17D3F -F237F9FE52DB7EDAF04926DB8F074B14671930EA41CF5E78312F6F7EDF97A078 -67F6A5F00EBF0C62E7509F47B9276986F6DDBE5F72C81971EE48E9F94DF1B495 -92D3D2E3D8E3FC29FB201F0BF8A747D60F8B3ED1FD9D790DE793FD99B7788E45 -7DB9F378CEDC67FC8EFBE387C118BE312E8622D6DB485D33CFCEEB2F3BCCF33C -BC73BD318F2CFAFE95E89A46AFA7EBF66B77A5DF5B6A16AF90B3DB4CB22120E0 -F238EBC7F9E2E7965581C60E01E9C8FD3FCFF2E6FAC56735393B35E41B1F2E8F -D893AE7C658FA697FF00DBBFCFF2B3A6FEC5BF60D46DAE7FE12F2E61916429FD -9BB73839C64CBEC6BE9B55EDB48C7E9FA7B7E9F9382631F211FD3F4FF3FCB578 -BACF4B82571A158919423D38E9F5E3FCE3F2CED4BC2FA3EB532CDA8E91677B2A -AEC0F736C9232AFA64AFD7F3FCB4B6E003B48C7AF6FD3FCFF2F2EF8CDFB44785 -BE078D3E1D663BABDD46F01921B0B050D279608064249002E78073C9538CEDE3 -8D294A5EE6E3F23B55F87FE18C7FC8B9A56076FB0C5FFC4FF9FE4EFF00857FE1 -9FFA16F4AFFC018F8FFC77FCFF002F9CC7FC141BC17D57C3BAF6067FE788C7FE -3FEDFE7B03FE0A0DE0D1FF0032EEBE3F1847FECF5D3ECABA5A264F2BEA7D1A3E -1FF867BF86B4AFFC018F8FFC77FCFF0023FE100F0C0EBE1BD2073FF3E51FFF00 -13FE7F97CEABFF000500F07BC91469E1BF103C9210B1A2184962480001BFAE78 -FA8F6E3D12C3E3CF88B5183CFB5F827F1367B719CDC47A2BB46A300F2E060707 -392471CF41911ECB11D532ACD743D247C3CF0BF1FF0014DE95FF008031FB7FB3 -FE7F927FC2BEF0B1233E1AD2867FE9CA3E3FF1DFAFF9E9E723F6829628F75DF8 -46E34965204916ADE22D22C6484EEDB89126BA468CE474603F952FFC3435B191 -238B4AD3EEA46030969E36D02738E9FC17A7B83F97B55FB2ADE62E567A2AFC3E -F0B9C7FC537A57BFFA147EDFECFD7FCF455F879E19E33E1BD2B1FF005E517B7F -B3F5FF003D3CCEC3F684D6754908D2BE1078FB5D40597CFD1EC16FA1F94E0FEF -202CB8CE39CE3907A60D739E2AFDB374FF0001DEA597897E1D78D3C3B78CBB96 -DF55B116B215CE321642A7190467DBE94FD9D7E97172B3DC97E1EF8617AF86F4 -93F5B28FFF0089A5FF00857BE16E3FE29AD23FF00A3FFE26BE6E1FF050BF05E4 -83E1AF10820E08221E3D7F8FD8FF0091C483FE0A0FE0B1D7C39AF7FE41E3FF00 -1FFF003FC97B2AEF74C7CB2E88FA387C3DF0C020FF00C235A471FF004E51FF00 -F135A7A4689A7E836C6DF4EB0B5D3E0662E63B5856352D803385033C003F0AF9 -7C7FC142FC1AA571E1BD7C7A63C9C0FF00C7FEBF97E5EFFF000B7E29787FE2FF -008522D7FC3B72F3DBF98609E29A36496DE60AA5A3704632032F2A48391826B2 -9C2AC55E770B1D701D381D2803A703A50074E00A5AC06711E2BF829E09F1C6B0 -FAAEBBE1FB7D4350755469DDDD4903381F291D3358E3F664F8603FE651B5E3FE -9B4BFF00C5D7A17F6E69BF6EFB17F68DAFDB7BDB79A3CC1FF01EB9F6EBC74ABC -0648EBCFB1AD1549AD2EC2E797FF00C332FC301FF328DAFF00DFE97FF8BA3FE1 -997E18FF00D0A36A3FEDB4DFFC5D759E2BF88DE18F03445B5DD72CF4D7118905 -BC926662B9C65625CBB0EBC807A1F4AF2CF14FED89E0ED12568B49B7BCD7DC01 -9923430440E7904B80DFF8EFF8D6F08E22A7C3715CE9C7ECCBF0C47FCCA36A3F -EDB4DFFC5D28FD997E180E9E11B51FF6DA6FFE2EBCA1FF006E0C1CB782B18E06 -355C71F8C3ED5A1A4FEDB1A4CD70ABAA785EF2C509C34B6B74B3EC19EE19138C -75ADFEAF8B4AF664F31E8FFF000CC9F0C7FE851B5FFBFD37FF0017ED42FECC3F -0C49E3C236B91FF4DA6E3FF1FAB5E1DFDA1BE1E7895E3483C4D69672B2F2BA88 -6B50BC742F200A7F0635E8913A4D1A491B074750CAC39041E98AE493AF1F8AE8 -2E62783FC09A0FC3DD326D3FC3FA645A65A4B299A48E22C773950B925893D154 -7E15A5A9E9167ACDA7D9EF6DA3B9873BB6C8B9FF003DE9750D4ECF498965BDBB -B7B48C9DA1E7915067EA6A68258EEE14960952689865648CE54FD0F4358B72F8 -9B012DEDE2B4B68ADE089218625DA88830147A0A7D382F3CD2E3D8FF009CD26C -63704F6A5D8475A5C7B1FF0039A02E4818C7F4EB4AE026DF635F1EFED27FB5BD -E47AA6A9E09F026D82580B5BDFEBDBD5C2F003470E01E46594BF041538C60357 -A77ED8BF16AEBE19FC325B0D25FCAD7FC4123D8DAB8CEE862DBFBE954E301802 -8A33820C8181CAF1F18E89A1F86AEBC2D6302EA10D9EAFB4CD3DD5CAB105B7BA -BC64B1D8EA5444E1BE523E70770DBB7D7C0E194FF793D8A8A5B87C15B2F095A7 -C47D35FC71697FACE81709710DF2D8B66E8C924122A4C0EE5F9964647C961C2F -391C568BEB975E0C912E2D3C3B069F6B74FAA8B669E537045B5E5B2C0216618F -9E28D9597386CC88CCA3205535F0B699A7C46F4F8B6C239235668A0486479030 -46751B70304B2A2F7C127B038E6F5BF14EA5A8E996367753A4D1D9F10A1458F6 -8D91C658ED0373158A3058F2760AF73952356FB1E81F07F43D3B55D5646F1469 -B737BE1D934CBDB780C714400B88D3CD4DCF249108D16591497DDCE760E1CE37 -342F0CBE857F0F8C7E116AD6BE1FBD782E2EA6D204ED32DB5A0701229DA5E8EC -CBB429C93B90A92585798E85E39D6FC3B6D6D169B7DF664B799EE22D8AA4876D -9B8862B9FF00963171D3E53C726A4F0AB6BDA4EA169AA68F6B713AA48DC2C4D2 -4722C4A25915940F9D5506E7ECAA7270391E562F0D52B2F69465692E9D1FA9E4 -E330D5EA25570F3B4E3D3A35D99F7B7C00FDA034FF008CBA7CF637300D23C5DA -6055D434D9186D27246F8727732123D3E524024F04F91F8F3C45E229FE25DB07 -59307ED2F26F250C4E8C8150363E5C648038CE0F706B91F1A6949F0F66F09FC5 -9D12EADFFE123D3EEA39FC43A1C3B6095564453243B51368081A689846098F00 -388DFF00769F5EE8161E1AF1FE83A6788E3D22DA58354B58AF22692DD0314750 -C37606091BB9CFA7E5E452A8ADCCD6BB35D9861ABBC4525392B4968FC9953C5B -712DEFC16D56E6E39B89BC3F2C9292319636CC49C60639CF181FE1F9CCA31DBB -57E957C4F5C7C35F15614281A55DF18C7FCB17ED5F9AB8F6AF732CD613F53A9B -1D8F6238FF001F6ACCF112E344D438C7FA3C9DBFD96F6FF3FCB47691DBA550F1 -0205D0F51007FCBBC9FF00A09AF6EDA32A0ECCF1D239E9EBFD7DBFCFF231EDFE -79FF003FE7808E7A7AFF005FF3FE7831EDFE79FF003FE78F30EE0C7B7F9E7FCF -F9E0C7B7F9E7FCFF009E0C7B7F9E7FCFF9E0C7B7F9E7FCFF009E000C7B7F9E7F -CFF9E0C7B7F9E7FCFF009E0C7B7F9E7FCFF9E0C7B7F9E7FCFF009E000C7B7F9E -7FCFF9E0C7B7F9E7FCFF009E0C7B7F9E7FCFF9E0C7B7F9E7FCFF009E000C7B7F -9E7FCFF9E0C7B7F9E7FCFF009E0C7B7F9E7FCFF9E0C7B7F9E7FCFF009E000C7B -7F9E7FCFF9E0C7B7F9E7FCFF009E0C7B7F9E7FCFF9E0C7B7F9E7FCFF009E000C -7B7F9E7FCFF9E01C7F0FE7FE7FCFF231EDFE79FF003FE7831EDFE79FF3FE7800 -FD4EF8A5FF0023DEA7FF006CBFF4525147C52FF91EF53FFB65FF00A2928AC0D4 -E9BE1244B07C27F05C4881634D0EC9547A010201FE7FC8EB18633C0E9FE3EDFE -7F9729F0A47FC5ADF077CBFF00305B3FFD1095D5B0EBC0E9FE3EDFE7F97CBCFE -2679C0475E074FF1FF003FE7808EBC0E9FE3FE7FCF011D781D3FC7FCFF009E02 -3AF03A7F8FF9FF003C665011D781D3FC7FCFF9E18EBC1E0F4FF1A53C93F2E314 -483E56E3B1FEBED571DD13B9F9FF00F1F947FC2E4F15718C5E7E5F2AD79F636F -4E3FA74AF41F8FBC7C62F1576FF4BFFD956BCF8F51C631FA7F9FF3EDF6B47F87 -1F4364264F1EDEDD3FCFF9F600E9C1FF003FE7FCF6146481D3FCFF009FF3D1E1 -02D6AC6CFD2CF0B0FF008A634AE3FE5D22FF00D16BFE7FCF1B0063B01FD3FCFF -009F6C9F0A2E3C2FA437FD3AC5F87EED7FCFF9E35B18C70063F4FF003FE7DBE3 -5FC723141D31C01FE7FCFF009E89C852C1738CF1FE7FCFF45DA4E30B939E07F9 -FF003FD3E5AFDA63E3F4E97B73E0FF000DDC79288026A17B0B159376398508E3 -6907E623DC7635A52A52AF2E5433ABF8C1FB51D8783676D2FC2F1DB6B5A9A332 -4F7126EF22DCF1D318F30E4F6381839E4607C89E3BF8A5A87886FDEFBC45AC4F -79724B4C914AE4AC793C845E88BC6303038F6AA16DA65D6B53F87EDE3BDB5D0B -4AD6750934C4D7B51DE9670C8822DFB9954B2AA8B888B1C1C061C63A7A8E85E1 -2B4F879F13ACF40D6745D660BD8ADEFBC31E3DB6B2B6F3ED92DE48CC70EA36B8 -46327EE9A2B91BD4FEF604900025503E869D1A745251DFB9AC61DCF049FC6F2B -332C36CA8849259C93CFAE001541FC55A8C87FD704C1FE141FD456DCDE04BFD3 -E6BC5FECDBB9EDECED92F24B8FB23AAADB34891C73B0C7EED199E351BB186755 -E09C551F291411B4003D001FD2BF78C93C2DC4E7184862E78B8C63349A497335 -7EFAAFB8E29E25425CA96C5587C51A903C4A243E85013F90FF003FD3ADD2A0F1 -2DFF00872DB5F5D1C4FA2CBA91D2209E094798F7A555C4691F2EC7691920606E -50482403CE3A218D808C16C606064E7B57A678B7C77E2DF077823E11E972695A -3E9E3C330DE6B3A3DED839FB4096F6772269595C2F9D135B2142B8C796BBB255 -947CCF18F054F84634A72C4AA9ED1B4972F2EDBBDD9B51AAAB5FDDB583C35E38 -F10FC32F165DDBD85E5D687ACE9978F05FE9F2314FDEC4C55E3993387DAC0A9E -A3DFA11F57FC1AFDA934EF19DC2695E288AD746D5E460B04D1EE16F3920E473F -EAC8C7F11C1C8C10702BE49F12EADE0EF132FC35F09E933DB59691A0D8C97DE2 -0F1545008350BFBA9D16EAF543385F35A15416D0ABE373A1C9DAFB864EA10CD6 -16565AD49A6EA365E12D76F2EE1D02F3557479AE22819772C8540DCCA2588175 -5084938FBADB7F2AAB4A9D65696FDCD9C2CEE8FD46C63F8704751E9FA7F9FE4A -AA41194C63D7B7E9FE7F97CC1FB337C7B9EFAF6DBC1DE259CCACE36E9D7F212C -F903885C93D303E5638E982795C7D44AA30B85C0FE5EFF00E7FA71E2D5A4E84B -964620A8011F2E31FA7F9FF3EDF00FFC141463E2EE82DB4657428F03D3FD227E -3DABF4002608E00C1FCBF4FF003FCBE00FF82822E7E2DE85C600D0A21F4FDFCF -5BE13F8A8B8A67CC4A8032EE03E63925B8FF003DFF00CF4F5CF05FC16D334DF0 -9DAF8E7E27EA175E1AF075DC2E74BB4B058E4D575C914E0ADBC473E547F789B8 -906C057680E481563E067807478F4F9FE20F8B34F5D77C3FA75C9B0B0F0C4424 -7B9D7F53281D2DE358D4B79718659267E0842A8B932003CEFE2478DFC43E3BF1 -7EA9AC78B1E5875757685ECE6578D6C5158E2DE28D89F2A28F76D4886022E000 -074F5DCE3CDCB73A2C7A25C7ED1F75E1AD263D27E1AF8734DF8776F0CA645D66 -D009F5F954A8DCB26A254301B803885625C2F4C824F03E2FF8DFE35F15C3E478 -9FC73E22D7D339106A5AADC5D7623A3B1ED91F89AE1EDDAE7C417220B44922B3 -0CAB24C002F8E33E99F61F9E3B7BDB7C12D23E037C62D16EEE459F8F3C336F75 -67AC5A5C4F6E0DA6B3A7974950189D7F8D418DD187CAC1D493B4934A37D90394 -63BB3C12D75D53771476F6325D0DE31190C039CF0B8519E78E9EDF87AFF8D7E2 -C7C41D4FC39E25BBB9F87763E1ED0BC51E5DBDD9D3F4592D6DCBDA185C344718 -8D9408C301F29121254B6193D52D352D03C0FE23F899A5F86EEE7B6F096BB0C8 -9A5CF6CDB5A248AF21BBB466185DAC9E42A13C952CF8EB91F427C7BFDAF1BE26 -FECADE13F0A5A5C09B57D5112C7C497172DBA4F32CC42E597181FBE930D9C7DD -56047A57B2968D7527DA459F997A7F8BDACA6DF0B5CD84F8C1685CA9EBED8CF2 -07E43D063D36CFF684F885791DA9BAF1AEA7E22B2B794CCBA76BF39D4ACF7E0E -4B5B5CEF8C93C8E57B9191938F6FD72FBC29AFFC57F89BE2F9ECACEFED2E9B51 -BAD1349D5AD639A29E4B89CC28A632AC15A18A6966519C06B7419E8B5E516DFB -30C57FF0FF00C4BE3CBABFB8F0F6976045869D24100985EEA8544896DB72A635 -F283BB49D140180C481572A4D2D04AAC65B9A12F8EFE1D7C59D7A26F18785E1F -871717322C6FAE782ADB6D8C0A48CCD369ADBB763927C8922FE2C231231CC7C5 -4F83DAD7C2D974DBD98C5AA78535B5967D07C45683FD1F53B74206F50798DC64 -6F89C0743F290315E67F6CB9D36F3EC3ABC0D05C9C005B1824FA919FCFDBF2F5 -3F843F15E6F87DA8DE695AB2CFA978135F55B4F1068A144BF6881811E7428DF2 -0BA8F25E19081B1D573F2EE158EA8DB5479D1182180C63821B918FCBFCFF002F -D08FF827B47E5FC18D646739D7E624FF00DBBDBFF9FF00381F1C7C61F8671F80 -750D3350D26ED756F08F882D8EA7A15F8903C8D6C5D97CAB82A02ADCC6576CA8 -B90181209520D7D93FF04F950BF0675BC0C7FC5413F1FF006EF6D5C98BD69184 -AC8FA728A3155357D5AD341D2AF352BF9D6DAC6D2269E799C1C2228C9381C9FA -0C9AF0926DD9195CF16D5FC15ABF867C6377E21D56E1AD3C3D63782EEE6F669D -0858C3962DB546FCFCD8C0EFC735E6BF14FF006B8D53596BDD2FC2110D3F4FC9 -8BFB52453F699467EF20E0460F03905BA9F94F03CEBE3D7C72BAF893ABCCC276 -B4F0B59BB1B4B7C3292A31896450482E7191FDD0401CE71E5167E17BDF1A6B3A -7D96A77C7C25A3EAB6A2E34BBFBC0638AEF7332C65DF9F2A3631BA872B80C067 -6AE5D3E828E1928A9D5577D8718F726BFF00135E6BBAFBD95B477FE21F105D6F -98DBC0AF3CF2E14BBC8DC127E5424B1ECA49E3355C695E2C9BC129E291636965 -A30D41B4BF32772F24528896401947001563839C7C8DE95B3ACE9DE24F86BA8F -867CCD1A7F056A769A7473585DDADA9B1B89E3324A56762002F264B2EF3CE114 -1CE2B57C3DABFC3FD1B4BD2D6FB4DBCD56FEE166935157CEF81BEE47E4331098 -2158B36D2537AEDF995857A69BB58BE5466EA3F0D354B4D77E20585A78CACF53 -83C316AD7515E5AD8ABC778A2EADE01B4894ED07CECE7270548F7142D7C2FAED -CDCF846D74ED674ED5751D7D326D248FC816521B992048DE4DC402C103F38215 -C1F4AF52F827E02BAF16F807C43A9E9D6DA7DC59E8493DDF8A0DDDAC724B169A -638A38BECECCA4ACBFBCBC946D2BCDB2B6772460F92682DA3A3DDAEAF14EF0BC -42386480E3C972E9995863E60A9BCECEE71D7A52B5C6D1969E24BED3EDE7B9D5 -74A9ADAD22916096FA30648119F7EC56603E52C237C06C1214F1C1C7B07C2FF8 -FF00E27F006D9B4AD44EA7A518F67F67DF3BC902E3046D00828C00EDF8FB703E -248F458275B5D2751D46EAC0B0764B84001936A6E9309819272172BD15BE639E -13C57E029EC9B58F17450DA7855EE6481F4CD061DAB1CEB3AC7320F2400D1C42 -06044C7EF3140036E665524A7A495D1364CFAF57C5EFFB41C76F75E1F94DA6AF -6D0325CE86F32892DC6E23CD567015C1DCA370C11ED9C0F6FF0087BA0DD786BC -2763657A08B940CCCA5D5821625B00AF1DFF00535F99DE14F136A5A66A56F3C5 -F6BD175DB358E7C10C92A02AAC8EA7B8656420E7907D2BF41FE047C6BB5F8BBA -23C73A4767E20B24DF796D1A1588A96215E2E4E4600C83D0F1E95E1E2F0AE946 -F0D57E464D729E99B493D314E0B803207F9FF3FE7B38274E3F4FF3FE7F402F4E -31F87F9FF3FA78E2B8DDA3D07F9FF3FE7B394E08C8C81DBFCFF9FE8A233DC63F -CFF9FF003D1426DE71923B5215D1F09FED8377AB78FF00E3A47E1CB211B5AF86 -F4A372C92DC2DBC71190C65E4677217A3423DB19A8B5DF08A7842E666F10F849 -F4EBED334FB78B554864D383403ECB05ABED42CF8936DC477024C1779A51C2B2 -175C8FDAAA7D57C1BFB48F882E6C2E64B06D6B4A80F9887E768BCB890A83DB2D -09E9E958BE14F8AD6169A48B4F14DC6B5AADACB09D36F6D218ED9E0363E48454 -8566564470D05A0DC132421C105457D6E197EE6363A21B183F12A18346F05E99 -01F0CDAE91AA699712C77D30BA89DA725628101552E5583DB4CCD19638323B8D -A1C01E491E9D79AACC4EC9279396F972C7F018E07F9FA7A1FC42F12CFE27B38A -DD6557B68E384B21B0B78DC34664C1F302EF248909720AF98E433025148A7E11 -BB7D307991EDCB2ED20FE07B7D2BA796EECCA6EC8E32D64B9D267404B34390AC -87B7B8AEE74BF10C9A35B7951585ACCC7CF591E48DD9A6496131321C30002AB3 -91800E58F3C0DB93AF5B1B8959F19924624ED1C649E78FF3FE1D0F833C311F89 -750BA86768A28ADED24B9F3A4B948026CDA4E3783E61232020C1270490AAC425 -0B6E0DDD1E85F0F75C8BC5DA5FC454D79AC2D6E3570F72921B6924983BB39923 -B7C7CB1EE2C092F8C01C11CD7D17FB0AEBB7FABFC0C36D7F7066FEC8D566D3E0 -27AAC412390293EC6461EC0003A71E13F063C2B0E9B2F8C350B4D6E4034FD29C -CB159EAA915C794C85C338087CC8C84CB221C85FBDB6BDABF604265F83FADDD9 -4C7DA3C45732EE2720EE8203C1C73D0F3DB1F97C9D549626BA86DA7DE7CE6197 -2E371096CF95FCEDA9EDBF1439F86BE2A38E9A4DDFFE897AFCD3C71D2BF4BBE2 -7A0FF856BE2CC0C7FC4A6ECFFE417AFCD1038E95EDE57F04BD4F58523AF154F5 -B85E6D1EF91232EED03A8503249DA7802AE60F380694B633B9703D7D3FCFF9F6 -F75EAAC54773C78F86355CFF00C83EE07FDB3E947FC231AB7FD03EE07FDB3E95 -EBE648893FBD8C73FDE146F8BFE7AC63FE05D2B97D947B9D1ED25D8F20FF0084 -6356FF00A07DC0FF00B67D28FF00846356FF00A07DC0FF00B67D2BD7F7C5FF00 -3D631FF02E946F8BFE7AC63FE05D28F651EE1ED25D8F20FF00846356FF00A07D -C0FF00B67D28FF00846356FF00A07DC0FF00B67D2BD7F7C5CFEF631FF02A37C5 -FF003D631FF02A3D947B87B49763C83FE118D5BFE81F703FED9F4A3FE118D5BF -E81F703FED9F4AF5FDF173FBD8FF00EFAA37C5FF003D63FF00BEA8F651EE1ED2 -5D8F20FF00846356FF00A07DC0FF00B67D28FF00846356FF00A07DC0FF00B67D -2BD7F7C5CFEF631FF02A37C5CFEF631FF02A3D947B87B49763C83FE118D5BFE8 -1F703FED9F4A3FE118D5BFE81F703FED9F4AF5FDF17FCF58C7FC0A82F10FF96D -1FFDF547B28F70F692EC7907FC231AB7FD03EE07FDB3E947FC231AB7FD03EE07 -FDB3E95EBC5E2E7F7D1FFDF54BBE2FF9ED1FFDF547B28F717B59763EDDF8A5FF -0023DEA7FF006CBFF4525147C52FF91EF53FFB65FF00A2928AF38ED3A7F8523F -E2D6F83BE5FF00982D9FFE884AEAD875E074FF001F6FF3FCB94F8523FE2D6F83 -BE5FF982D9FF00E884AEAD875E074FF1F6FF003FCBE5E7F133CE023AF03A7F8F -F9FF003C211D78FD3EBED43704FCBDBFC680A7A91838FF001A8430DB8078EDDF -F1FF003FE784907CADC763FD7DA9E475E07F9FF3FE7B3241F2B718E0FF005F6A -D2D66811F9FF00F1F78F8C7E2AEDFE967F0F956BCF7D3B7F4FF3FE7DBD07E3F8 -C7C63F14F1FF002F7F97CAB5E7EABF862BECE8FF000E3E86AB6041820E38A7E6 -900C63DA803F0FA76AD1833F4C3C2C31E18D278C62D62FC3F76BFE7FCF1A87E5 -ED8C73FE7FCFFF005B2BC2C31E19D278C62D62FC3F76BFE7FCF1A840C8C80077 -C8FF003FE7F4F8C9BB49D8CCF30FDA17E26CBF0D7C0866D3A7116B77D28B6B3D -BB5DD32373C9B0F501463A60332671DBE0782C0788758B4F0EC5AAE99A1CF7CA -425E6AD3182D813954569402232CC31BDB08B8CB328048F54FDA63C767C5BF13 -7546756B7B5D1B76991A9C0E23760ED8F772F8F6DBE95C9FC2CF1BE99A0784B5 -AB8D62DFC31E35F0D4F7305C6B7E09D614D86A2F206F2D27B3BA44DD950E17F7 -72EE1E64ACD01452E3E8B0F4D51A5E6CD2291ABE25D374297C272687A5694DF0 -F7C5B7B796D0788BC1BE2097ECBA7A612592D6FEC9EE6469A3291EFDFE7C879B -C0B1E518018BA569DF1934CF19E912452DCC5ACA5DB6876314EF09064D3A24B5 -8E06072ACABE72DBA6E1B5DDF6A92D9C79943E24B6D03C6371AAF87ECE686D22 -924FB043AAC8279ADD18108C64554CCAA3056450A518065DACB91D30FDA03C68 -BFF08D05BDB48D7C392C73699B34F80342635844419F66F9420B68302566FF00 -54A0E40C0E8B5D1ADAC7A5FEC7ADA5FC47FDA93C0BE19F892969A8E817315FE9 -125BEA856142D34176E88080A44AD73312841DE2475DADB82E3CEFF689F8757D -F047E36F8CFC12CB345068FA8CB1D99B978E599ECDBF796D23B20DA59E178DCE -00C1620852081C56852EB8FAC8D6B4B9E7B5D46CAE16E5353866FB3B5B4E0EF8 -DC4B91B1F7292A410415E391C7DBDFF052EF07DA78F7C25F0B7E3DE95A3269B3 -78A2C174DF10C10CF13ADADFAC7BE3824C224B25C26DBB824661F2FD8D119632 -A01FA0A3C439B61A8C70D431538C22AC92934B76FA3EED99BA7096AD1F08AEA3 -72D11C90430392476A8304638C6DE83D07F9FE5EDC2042AB82A4103B8FAFB7F9 -FE4F30B142FB0841C16DA48079E3A75E0FE47A76E2C6E638DCC795E36B4AA72E -DCCDBB5F7B0A3151F851ED9A37ECEADA6E9FA56B37DA9D85F433585ADF4964FB -248E47B86B4FB3DB32C372B34687EDB079B21F29916405379DA2BED3F8457FE0 -5FF8289FC149FC3FA8F85F44F0AFC52F0369ED61A142924A2CA181911216488B -12F129891195C49E59DA4677ED3F99EBE25D5D21B489753BB48ED6096D2154B8 -7511C126EF3225C11B51B7306518077367A9AEB3E0AFC70F187ECF9E308FC4BE -0DD525D3670152E2D5406B7BA881C98E48C8C306FA641E4104023C992695D9B7 -99D778D7C0BAD7C29F176A3E0DF113D94F7FA6C863FB5583996DE42BC300ECAA -5991B72E768208F6AFB8BF67AF89B37C4CF02473DFC8926B161335B5E305552E -461924DA3800A9033C6595FB28DB37EDE3E0FD13E257C17F0FFC5FF0BE9925CD -D6BB0D95C5BCD249B1A15689E452F1A0606468CB44D966DA42A819F987CABFB2 -F78EC784FE27E979433D96B28BA7B8047CA6475F2DB3D3EFAAFE0C48AE0BBC4D -39C2A7C71FE91E653A9294A70A9A4A2FF07B3FD0FBD150F184C73E9D3A7B7F9F -E5F07FEDC7A15F7897E3BF84B48D32D1EF354BED26DED6D2D621969667BA9951 -00C724B1031EF5F79050A10E08EE72318E9EDFE7F0E3E4FF008F3A35C49FB537 -85B57B7B816975A0F85EEB5DB4976E42DCD8C57D790678C106481011D304F1DA -B930AED515CEC83BBB1E7327C59D0BE11FC53B7F0362E345D0BC29A7BF8726D5 -B4BF36E24FED2F314EA37B1A8910E269A3215837FAB860CA10190F85FC75F135 -AFC64F8970368FAE6B5E23B1B4D3E1B39354D6A048A593CADCA0A842DF21CEE5 -2D86F99B772335C778C2D26D0ED3CCB8919AE2E99950B039CF5624E39EBFAD7B -BFC16D37C0FA8F802D3C35AF785AFAC7C4024373178B74357BAB83193B8C5359 -3C8B1C806E6025578DC009C36083DF0C142789FACADED63A2551C616670FA0F8 -6AD748D3C288D44683736781EBDEBB8D4BE237887C53E09D07C24E22FEC7D0A7 -9E6D36768F13C42660F2C60E71E5B3A87C302C09382A32B55BC4FE186D37C597 -9A1C77D6BAB41A7CC10DE5896F267703964DEAAC00CE30C01C83E95D77873C24 -B2AA7C9CF61B49FF003FE7F0F5E535F0C4E551D39A47051F8364BC97CE9D4CB2 -31DDB9B9C7F877AFA8FE3B7C04F04E85FB34FC377D0BC45E12BFF18E8BE77F6E -C1A55C591BCB9FB53093E778E6669BECCC04231BF2AC5C6C5535CAE97E092FB0 -08F271D71FE7FCFE97AF3C0ED1A61626F4E463F9D1CBAA7739A552D756DCF9C0 -E917BA3B3B5AC8D1827952321B8F4F5E3FCF6EA4FC4BBCF11F87B42F0D5FAC36 -76BA4098DB470A1512C92485E49A424F3290634CF1F2428303049EEB5EF08792 -8CC62E403C6DC5796789FC3A620CC80AB03953D0FF00FAFF00CFD37574EE73FB -4E8CC9F19F80AD7C4561E54A8559013148A798CE3F97038EF8ED815E3B6AB369 -7A84DA4DE63ED36E4AA1507E703904647A608E9DBF0FABBE0478497E2B6A77DA -65FEA834EFECF83ED1279168F7371326F55FDDC630A5B2DFC4EABC724702B93F -DACFC23A65A45A76A1E1CF074FE1E4F0FB18EE752BB6925BAD5198A0124E49F2 -E32363111C630819812700D675A0A5AC4EFA1535E5657F827037C52F00F8ABE1 -2AE9ABA96BD3AC9AF784762E2482FE28D5EF62CAAEE6FB45A5BED0A720C90403 -0A496AFA7BFE09F441F833AD63A7FC2413FF00E93DB57CAFF037C476FE11F1F7 -82BC6908654D3B51B5D41D578C049559D739F40EA7F1FC3EF1FD903E12EA1E16 -F0878D7438FF0078DA4F8B6FB4F90956FBD1470A13D3DBFCF6F0717512A4CE8A -AADAB3D4C90393C01EB5F267ED8BF137ED9AA43E08B267486C996E750765203C -85434680F521558B1ED923B8C57D8BE28D0EF3C21E19D5F5DB884CB06976935E -488B952CB1A3390091D4EDC0AFC95F893AC5F402F6E6EE469B53D42721A597AB -C9264973C0EE79C7A8FC33CBA11A92751EC8E6DD906996326BFABC7A8EB1A46A -177F0FEC2E85B5F5DD92151248C0022394A94DEB90CA1B827683C1351DCDC48F -145671CB3358412C8F043336445BB682D80301888E30C47F747A0C75BE08F85A -FE28F086A177A2CFA9CB69A4E96B71AA347A6B4D1C736C92491A6911C6C8498E -42B2381F3B6CC7CA5EB884CAC792BC8278507D7DC7F9FE5F40B5DF73A3A58F69 -F8DBF11F46F12786EDB48D3A5B1D52FAE7C49A878A2E752D3E1B98E206F23B65 -F2B1704BAC9BA072EA0BA8063C48E7711E302304A9DA37018076F4E9ED5E89E1 -EF805E36F11C1E099E0D3922B7F17DDB5969971724C68D2027064F94EC56DAC1 -4F3B8C6F8FBA7117C38F83B75F132C356BAB2F12E81A5FF65C4F777506A8F3A4 -896D184F3260121705433AAF5CE41E318342B2425647D01FB14786B49D6BF67F -FDA7E7D474BB2BE9ED7C2C9F6796EAD924687105E4C3616195C4B041271FC50C -6DD5571F2101CA9C723A1C74E9ED5F67FEC2CCBFF0CF5FB552A9048F0B2E40ED -FE89A9607419E00EDF9741F1781D38FD3E9ED447E2917D10AA08DB81F7718E3A -74F6FF003FCBD13E3BF8DA0F88DE38B4D793517D62EA7D0B4886F6F240773DDC -7A7DBC7719247244AB282718241C641CD79D1036F20631DFF0F6A444218B371E -BDCD69CBD48EA6BF8A5FFE13989B5A79357D5FE27DDEA4363AAAB43710B28C21 -182EF3349855550A1405009E83A3F84DF126F3C27AE69DE25D31DA2B885B1710 -7037A671244FDC640E9C10467820622F85BF0F2FFE216BC961A66BFA6689A84D -736FA7D9ADE5C4B149773DC3796B14622467C70C1988083728661B8571EA9A56 -83E2E48B49BCBDBED335381583DE5AA5AB899701BE459241B4EE041DD9EBC2F4 -19B49BE57B313D51FABDE18D76CFC57E1CD375BB125AD6FADD2E103104A6E507 -6B6090181E08CF0411DB8D3C01D87E15E43FB07C571E35F09EAFE1C96E6348F4 -731DC5A2EE01FCB999FCC5DB8C90B22E739FF96A3F0FA99BE10C801C5C9EBF97 -E95F1B894A8D574D9CDCB27B23CDF3ED4A074E31C57A47FC2A09727172473DFF -00FD54E7F83EFC6DB96FC7B7E95CBED223F673EC7C09FB7D7816EAFBC37E18F1 -7D9DB975D1EE24B5BE78D0B32C128055D8852022B46465881994773C7CA3E0FF -000D5DF8DBC43A668FA62192E6FE511C6C91BBAA02325C8452DB154166201C05 -3E98AFD81F1FFC31D2E0D12EB4FD66E607B1BF824B69E39E6F2F7C720F2CA83C -1E77E32082323D78FCD1F1EFC12FF8673F8A3A6EA1AD6977FE20F86CB7C9756D -3D934913A8570C2DA6990662CF09E6839DBF32F3C2FD0E03151E4F666D093D9A -3CE3C63F0EB57F014B026AA615796430881049E6C0E90C32B070CA31F25CC60F -539DC30300D732ECF689BA14258FF0AF6AF5BF18684FF117C4375ACF87151B43 -BEBFD40E9BA67DB3CCFB05B463ED321080ED8A20AECC0FA2382494C96F80BE19 -4FAAEA5269D75A2B5D5DC8B05E25BC8972939B504492C91EC04797E4EE667209 -0A015079C7B4A5A6A5EFA33CC2CEDD6F6F628A4B88ACC48E14DCDD6E11C59FE2 -6C29381EC09E0E056B7887C2575E1CBA9ACE59E09EF6DA76B3B8B4B6123B4120 -6741B8940087F2DCAED2C76804E0D749AC7835ECFC5D2DCE9016D6081F7C335A -99228A39628C492246F2B162CAD9C64EE625781B828E974DF17F873C35A36BF6 -BE3596EFC51A95CDBC771A15DD9B169ECEF9D5E663BDD83329964F2E48CA3672 -58306442D156728C6F05776F405FCA9D8C8D4B4E1E11F8769A0A696975E2BF11 -95B682D668255BC49A42A3E450CB9251D07CD9E7A0190C7EF2F82BE008FE187C -2BF0DF86D2248E7B3B34FB5796721AE186E98838191BCB60F1C01C0E83C9BF64 -2FD94F5DF15EBB61F137C631BC12A420691A6C90B46F6EA55D37C80AE7951B94 -60FDFDD9040AFB5C7C21774DDF69209E7A1E07E22BE2AFEC94A3395E52777EBD -AFE478F83C1CE8464E6EF3936DBF5D8F11F89EA4FC35F16003FE61377FFA25AB -F34C2FCA0E3B57EBAFC53F84660F85FE3194DCB911E8D78D81EA2073E9ED5F95 -A7C2122F19618ED8FF00EB57D165334E12B1DFCAE3B9CE631D88FF0026A96B83 -6E8B7FC60F90F8F6F94FB7F9FE5D7FFC22320EEDE9D3FF00AD59FE24F0B341A0 -EA2EC5805B790F1FEE9F6AF79B561A5A9E1BF64553B429C0E060F4FD3FCFF205 -B2F1F291F8F4FD3FCFF29546429D98E738F4FF003FE7A7005C6DF971CFE5FA7F -9FC38F3AECEFB22216CBC7CA47E3D3F4FF003FC91AD41030AC3F1FF3FE7F4982 -E36FCB8E7F2FD3FCFE1C0171B7E5C73F97E9FE7F0E0B859154D971C2F3F5E9FE -7FCF4E0165D3E5C7E278FF003C7F91C5A0B8DBF2E39FCBF4FF003F87005C6DF9 -71CFE5FA7F9FC382E2B22A9B23D42FEBFE7FCFD384FB11ECA47E3FE7FCFD38B6 -171B7E5C73F97E9FE7F0E00B8DBF2E39FCBF4FF3F8705C2C555B1C763F89E9FE -7FCF4E13EC47FBA47A73FE7FCFD38B6171B7E5C73F97E9FE7F0E00B8DBF2E39F -CBF4FF003F8705C762A7D88FA1FCFF00CFF9FA7086CB039538FF003EDFE7F0E2 -E05C6DF971CFE5FA7F9FC385518C7CBDFF002FD3FCFF0022E16287D8D41E878F -7FFEB7F9FE4BF6203F84F1FE7D3FCFF2BBB01C7CB8E7F2FD3FCFE1C344438E08 -FF003F4FF3F870EE163F4DFE297FC8F7A9FF00DB2FFD149451F14BFE47BD4FFE -D97FE8A4A2B9CB3A7F8523FE2D6F83BE5FF982D9FF00E884AEAD875E074FF1F6 -FF003FCB94F8523FE2D6F83BE5FF00982D9FFE884AEAD875E074FF001F6FF3FC -BE5E7F133CE023AF03A7F8FF009FF3C18E4F03FCE7FCFF009E023AF03A7F8FF9 -FF003C18E4F03FCE7FCFF9E216E86291D781FE7FCFF9EC8EBC1C01FE73FE7FCF -0A475E07F9FF003FE7B0475E31FE7FCFF9E9B88F877F68EF00EBFA4FC43D775C -9F4B9FFB1AF2E04915F463CC8B055461987DD39E30D8271C5790B2E3048C57E9 -CDF69F6DA9DAC9697B6D0DDDAC830F05C2092361907956041E54707D2BE69F8A -DFB22A986EB50F03C8C6E4B6E1A45C3204E4F22390950A00E42B7A7DEED5EEE1 -B19069427A32D33E5A1C7A0FE95B9E17F05EB9E35BE369A1E9771A8CEBF7FCA5 -F963EBCB31C051C752457AEFC30FD94B58F151FB6F894CFE1DD341C25BB463ED -3280D83C37FABE879604F7DB820D7D63E13F04E8BE03D356C341D360D3ADC001 -8C6803C8403CBB7563F31E4F4CF6C606B88C6420AD0D58EE5CD12CA4D3F45B0B -69828961823470A73821003CFD47F9ED66E2E63B1B792E65611450AB48EE7F84 -00493FA7F9ED36C3C9DBEE4E3A7F9FF3ED8BE3DB4BBFF8575E29B8B680BBC5A5 -5D48B838C621739FD3FCF6F9DDE6B9BB927E696B4D16B3318F53D4E3D352F6E5 -44FA95DC7248916E60CCEEB1AB3B0EA4ED04F3D2BA5BDF8A973A8789B4EF0FF8 -8A1F04FC47B2924B68E3D4A1D361D26631878D46EBF686DE543B14C7BAE37220 -2588C2A910F843C3BAEEB9E37D074FD0ECAC6FB556BB66820D4EDA2B8B691A38 -9DCEF8E51E5B8C29E1B8F635D47C74BAD5FC40B17C3DD73C1FE06F0DF88EC6EE -098CBE16F0AC769A95CCA612238DA4B6251838994954006E55C6318AFA3AB89A -50ACA837EF5AF6F23D5C3606B57A6EAC2D6F39457E0DDCE6BC5FA2FC37D396F2 -E346B7D11A0B4D462B58A55D5253F6F296A9E708E0F3BCC86D5AE11FF7B2B2C8 -56E93632F93201E51E2D86CE2D7EF859430C1017F30416C58C30B3A867890B16 -2CA8E59158B365501DC7391B765F0CFC517CDA7BC5A3EA32FDB77FD936DAC8DE -7F9791279671F3EDC90D8E9CE7150A782F11AA901768C630005E318EBEDFA7B5 -69CC93D0E469DB52D7C3EF18E9DE1DD2FC4BA46AD6ED2E9DAD5B451C8D15B24B -2A3C53A4ABB4964655215C30570092A595B62EDFBDBF65FD7B45FDAB3F674F8A -9F0C23B23A978874BD453C55A3D8EBF72B7B34CEE5649561F3A652ACD324E924 -BB9630750DCCA16468CFE78DEF861AD727B0E7008047E7FE7FA765F04BE2178A -3E136B9ACEA1E10D7AE741D4AFF497D36E67B658FCDFB3CAC8CEA8E4128C0C68 -7CC4DACA470C314DB4D5D0D684DA4F893E1541AAD99BDF0DEA536992F92F740E -FF003A151149BD63FF004A01897F248673C0DF90D8F9B9AF1EF8934BD5AFAE60 -F0B4777A6E8975706EE7B078FCB8FCC59AE4407607704A5BCC1324E725F9392C -62D7341B6D39965823CE70A220001F8670001D3F0FC2AFD9F876D99165DAAAD8 -F99401C7E98EDFE7B4B924AE238816B371FB961F87F9FF003FA7AA687E0EF0D6 -A5E08D15AD534FBCF15DD6E596D2F2FA4B550717FB8B392888542D932E594333 -A2AB3112A4750E8F6A06046063B6071FA7F9C7E534563144142C618AE762B004 -027AE38E3F0C74FAE23DA363B1FA41FB3AF88EDFE237EC93F12BC1DE0F10245E -0ED5EF2D342592DDE6796C4389E09645B90D8925FDFA760A30405E0D7C11E15F -0DDF784FC4925BC8E62B9D32EBF7522302C8415962604679DACA7FFAE38FB43F -E095B65A6C9A6FC4BB73AAC134F72B6B0DC68EB6AE0C30A094473F99F730FE64 -8BB000C0440F4615F2DF88EDAD748F186B106957C9AC69D0DF294BE8EDDA1120 -F2506ED8DF32743C1E78F7AC29B7F5BFF147F27FF04F2AA271C645AEB177D7B3 -D34F99FAED3F81749BBB23711A232346591867041048C7238AF82BF6BCF0DCDA -47C46F146AD6F0342BA4F8211D26642028B9D4FEC67071DE3B997A76CFE1F7DF -802E66BDF861E1CB8B8044D2E8F6D238EE18C0A4E7F1CD7C8FFB5FC5F6DF0D7C -5ED405BF36BE1BF0FE9E171D15F5999F71E07FCF1518EC48AF0306DAAF6F53D0 -4973687E62CBE11B8F897F177C31E13B6040B94322855CF1B5D9FA8FEEC55FA0 -1A57C0DF0FFC0BF857E22F166A56306A7796160648E120E0CDB76C59EB8F9D97 -3CF40723D3E4DF8012F82BC3DF1FECBC57E32F134FA2697A769F2C4B241A6497 -6CB7ADB55212A87215E196570FC02629171F2E6BEB5FDA4BE3C7C34F16FC00D7 -B4BF0C789E7D56F6E5AD57CA9B4E96D542ADD44C5B7371FC18C7BFB57D243154 -A9AB3959B379E0F1155A942178F57E47C9BE0CD359CA3B65D98EE766249273C9 -26BDDFC25E1F1288C08B3EF5E2BE09D674C844425D42DD08EED20FF1FF003FCB -DEFC15E2FF000D44C03EBF60AC339FDF2FF8FF009C56CAA416AE48D254272D23 -167A2F87BC303E53F6709FEF74FF003FE7E9BD79E0857B7761143EB9F9B9FF00 -38FD2ADF843C6FE0E1B03F8C34B8FA0F9EF540FF00D0B8AF45BFF1AF80DF4DF9 -7C79A3097182A2FA33D3D46EFF0038FCB7589A2B79A382581C44DDB91FDC7CCD -E2CF0F471965F29586782A4E2BC43C63A53C2F2EDB02F1827E61D07A9E457D3F -E37F15785E7773078D34C6273955BD43FC9ABC0FC71AB69124570B1788B4E7F3 -33F30B8520E7A9EBD78AD16269356E65F79CBF52C445DDC59E67F06FC5CFF0D7 -E37F85B576BB7B2D3DB5086DB506118903DABC8A255653D571C9FA6472057E87 -7ED27F06BC3DE3DF869AF409610412C96537957312619414619006075C1FC2BF -2FFC58FA7C64BC3ABDA16439468E65C823A1183C1FA7FF00ABF4DAE7F692F84D -6BE1C8F43D6BC6338BFB7B65B2B96B6D2679E1F31542B9575189067386070460 -D67531987A4929CD2B9BD3C062EB3E6A54DBB6E7E4B7C2E6920D3B51D3274632 -D95D383BBF87B600FA86FCFF002FDADFD9088B9B4F8B77413E4BBF885A9DDA63 -FB92C76F221E9D36B0FF003D3F1F2EB41B7D07C7BE2EB9B6B979ACF54D4E7BBD -34C96C6DDE6B033CA2DEE36364A0946E210E180407EEB035FAF3FB114A27F01F -8A58AED9535A852719CE275D2B4F59B9F4F303FF009E9F3D8F92951938ED73D3 -E49464A325663FF6E2F145CF86FE065CDB43943AC5F41A6B9538C464492B76EE -21C1F627E95F962FE1CB0F15FC48D3EC26F1269FE149F4BB593558EEF538EE1E -292712222467C98DCAB61F78661B4004123231FA67FF00050A774F83DA304518 -FEDC8493E98B6B8C76F7FD3F2FCCED174BBFD4FE25F8C9ACFC26BE254B5D19E4 -925686EA43A64616326E87932228D9D732EE4F515DD9646D865E6CE493F7D9B1 -E1CF8817FA3D96B2979A7DBDCDCDD8F32DA5B473631433794612D2C306D4B852 -87949410496241124AB279FCDE1FC8C1C0038C8E0E3B1C03D703B63F0EDBC38E -3E9C66976E793D6BD920F53F04FED1FABF8675BD2DF56D386B3E1FD1A4B39748 -D222686D1ECDAD582DBB35C470EF98880DC46778C6EB867C6462B96F0D789B41 -F0749E264D0F41BDB7B4D6B42B8D1985FEA29712C4D2C88DE706482352008C0D -9B73D7E7E8072C001D062993308E366C74E6906E7D61FB1369B15A7C02FDA791 -4E564F0CA86CFA7D9750FF001AF8FF00FB06D78C28CF6CAFD3FC2BD3FC22B611 -E9281ADE291A54CBBBA062C727AE452F8AFE0F78AB4AF0B5BF8DD3C3B75FF086 -DFB4860D4EDD44B047B2510B090A64C3FBC3B17CC0BB8FDDCD72D3ABCF36AC5B -4EC8F2E5F0FC0B9E7B6061718A78D16DA2E490AA3D474C7FFAAB47B5232EE232 -BB87BD756E677763B8F07F87F50F0640F749E1D96D35A33C0B6BAE12824B2470 -406891E272B2B3188ACEA7747B014DA4E569FED07E02D7FC35F0D747D4EFB57B -2B35D2AF6DC45A6DA6931DA899C398C02618C0924D9233EF9BE6215B2E58807E -9FF0768965ACFC38F0FDCDD948AE5ED6C9D83206DED1B26DC9F53B47A75C7AD7 -2BFB51E8B3EA1F06BC4AD6DE1B8FC41E4C0F72EBE54EFF0063548A426E0F92CB -8080F593746327729E31F91D3E26C6D7CC695076517369DBAD8FC56871866188 -CDB0F857651737176EA96DA95BF610F123C7F1D3C3AB6B70D6D67A8C1730CA83 -A346D6EF2AAF4FEFC6871EAA2BF51D5463A63BF3D457E447EC60F2DBFC53F873 -2428CA4CF6E8D8FEEB26D3FA13FE7A7EBC8E9EBEF5F639BAFDF26BB1FBA61D68 -C0281D05230C2E4718EFE829D48CBB863A7D2BC23ACF9CBE2D68DE2FD4BC61E1 -E4D3AF2CADECCEA93B6A3F6AB5790ADB8B6BAF2DE52278F7C7BBC8508070E51B -77CB81A9AD7C1E8F57F002E977BA6A6AD6CF6FE54F6D7110F2A450C303CB3FC3 -80703F8703A57B9B58C2EC0B2862060120671DC7F9FE830F685194AB20DA4608 -C715AC64E2D34713C3DF56CFCCDF88BFB09DADBDF8BBF026AD77E0698C0F1C96 -12AC9716B2336E563B99B746A4641186E38AF35B3F843FB467823C50355D220B -0D4F508ECBEC0BAAC33DB0536FE47D9C47B25C7022014657230A73915FACBA8F -84F4ED44AF9B046ADEAA833FCBDEB33FE15AE91DEDD7FEF85FFE26BD5A798D48 -2B3D4C5D3AABA1F95BA3FECCBF1ABC5B708DAE6B365E17896F25BE2B12472C89 -34853CD7411671B846BC6F006C18DBC9AFA57F677FD883C2DE0ED52D750D46D2 -4F13EAF6CC1C6ABAA445963C4995648998AAB0214E79231C1F4FAFA3F86DA3A4 -A245B7191DB68FF0ADEB1D22D2C54886048C11FC2307AE7B7F9FE93571B52A69 -B0469CE4FDE19A36911695670C1126C58D40E075C56963DB9A071DB14838F6FE -95E5B8B67A108A82B2393F8BA3FE2D478D38181A1DF7FE887AFC892A41FBB5FA -EFF173FE493F8D7FEC097BFF00A4EF5F91593E9EDD3FFAD5F5593AFDDCBD4E1C -4DAE866DF623EB583E3DF97C23AB6475B693FF00406FF0AE80F3DB1F87FF005A -B13C6F187F0AEA819723ECD2FF00E80D5F412D11C9147CD58CEDF97A1FCBF4FF -003F8708171B7E5C73F97E9FE7F0E1231955257BFE5FA7F9FC3850B8DBF2E39F -CBF4FF003F871C07A20171B7E5C73F97E9FE7F0E00B8DBF2E39FCBF4FF003F87 -005C6DF971CFE5FA7F9FC3802E36FCB8E7F2FD3FCFE1C000171B7E5C73F97E9F -E7F0E00B8DBF2E39FCBF4FF3F87005C6DF971CFE5FA7F9FC3802E36FCB8E7F2F -D3FCFE1C000171B7E5C73F97E9FE7F0E00B8DBF2E39FCBF4FF003F87005C6DF9 -71CFE5FA7F9FC3802E36FCB8E7F2FD3FCFE1C000171B7E5C73F97E9FE7F0E00B -8DBF2E39FCBF4FF3F87005C6DF971CFE5FA7F9FC3802E36FCB8E7F2FD3FCFE1C -000171B7E5C73F97E9FE7F0E00B8DBF2E39FCBF4FF003F87005C6DF971CFE5FA -7F9FC3802E36FCB8E7F2FD3FCFE1C000171B7E5C73F97E9FE7F0E00B8DBF2E39 -FCBF4FF3F87005C6DF971CFE5FA7F9FC3802E36FCB8E7F2FD3FCFE1C007E9AFC -52FF0091EF53FF00B65FFA2928A3E297FC8F7A9FFDB2FF00D149456251D3FC29 -1FF16B7C1DF2FF00CC16CFFF004425756C3AF03A7F8FB7F9FE5CA7C291FF0016 -B7C1DF2FFCC16CFF00F4425756C3AF03A7F8FB7F9FE5F2F3F899E7011D781D3F -C7FCFF009E02319381FE73FE7FCF06C2776173C761F5F6FF003FCBCAFE357C79 -D2FE14426CA148F50F11CABBE2B3DDF244083B5E5E41DA71F747279E40ABA54A -551DA2867A94D2C76F0CB34CF1C30C51B48F248D8550BD493DBF1E3FA79CEABF -B467C3BD22E66B79BC451493464A95B6B796507FDD7542A7F03FFD6F8B7C6FF1 -2BC47F11AEE39F5ED4A4BB10E7C9802848A2CE33B554019E3A9E7A0278E39C55 -2EDB54124F615EE432F497EF25A8EDDCFBA20FDA8BE1CCB2057D6A4817AEF92C -A6C0FC90FF009FD3B4F09FC44F0DF8E6376D0B56B6BF68C1631026390018E763 -00D8E7AE3FFADF0068DE1C6BA65925565C107AF415D75A584567B4C60865E87B -8FF38AD2597536BDD6D303EFEB6D2AE6F9B643186249032718C673D7E9FE7B76 -BE1FF84BA86A2A8F3A2C6A0E78947638F4EF8AF96FE057ED71A9FC3EBEB6D3FC -576EDE20F0F8C8372809BE801C74390B228F9B861B8F1F30C62BF43B40D734CF -116936DA9E8F7D6BA8E9972BBE0BBB3984914833CE187079C8C7B57CE6329D6C -2BB35A3EA38C4E3F48F84F6966AA678E2638E4F0C474F55F6ADFD43C11A7DEF8 -7B51D25618D16F6D64B72CD1A9DBBD0AFA7BD7420607E14019CF15E57B497326 -69CA8FC6AF01EB137827E25F82F5EB5B48EEFEC5AC40D3C522643C2FBA39176F -7C87C63FC2BD9FF6D5F113784FE2D7875355F0C6872E98C90EAB3D9E9F059DBD -DDC4D1F9908496610BC862652836C80AB052074CAF9CFED29F0C2E3C1BF10BC6 -5E1992D4595B9BA927D3D46ED9E4BBF9B06D623900150D8EE1876E20D4FF006C -9D13C69A9FC3EFF849BE1D695AA5D695247FDA9A9EAC66959099009DA0B78DD1 -0FCB1AB059448031236E060FE8983C8331CF314B139753E7E4837249A4ECB5BF -9F6348D48421CB376D4E2FC3FF001AAEFC3967E27D3934BBBD42D3C4B751DCEA -7717FA997BC7F26E1EE20D930857636E90F98C55BCCE480849278CF136BF71E2 -CF126ADAE5E430C577A95DCD7B3240A5635791D9D828EC3248033D075E38FA17 -F6A8F869A4F873E2E278B3549EE6E3C25E21FDF4B73A2C6A3CA97CBC9555DBB7 -E73B5C3607024C29C023E6CBCF29AE4BC04342234FBA0800EDF719DDD8E38C83 -B78C1AF2A8E2238AA51AB1D9FF005F8176E57635BC3DE02D6BC651CEFA46973E -A02DE686DDD6DD43B892662B1284CEE6DCC08F941C739C00711EB5F007C636FA -CE91A5FF0062CD6DABEAB6306A9650C12C6DE6DACC3E4955D495D9CF273F2E0E -EDBB495F47F81F17C41D3BC2DE27BDF095B58AE93A9DC2697A85DEA109995516 -3795D36EC2046EADE5B9C759635E0B0C759ABEBFE3AF056AD7B6D25B7866F64B -4B58B46368F67768ED682CE4D3E70B90B2BC4F069CBE6C99C21646431B330AE9 -5A211E3DA6FC09F11BD8DFDD32E932C1656C2F67BD7D7AC3CBF20C8B17988C66 -FDEA79AEB1EE42C37FCBC302033C65F0DB5DF87AD6D1EB16905BBCD34B6DB61B -C867314D16C1345208D9BCB910C91E51B0C37838F4E9355D4F5BB6F0BDB69F0D -CE91159EA9A79F0DA298AE5668624D421BE2E54A0DAE66DB92C7946E147C868F -8A1AC6B9E27D1BC337FAADC6997104904F73A7456EB7725C8B533496E2369675 -67648E4B43B55E4623CDE3A92A9ABEE070DA0E8A75FD7F4ED252686CE5BE9D2D -E39EE32234676DA0B6D52D8C9EC09F6F4E9B5BF845ABF87B4A4D4750B8D3ADAC -19B634DE73131933DD41192A13761DECAE00C0E3682428395E3209E7B2BCB7BC -B691A0BAB67134522FF03A9CA9F7C63A7B7B6074963E35F1399EC161B84D4AE6 -2B999A28A6B58AE9A49272DB8189D18499691CAA1042B48E540DE72969A947DC -1FB15F87AEBE04FC08F8C5E2FF0013D84FA74A6FFF00B3845868DA46B70517CA -9369055A5B9DA1C65720FF0074D7C8D35C58DD6BBACBE9905D43612DD9FB325C -CAB24BB15163F98AA28277237451DBD2BEE2F8F9AA6A1FB29FECA5E1BF06E912 -7F686B4B120D62668BEDD134928732B132A9DA24B86FDDEE1F751C0194E3E5BF -D983E194FE29F8A5E10D160B717B1DB5D25CDE34BBB67911B89262CC071BBEE8 -E9CB28E322B1A528FB69D67B415BE6CF19DAAE31C97D856F9B69BD7D123F56ED -34F8F48D022B08C612D2DC5BAE381854C03FA57C2DFB59EB22DE3F8BFA499079 -975E14D2AED170403E56BA173F879DFAFB57DE97249B297230769E3F03FE7FCF -1F9D9FB51DA9BFFDA2350D3268835BDEF8135569571C7EE22BDBB8CF4ED2DB46 -7F0FCBC4C0BBD7BB3D4DA4AC7E77E93E223E17F8C9389145C69D76A20BAB3959 -84570A61C2860BD487DACA7F85955872A31EE9E31F0F26A5E11BCB1B11F688AE -6DBED162DB82970ADF2EE1C6D6CA6D20F707B62BE6BF897E1DBAB3D54EAF0079 -6D65DA1DD3A44C001C9C74381D7B83ED5EEFF0A3C78354D16DAC2E6F045A7CC4 -48584608B69CA81BC77C6400D8EC338254573E794269D3C552E9BFCB63EFB877 -131509E1AAECFF0053C9F48B92147CC3B1C019FF003FE7F0F46D0B51B38F4F64 -B9864791D645491470090369C93D8E7FC3D394F881E189FC13E2A980B67B7B49 -9FCC8A37C0284F250818DBDF03FBB822ADDA6A7A8C9E4AA40F0888360ED64032 -4647CC7DBF9FE05BDB43DA435BF43D0751526A9CEC92EB7B1E85A2EAD1C6E7EF -C000CA10E0053F5DA4FF00FABF2D76BC89E1C7DB0375E44E53FF0069D70563AB -DFA733C92E067E512E09F7C8FF003FD2EB6BF71B48592EC73C7FA576F4E50FF9 -FD39960ABCBA336A99A6162DA535F2771BE23BB8124FF5AD2B904E7CE0C073D0 -E63AE4AEAFB4D5D3EEE17B39A7BAF2E4F2E54F98231DB82DC8E8437206391D7B -6BDF5DEA32A1F2AE251F27479B7127DB803F3FFF0057297B71ADD9B977B592E4 -B23229C1936E7FDD3D7EBC71EDC7A1470D529B57479389C652AD0F7669FCCE7B -49D20F893C57A76965378B9B858DD738C2E72FF9004FE15F52F882EACB42D2A7 -D5EEA1864B7D38191209932279235C8538043229DA5C7195240F988AF31F829E -0B9AFB55BFF126A90C7683636CF336830C7D2470ADC863F2A28C824B11DC1A83 -F680F1C247A3DCDB5B4AE89321B7B489DF24459CB1230064867DC401F339E074 -1E46339B1B8FA787A7B437FD4F570328E0B2EA95E7BCFF002E9F99E7DF0DB56B -8D6F57F136A174E669EE248E4776E3192FD80C003D00C0C0C600AFDB2FD8DED1 -34FB2F8BD688C5A1B6F88BAB411961CEC45815727E800FA0F6E3F1D7F64DF869 -A878EFC79A5E89F6778D35BBEB7843302A4420969653C70AA859B77A2B1E80E3 -F5AFFE09E7AFCBE2EF869E3AD7A603CDD53C697D7CC78C932436CE49C64756FF -0038E3EAF1E92A0E2BA58FCD799CA5CC5FFDBEF4FB8BBF823673C70978AD7598 -269CA9FB89E54C809E39F99D47E22BF2FC68BE1C5F8B715CF8B6F6FECB4ABCD3 -65F2BFB32C22BB9E49D5A3FDD85796203E4563BB270570179247ED2FC63F069F -881F0B3C4FA025B25D5CDE69F2ADB47212ABE7AAEF872463A48A87F0AFC5CF89 -E26D31342F13DAC25AEF41D412F555ADA39E328396CC4EBB5F3B40C302A73822 -BA32BA9CD41C7B339AA2E5969D4ACB8DACC404C0079ED9EC71D0F4E3F1E9CD28 -C91C8C57BC6A7F10359B1F0F78AFC49A9FC4AB4D6758D5B49D3A1B4D2BC39791 -FD887DB2030B896044488B43690F96C620446F2C273B871E0C8495C9041F435E -DA77573314D43328914A30C67AE474F7A9B8CF4E7B67FCF5AFA5BE17FC0BB0B7 -F090975DB593FB52F32D2C4246511C79E2323039C004F5E7BF15E0E719CD0C9A -8AAB5756DE891F339EE7D86C86846AD74DB93B24B77DFEE3E58863BEB46D96F7 -12451B7DE50781CF6AFAFF00F67EFF008281F8A3E17699A57873C5B63178ABC3 -5630C56B0CB02AC17D69022C68A1480125091A390AE033337328030219BF66CF -08BC818477910E3724771F2FD3E6527F51FE17ECFE04785B4CB19A282CA4732A -18E476B870587A77FE5F857CB55E37CB7953A70936EDB9F213F11F2C8C63ECA1 -3727D2C95BF3B9E81F113F653F859FB42785354F177C06D5ED06BD0FEFE4D0A0 -9FCBB6949925CAB4328125A3B904479DB1623002AAB1907C1FA969B77A4DFDCD -95EDB4B657D6B23C13DBDC46C92C32292AC8CA7055810410704115B9E39F07DC -F82B5E9EC264FDC81BE27F98E50E71CB22E48E012062B375ED7F54F146AD3EA7 -AD6A579ABEA73EDF3AF2FE769E6936A855DCEC49385000C9E0003B57DEE1ABC3 -134635A9BBC65AA3F4AC362A9636846BD2D632573E87F0378FEEFC5FE11D12C2 -DF4696C4A6ADA7E8F14A93232CB26F578E2419DE5DD62618C6D1C6586E5CF01F -B59FC4EF09F8AFE13C767A7EB2C6FE7BDB716F6D15BB93336E0AE8E0EDD83CB7 -9183804928140E4B2E7FC19F1D685E00D46F2F7538F517778BC936D671C72C37 -D6CC0F9F693ABE36C726D8F32265D40230D90532FE36EB7E25D7FC6FE12F03EA -FE2BF09F8D34DF0D59C1A8C3A8787C5ACC228A38CC71406E23892604052AD14A -73C237421ABE67FD58C0D3C5C3154AF1716E56BDD5FF0033E4A1C2197D1C753C -751BA709395AE9ABBFC4F56FD87B436B7F8EFE05B49816F21250C02F1BA3B494 -8FD547E42BF55470075FA9EB5F0DFF00C13BBC0D0DEEADE23F16DCC13B4B6914 -76767315C421A4DED30538FBCAAB10F60FC8E463EE4C1079F5EBE95A6693E7AF -65D0FD0E82B479BB8B9A2900C7B7F4A00FC3FA5792A26F762D657897C4DA6783 -FC3BA96BBAC5DC7A7E93A740D7573752F0B1C4A32C7A7A761C93C0E68F12788F -4EF09687A8EB3AADD25969BA6DAC9797571203B628A352CEC703901549E39AFC -8DF8F5F1C3C4BFB5AF8A6EAF350BBB8D17E156997A5F4BD20C3B66BC8C344247 -1B7E59A611B090A1906C5638600935D986C2BC44B4D8CA5539773E92F89FFF00 -0544D26F2F63D13E0FF85EEFC5FADCB76B690DE6A3034368CEC404F2E30C2593 -71FE122323AE09E2BC95FF006C9FDA8BC77E34B5D234587C31A25CDC587F6845 -6D696C8D1BC3F667BADFBA66739F2E3638C8C100101BE51C178E3C376369E0A8 -F59F005ADC5A7842F628AC75547817CB86FE297CE78A176064D8A5818E591BCD -31C8D196C06519DF06F57B4D2BC591EA1A8EAD269ED616DF67B4B99A52552395 -845342076578E69C1231B54BB01B80DBF514F07429C7457395CDB67AC69BFB7F -7ED0DE0BD42EB43F11F85FC35E22BCD2EE6EEDF51558644B987ECD869C334520 -8D420FE3DBB7BE5B923EAAF80BFB7F7C33F8DBAEDBF869BEDBE0FF00164ACB1A -695ACC6AA2790F1B21990956E40501B6312540527A7E756AD67143E2AD72D7C3 -B22CFA6CD005BD89242F0CD1C6629E54DEDF3342268815E7710AA324935AFE2A -F03F84F4AF07DA7857C59A55D5B7C455BC9A5F396E21B7589D94888CB70CE50A -B1955DE4618416B1A8552EF29CEB60294E3EEAB7A0E351A7A9FB2C1F2BB829E3 -F0C7E7FE7E95CEDCF8FB4AB2D50E9F2CBB2E0AB344A0A93204203ED5CEE3B495 -C9C63E61CE4F1F137EC47FB5E5FDA78923F827F102E12EAE206363E1AD7204FD -DDE43123928F2395DDF2AC6B1154CB700F2C2BDEFC59F07356D5BE2DF8775C82 -E2F22B5D2AC6F6D1846C59DCCED6DE5B29C0551885F764F65F6AF97AF4A7465C -ACD5CDB49C353D4FE2ACAB3FC21F1948B828FA15E32E3A63ECEF5F9198F63F5A -FD6DF8956ED6BF06FC5F0B2AA98F41BC5F90719FB3BE71FE7FFADF929E5907EE -918FF3FE7E95F47947C13F539F11AB8898F623FCFD2B1BC66BFF0014BEA9C63F -D165FF00D01AB6BCB23F848C0FCAB07C7A193C21AB1018116B2F23B7C8D5EF4B -5473C7467CD51AE157E5E87FCFF9FF002142E36FCB8E7F2FD3FCFE1C2EDC11F2 -E307B76FF3FE7D902E36FCB8E7F2FD3FCFE1C701E8005C6DF971CFE5FA7F9FC3 -802E36FCB8E7F2FD3FCFE1C0171B7E5C73F97E9FE7F0E00B8DBF2E39FCBF4FF3 -F8700005C6DF971CFE5FA7F9FC3802E36FCB8E7F2FD3FCFE1C0171B7E5C73F97 -E9FE7F0E00B8DBF2E39FCBF4FF003F8700005C6DF971CFE5FA7F9FC3802E36FC -B8E7F2FD3FCFE1C0171B7E5C73F97E9FE7F0E00B8DBF2E39FCBF4FF3F8700005 -C6DF971CFE5FA7F9FC3802E36FCB8E7F2FD3FCFE1C0171B7E5C73F97E9FE7F0E -00B8DBF2E39FCBF4FF003F8700005C6DF971CFE5FA7F9FC3802E36FCB8E7F2FD -3FCFE1C0171B7E5C73F97E9FE7F0E00B8DBF2E39FCBF4FF3F8700005C6DF971C -FE5FA7F9FC3802E36FCB8E7F2FD3FCFE1C0171B7E5C73F97E9FE7F0E00B8DBF2 -E39FCBF4FF003F87001FA6BF14BFE47BD4FF00ED97FE8A4A28F8A5FF0023DEA7 -FF006CBFF45251589474FF000A47FC5ADF077CBFF305B3FF00D1095D5B0EBC0F -F39F6FF3FCB94F8523FE2D6F83BE5FF982D9FF00E884AEB001B8E40C7D33EBFE -7FCF1F312F899E7A383F8D3F1317E1478267D612149F5091C5B59C6FF74CA431 -CB7B00A5BDC80BC6723E02D4F50B9D6752B8D42FA792EAF6E1CC934F21CB3B1C -649FC87E42BD77F6AEF1B7FC24FF00129B4CB59E47D3F458FEC817CC2C827C93 -2B05C707EEA1FF00AE75E3D676C6E2411C608248EDD3915F4F82A0A95252EACB -4B4B85A5A3DCB8441CE464E3A5767A3787614822965525F01860D4DA26891DAC -4AECA0B75E4723A7B7B7F9EDB55E8360F5191C4B0A0541814FA28A9DC046191F -8E6BE84FD8FBE3B9F855E353A36A933AF86B5C96381D895DB69725D55272CE40 -54C121F91C10DD5403F3E515856A31AF0709ADC1687ED2D2762315E59FB2FF00 -8DA5F1E7C0DF0B6A575309AFA380D9DC132191B742C620CEC464B32A2B9CF3F3 -57A98AFCEEAD3F673707D2E6A7C9FF00B7AFC211E21F0ADAF8F6C541D434655B -7BE5E732599662AC00EF1C8F9E806D762480A2BF2EBE22E82FA6EA075389545A -DC901B8FBB2E08CE31D085F5EA0F15FBDD7F650EA36735ADCDBC5756B323472C -13A864742082ACA4104104820F1835F98FFB547ECDF2FC28F125C9B7B29EEBC1 -3A86D36D3C8BBD6176CE60773CEF1B58A9E090411C8623F4AE0AE25AD90E3615 -A9BD63F738BDD7CCC6AC14D599CAFECDFF0016B41F8A9F0D6DBE067C419E3B3B -1B4DD27872F06C4CDC92DB109CAFEF54C8C509C823298E81B80F893F00BC45F0 -DFC7367E19BCB52EFA94D1C7A6DE102386E9642A1183370A72EBB81FBB9EE306 -BC8B5EF0CEA1E0DBF8EEA2793C9475782F53E564618619C72AC18641F6E3DBD4 -748FDA67C43E239923F1B5E5C788AFA184C5A7EAF712625D2DD9D0BCEAA10991 -F629556CEE53B594EE45C7E8DC49C1AB3273E23E135ED2954D6A515F1425F69A -5D537D3E6B4392A636A61E972CA0E4D76EC62DCF83BC49E19F0E41E20811ED34 -DBB0A8B7715CA82E1C642E15B3D369391D4A73F76B9F5D435447BC6FED2BB3F6 -A7F32E00B890098EE2DF3807E6F9BE6E7BF3DB8F64D63E1E68BE26D43C2FA0F8 -57E235B4D6979A5C1A96A50DE6A024B1B1BA2924CF18099198E158D3F89B7291 -C1CA8E263F841E2D9BC34BAE8D27FE25735FFF0065A5CB5C440B5CEC0E136EE0 -F8C60EEC6DE79391C7E3F2AF1A7270AB78496EA4ACD7DE3A799616A6F3E57D9E -9D8E734CF106B3A359FD8ECF53BCB3B5F344FE4DBDCC912170410C4290090517 -9EA368E4638D5B7D6AFF00C5C977A778835DD565B382D64BC821DC6E11E68A37 -6404492284C82F961B88C9F90E491D849E0CB3D4B4AD735783C0F3DAD95A4A96 -E9326A20FD9E6944A62568D9CB0518639C3FFAADA4FEF3E483C49F02B5AB6F1D -788B46F0DCA9E27B7D234B8F5B9350B31E42B593430CACEAAED9257CF552AA49 -C8271807046BD29B7CB24FE674C31787A8ED09A7F32C47F02678FE1A41E28B95 -D612F25B58EF0E9A9A438D96EF14B21B9F31885312F959665DC1567B73BB2E51 -3EA0FD86FE0D5BFC1FF0BEB9F1AFE215B0D3ACD2D9534AB5BBB55F34212A4DCA -6E1952EC51632A46724E3054D721F03B45F869F053E0EC3F147E23EA7178B7C4 -1731C965A2F82E70AEE93C52FDD1F33EE05442C58A8448DC02AE4AE7CF7E3F7E -DA3E2EF8E8CFA7FD9D7C2DE1D915221636AC2E5A150CAC5F7346ACCF950030C1 -55C851F33649547282F65ADF60A95A52A5CF865CCDEDDBD7E454F8D7F156E7E3 -87C53BDF102DE5CDC6956B31FB1FDAE38E3923383B62010B2958C3B0DC0FCCDC -902BED2FD843E0FA7873C1F3F8E2FADC8D53580D05A3B960D1D9AB2E72081CC9 -226EE87E54420FCD5F37FEC9BFB397FC2E0D7AD2E6F74F7FF8416C4169AE1095 -8EE080316F1B8209621B2C403801812A5857E9ADADAC3676D15BDBC096F6F0A2 -C71431A8558D40C050A000000000074C570636A430F4FEAD4DDDEED99E1E82A3 -1B7DFE6C2EFF00E3D66FF71BF91AFCD5FDB0FC4B69E10FDA97C2BABEA36D25DE -91058A45A8DB41CBCF6524F711DCC4391CBC4F22E7231BBA835FA5772336B31F -446FE46BF2BFFE0A0C193E34D915F97FE25206ECF23FD267E7FCFF00FAB8B03F -C64752DD1E17F167C109E02F1B6A9A3C4EF73A3BBF9DA5DE4C9FF1FB6327CD6F -3A9C052AF1953C7190475522B86D3F44B2D2E2921B6B34B78F3B82A16C83C739 -EBD00FF3C8F70D02787E38F812D7C29AAEB31C3E3CD00C71F860EA122C6BA8D9 -B0C369E6772AB1F9441921DEFC995A318F940F26D474DB9D26F6E6CEF6D66B3B -CB691A19EDE78DA3921914E195948054820820E0823B638FA16AE6EA4D6A9912 -F7E36FB7A7F9FF003D3877F9FF003FE7FF00AD112501E080067E9FE7FCF4E143 -B60F04600E0F6FF3FE7D8565A21B6DEAC93FCFF9FF003FFD63FCFF009FF3FF00 -D68CB30CF04607E5FE7FCFB05986782303F2FF003FE7D9DC449FE7FCFF009FFE -B1FE7FCFF9FF00EB465986782303F2FF003FE7D82CC33C1181F97F9FF3EC5C02 -760B19CF4FAFF9FF0023F26C5E16D135C866D6F5C93C916171041986DC4F704B -891959632C8A5479273971CE000DC809B4924B824A8E3FD9F7FF003FFEAE97E1 -9F877C4FE2BF175BE95A07D97C89E617376DA8C7149A7DBC7187DD7538954C7B -224791BCC61F282D8FBD4ACAF7B6A3E676E5BE8761F0F2D62F03F843C5BE396B -D92CEF61B63A3E851EC00DEC97B0324EE0F23115ABB336DC9569E004AE457DD7 -FF0004C1503E037883E5C1FF00849A7CF7FF00975B43E9EB9FF3D3E03F8C1E26 -D1EFAEB4FF000CF85E1893C31E1D59218AEE1560356BA6216E3512A4663F3C47 -1111E48448A3518C1C7DF9FF0004C118F80DE20E31FF001534FDBFE9D6D3DBFC -FF002F3F1DFC2652E87D7922831907804609F6E3DABF35BF6CEF8229E01F1E5E -5E5BDA410F863C4A24682280B308E40AA2746CF0B966665C1C60F006D207E960 -18C718FC3E9ED5C2FC64F851A67C62F065D787F525118399AD6EFE62D6B70119 -6394282376DDC72A4E18641C751E6E0311F56AB77B30A90E78FA1F8EFF000FE1 -B4BF9F4AF842749D2340D426BF96F17C63AA5D346B716EA8F2A44CF27C902C68 -D367CB1FBC1B06098C16C8B2B57BE9EDEDEDC7992CCCB1A0E9B98E077F7FA7D0 -5777F1BBE0B6A1E1DD76FF00C35AF5BFD8B5AD3A56FB1EA01481C1CA4D1371B9 -1B683F810406520735E0FF001F68BAAF8D3C29A0FC4282CBE1FE8BE1AB30B71A -A687685AEB5668CBB79C1CE775C4CE550063E5C7B94AAAAC640FB38CA3F65DD1 -C4B5DCD5F16E88DF0E3C4F049A4DC6A4ED6CECA2E353D356D489E3621D550BC9 -90BF2FDEDAC0E4322E067D63C31FB4F58B41143AE69135B5D0401A6B2C3C6E73 -8DDB5882A3D816E9F80F26F887E21D4F51B6D2E4BDD022F0E69B7092EA904100 -94ADCCB2B88E7B90D2B313E63C00615B60284281CE5341F18E89A65A69F6F79E -0FB2D562B75067924BA9524BA7F3CBEE2CBF7408C98C28EE031C8256BC7CCF27 -C1E6F15F598DDAD9ADD1F3D9C64180CEE318E321771D9ADD1F4C47F1BBC0EEBB -BFB7234E3EEBC32023EBF25627887F68CF0AE96EC9682E7566C12BF678F6A138 -C804B60819EA7070335E0D6FA9596ADAAEA77B0F85A4BDB2CCB20B249D7F70BF -BC78C96116FD91C699739C1F2B2E7071556EFC4DA24D656BE4F85ADEDF518E04 -125DFDA9D83CE0E5E4D846DDAC493B3180768042821BE629F03E5D19A94A526B -B5CF8CA5E1D65509F34A5292ED7FF2D4B5F127E26EA1F11F5085E6896C6C6DF9 -8AD10EE0AC40DC4B60163F28EC0703EB4CF891F0CEFBE18DD6896BA95C413DE6 -A5A5C5A9B47067FD1F7B3A98989EACA632091C647048E6B2A0F115C691E27B7D -7347861B2BC8AE12E2DA29A24B88A3941E328C9B19770C852A7031E99AF44F8D -5F11745F18785259BC4AB6DE1AF883E0A823D30690218605D4ADD25649562822 -810ACF1CB22B14C84D81CA850A41FBAC3E1E960A9468508F2C5743F49C1E0E8E -0682C3E1E3CB18EC8F3E59ECFC05E16B3F1EEA4344D734C87555D3A6F0CDC5F0 -5BDBBCC7BCFEE87CEB1BAEE412AF2ACA4F18CD43F09FC09AACAF123432CFAFEB -D711C6D671400725B647081C9CE081FF0001FF00649AA4B6379F11BC5D2F8BF5 -DD0ACF44370637B7F0DE9F0F936B6CEAA8A6611E70BB983395DA002E40C28007 -E8CFEC6FFB355D78784DE34F17E96D6BA83129A6E9F7F0625B7C37CD3BAB8CAB -1206DE0103279DC30622BC70F0F692DFA1DA973DA313E83F823E021F0C7E19E8 -1E1B73BAE6CADBF7EC0EE065763249B5B032BBDD82FB015DD0E40E31F874A5EF -FF00D6E94018C76FE95F1ADB9C9C9BDCEF4B95584031ED8FD283F28C91D3D074 -A5031ED8F4ED48C085F940C8E9ED4B96E33E1EFF00829C78D2FAFB42F01FC2DD -2F51B4D31BC5BA9EED46E6E6F160486DE328ABE7123E588BCBB8B9E9E4FB1C7C -B571F057C67FD9F7DE17F0B7866F35ED334D4826B9BED083DC2EA703B32DA4A6 -28E49636552B71B1D304A97DC3716C697FC140B5D3AC7ED83ABD9CC1D9345D22 -DE050E4600658E52541EA3329E99FE55C8FC1BF8C1ACFC11F1DE9FE21D1A7956 -3B69E337B6B1C823FB55B06CBDBB33A305460707E524108C30C88C3EB7054953 -A09C4E293BBD4AFE22D2BC79F0F7C36BA1EBFA1EADE1AD375399E758F54D31ED -9EE48F2F78124881D9415849407682A848C806B9CD2F479F51CB445571DD891F -D3FCFF002FA73F69CFF8284E87F1B7F671D47C31A4E9371A0F896F753B6B6D4E -CAEC19E25B7492494BDBCEBB43307B7B70DBD17898850D82EBF337C3F9A5BE43 -1ABAC6DB376E2D93D874FF003D2BB2F27A25A92D28EA55923B8D1E79230C2390 -C6D116033F2302AC06477048FC7B1AD9FECFF137C4DBB5FB258CDA8CF6EA208A -1D36DA38B6067925D891C6A3B999F0A3E5018F0071C678CF5592D6E778C23C4C -7211B238CE7B74EB5D1F84BE204FE13BFB8934B68D2EC323198A1DE9B1B705E0 -8CA938251B2ADB5720EDE344DECC9B6BA1DAF8ABC1FAEDBFC3EB5F1E448DE18D -7BC3261D57499264066D40A4A18CF1067F988E1B746AC9B54313D09FD51FD9EB -E2427C5CF831E0EF1699566B9D4B4D864BB31A850B74142CEB81F771206E3D00 -AFCAAF0AF89351D5F4FF00179B85BABA69B415B00639E58A18A048FC98D6558D -7E74552806F60BB954B67241FB23FE09473C92FECF1AEDBC921716BE2ABC8630 -0E551560B6C85C8E9B89AF92AD4E307529DBE195FEFE9F79E76592F675AB61D6 -C9DD7FDBDAFE67D4DF1707FC5A8F1AF1FF00304BDFC3F70F5F91C571FC18C03F -875F6FF3FCBF5C7E2E7FC928F1AFB6877BDBA7EE1EBF230AE33F2E303F2EBEDF -E7F97AF942BC67EA7A989DD0E2BD7E5C707FAFB7F9FE5CFF00C4018F07EADF29 -FF008F4939EDF71BDBFCFF002DE23AF03A7F8FB7F9FE591E2F81E6F0E6A51226 -647B79155477251B8AF7E4B43992D4F9936E08F97183DBB7F9FF003D3840B8DB -F2E39FCBF4FF003F871A69E11D5621B5EC8865CE46E5E0FF009FE54EFF008453 -5318FF00433C7FB4B5C1CACEF4D3D6E6505C6DF971CFE5FA7F9FC3802E36FCB8 -E7F2FD3FCFE1C6AFFC229A98C7FA19E3FDA5A3FE114D4C63FD0CF1FED2D1CAFB -069DCCA0B8DBF2E39FCBF4FF003F87005C6DF971CFE5FA7F9FC38D5FF8453531 -8FF433C7FB4B47FC229A98C7FA19E3FDA5A395F60D3B994171B7E5C73F97E9FE -7F0E00B8DBF2E39FCBF4FF003F871ABFF08A6A631FE8678FF6968FF84535318F -F433C7FB4B472BEC1A773282E36FCB8E7F2FD3FCFE1C0171B7E5C73F97E9FE7F -0E357FE114D4C63FD0CF1FED2D20F0AEA631FE84C3AFF12F1472BEC1A7732C2E -36FCB8E7F2FD3FCFE1C0171B7E5C73F97E9FE7F0E35078575318FF004261D7F8 -978A078575318FF4261D7F8978A395F60BAEE6585C6DF971CFE5FA7F9FC3802E -36FCB8E7F2FD3FCFE1C6A0F0AEA631FE84C3AFF12F140F0AEA631FE84C3AFF00 -12F1472BEC175DCFD21F8A5FF23DEA7FF6CBFF004525147C52FF0091EF53FF00 -B65FFA2928AE728E9FE148FF008B5BE0EF97FE60B67FFA212BAB2BF360AF0467 -23F1FF000FD6B94F8523FE2D6F83BE5FF982D9FF00E884AEB31824E318F4FC7F -CFF9E3E6AD79B3CE3F37BE215C8D47E21F8A2E0285F3754B994004E30D2B37F5 -FD2AFF0086347090AC92A1439247E63FC2ACF8C749DDF147C571C681628B55BA -0887FBBE6BE3B7A62B6E1884318500003B0AFB283F713344C7280A303A0E3A53 -A8A2800A28A298051451401F757FC13B75C7B8F08F8BF4767FDDD9DE41751C7F -DDF350AB63DBF722BEBBAF923FE09EDE1D96CBC1DE21D61D711EA377E4C67B91 -12AE7FF1E9187E06BEB615F0198DBEB53B16B616B27C51E15D2BC69A1DDE8FAD -D945A869B75198E582650CA41046467A119E08E41C11C818D6A2B862DC5DD0CF -CE0FDA13F63BD53E17DBC9A9E90D378A3C26549B9924894CD66A31FEB947DE5C -6F2645000C72077F8E75DF8591112CBA64C6360C48B4946541F447E0AE307D7F -0C57EF26DF9B238EDC815E3FF14FF654F01FC5399EF2E6C1B46D55E4699EFF00 -49090BCB231C9690152AF96C9248CF27915F7B91716E3F26AAAAE1EAB84BBAD9 -F935B333A94E335CA7E25DEE91AA787250F756D3D9B13F2C8395FF00BED783F8 -FBF4E6B5EDFE2B78AE0F0E41A347E20BD1A54378F7F1C3E69C2DC32A29937752 -711A6327031918249AFBFF00C59FB0078DB49BBBC9742D534BD66CD033C4B2C8 -F6D7121C676ED2A533D464B81C678EDE7975FB127C54B997F79E0282E02F466B -EB26FCB32FB7B74AFD863E266171F05FDAB81A35E5DDAB3F9EE704F0309BD51F -1E37C49F12AE997DA72EBB79158DEBC4F73009995653196D9BBE9B9BF3FCBDF3 -E1E7C788FC39E01F03CDA2E9171AB78AB4A4BFD2F5886E8E20D42C5E5F361596 -4200652B34B16CC920429C0C2E3D26CFF629F8AD6ACAB178122B752400E97D64 -81739C9E25CE073EBD2BD07C2BFF0004F7F196A3340FAFEB3A568F667FD608CB -DC4E87D0285543F83F7AF97E25E28CA73AC0AC153C153A09494AF0DF4E9A221E -5B4A51E56B4F2D363E21F1A6AD7B75AADA0BE548ADD9A4314116E7F21D821DA5 -8FDE660AA3381F700FA63CB2476CB24B2958A38C92EEC701467A9E3FCFF2FD23 -BEFD95BC09F0FB55BB80E943C40D29C19F5B8A3B8C703384DBB075FEEF6A8746 -F831E07D03533A95878574BB7D477A4B1CFE4073038006E881188FA7440A2BF3 -455A8538A8D08FBA8EFA11A786A6A9538DA28FA5FF00678D026F0AFC0BF87FA5 -DCD8A6997B6DA0D92DD5AAA2A98E6302798ADB460B06C82DCE48CF7AF430BB8E -71595E1605B45B7383F717AFFBA2B636E3FF00D5F5AF9C94AEDB67426E5AB22B -C18B397FDD6EBF43FE7FCF1F959FF050D221F8D7A7075652DA50C60723FD2273 -9FD3DABF552E90BDBC8A07556FE47FCFF9E3E0AFDB27F66FD47E2E78D34ED674 -8BCB5B2D4ACE17B2923D41D844F1F98CCA576A31DC097E3E9E95D783928D54D8 -E564D33F3F64413209A191E292327040FBA411CE38E781FF00EAE9ED50F8EBC2 -7F17A7B1B1F893E5F86759862117FC273A5DB3CCF38504E750B7505AE646C30F -3D195C12A5848071AD17EC53E358830FED3D00B1249FF489873D3FE78F4E063D -314E3FB15F8D4FFCC4FC3FEDFE913F1FF907FCFE58F7FDAC3B8DCE279C78BBE1 -07887C23E1EB6F114B6D0EA7E16BA94C76FAF697309ACE53C8D848E627E0E524 -0AC31D31D38528EB8083E5C03F773C1E87A8FF003FA7D27A07ECA7F143C29A82 -6A1A1F8AF4ED1B508C612EF4FD42E6DE54E7B32420E3A715DCE87F0B3E2BE98E -EDAAA7C3BF18974F2DA5F1469C2FAE0AE08C1B86B6F38E33C65F238F4E1FB587 -70E747CB9A17C2AF17F88344B7D5EC74B1756174CEB04AB2C6BE632EEDCAAA5F -7646C6CFA05CF0306A687E1178CAEEE62B5B6D1DEEAEA6596448EDD964256300 -B850A4F203291DC8208C819AFA9B57F83FE2FD7446979E0BF8610C2A433C7A6C -DAB59AB1C104848E508A4F27E55033CE2B317F665BB613CB2F87B466B86B8F36 -3817C497DF6455E372946B7694923782C250DCF0400416AA43B93CF1EE7CBBE2 -3F01F883C23099B59D3CD8465C2E095DCA486C67E6380763E0E30769E78E310E -0672003EDD07F9C7F9C71F6B693F073C45E1FDAB61F0FF00E195DA292EB1EB57 -9ABDEA0720AE76B4817A7AA939E73D315F58F85FF163539BCED36C7E17F84E4D -AB87F0EE891DB48A40C644BF65320E406186182A08C629FB48771FB48F73E73F -037C11D6FC5DA2C7E26D4193C2FE058A758EEFC4FA98C40AA73B8411E43DCC80 -236238831C8C71C6343C53F1374AF0DF85AFFC0FF0FADE7B3D2277D9AA788A61 -E5DE6B88A7E405401E45BE4161002C79F9D89071E83E24FD943E2978C3517BFD -73C5563AD5EB6D1F6AD4B53BAB998003006F78893C600CF4038C5667FC313F8E -3FE827A07FE044FF00FC67FCFE1C43A90E8C3DA47B9F3DB011854456DC7E5550 -33D81E49FA8FF3D3F507FE097E54FC06D7F68F97FE1259F071FF004EB69EDC74 -FF003DBE3F97F620F1C4C176EA5E1EDE0E70D34EC08F4C7923F9FF00F5BF43BF -639F8132FC00F848742BAD4A3D46FEFAFA4D4EE9A052228E5923890A464804AE -22539201249E076E1C6CE2E9593D4D29CE329591EE7B47A63F0A64A44437607A -7352E302AAEA3FF1EF9E95E14533AA4F962DA3F287C7DE2BBBF1EF8D356D7B52 -791E7BEB892648E7937B5B445898E1071F75130A3A74F5CE3CDBC6FE17D275E1 -6F6DA859C5751DC07C7CA0B46461B729C704E3F103D2BEA7F8BDFB39EA37FE31 -D4B50F0AEA56B12DF5C3DE5CD96A81F6C72B8DCCD13202402C7255C1C166C103 -007B27ECA1F02AC7C2BA56B72EBC6DB5ED4F5144B5BA592DC35B24432C638D1B -3F2B360B16FBC523240D831F471C4428454FF03CDE7E67647E72787353F1B7C3 -EF15E8FAD452DB7C4BB3D2ED5ACAD748F1886BB82DA0F2DD62886E7E63899832 -20E06380BDB8E93E2068BA5F852CECB59F0EEAFA3F8ABEDD33DCDC39125BADA7 -9718891154162DBBCE6624000003273C7EABFC4CFD84FC1BE266B9BEF0E5D4FE -16D4253BBC88D564B10724B7EEF01973C0F95C01B47CBC57CF9E23FD85FE2669 -448B68B4CD6D09385B3BEDA7BF5132C6327DB3D7AF71E9D3C661E7B4ADEA5494 -E3BA3E531F143E1768DAEFC43834EF135F2D841673C7E1CBC7B4B859AE9BED31 -C6A5FF0072BB7CCB63392182752A4F3B4E6C7E3FF86903F82AE05FEABACC3725 -5BC4365636B224F062EA452903491AA12D6E237049386DD9233B57E939BF620F -89F7243C9F0F2DDDC0C126F6C49FFD1B5A1A37EC49F14A492081BC316DA3A330 -533C97F6CB1C23D4889D8E063B0CFF004E875A9257F6889D76B1F285B6A9E28F -13F85E5D16DFC316363662FF00ED706B9A8C63ED91C611D4C60290763E50ED25 -C064E319627A8F0BFC38BCD67C64DAA5E5E6A9E35F186A3210D7B765AE2E2772 -4125782D9CAFA9C73D2BEE7F87FF00F04F8B869DDFC69E248C4078FB3E82C5DD -B23AB492A0C73DB61C8EE3A8FA93E1E7C1BF097C2CB18EDFC39A3DBD8CAB108A -4BDF2C35CCDD09DF2E371048CE32141E80718E1AB8FA515EE6ACB5094BC91F18 -7827F6788BE13CBA7789FE21D93DD5E2CA648B46164F7D0AB02FB0CA200DBFFD -583D420DC3767EE8FBB3C2FADC7E21D1ADAFE3CEC9D44809464241E412AC0104 -8C1C1008E8718E1358F0B5A6B71A2DCEFF0090F543B723D3DC7F9FA6869FA7C5 -A6DBAC30A0445EC3D49C9FD6BE76B56A95EAF3D466B0A7283B2D8B2063B63E9D -A8031EDF4ED401F87D3B518C7B7F4A9B1D00063DB1E9DA9AF9087039C6001FCA -9D8C7B7F4A08C01C7A7E1D29D80FCB6FDBDBC2F1F84FF6A6F0C78B351855B4CF -10D92AC982BB8C96EF16F424AB63F77E5E32AC0EEC6D3822BCBB3A65E3CCFA7F -87A5D463BAB030A452C7096B1327FA28925FF46084891B28F1F97FC0490E0E3E -D5FF008282FC13B9F89FF0CFEDDA6A44BAE787E63AAD9BC89CBAC71624801009 -05FE538C726351DEBE0CF02F8B63D7A1BDBED5356FB15F476F1DA2218906F656 -CF9720646DC8863886D2398D7629DA001F4D80ABCF4231EA8F3AEEC6C7ED51A7 -7841F55D4E2F0AE9A9656BA96A52EB169E6D83C12C5133C8822552AA16202159 -100036ADC1423746D8F11D075EB8D2095123DBBA8C7CAC578C7A8FF3C57A9EB9 -0CDE2C945CEA5AFE953DD10C1E525C190E725D8AC603392FF78E4B61B2738158 -A9F0A6F35BBA93FE11C82E759B785E0B596E3C8F2945CCAFE5C71AE4E4877385 -2704804955C103D5492D4774F43869C49AF5EAA2FCC8082E48CF19E9CF5AF4BF -059D274F6D49F5496DA3826B192148E6889919F03698DF6380EA79190338237A -83919F1F85E4F0A6BCD63A8241E75B4CA9308A6499304839DF1B6D65C60E55BA -679041C7537DE0B5D4CEAF71E15B5FB7E85657FE45BDE44E55A459BCE6B74937 -8525CAC242808B92194FCE42D293EA26765AB5AF8423D27C79E21F0C6A4345B0 -B48A5F2EDDA5601E068808E2817092BB7985D5F7C65541504F05EBEBFF00F826 -0F83754F0BFECD105F6A71AC4DAF6A736AF6EA1C37EE1A38E24E9EBE5139EE30 -6BF3FB48F075BFC5EF881E16F869E179269AEF54950EAB78B27EE23B758D2466 -5475568E454470EACCE0B2FC876B257ECCFC3DF07D9780BC1BA2F87B4E321D3F -4AB38AC6DBCE219FCB8D42A6E20004E00E8057CB62E32A739F3B4DC9DFE4918E -130CE956A955BBF33FB9248ABF1740FF00854FE35E3FE6097BFF00A21EBF230A -E3F871C1FC3AFB7F9FE5FAE5F178FF00C5A9F198F5D16F467FED83D7E48EDDA7 -EE818F4EDD7DBFCFE1C7A79569097A9D589F891194EBF2E38FCBAFB7F9FE59DA -FCA96DA55C4B26638D1199DB1D000D9EDEDFE7B6AE3381B40EBF875FF3FF00EA -E30BC6CBFF0014AEA7C63FD1A5FF00D01BDBFCFF002F75BD0E549B67983F8BB4 -966665BEC02491FBB7EE4FFB3FE71F921F15E95FF3FD8C7FD337FF00E27E9F97 -E5E690A9D8B85C73E9F4F6FF003FC9E14F1F281CFA74E9EDFE7F9727B66757B2 -47A41F16695CFF00A6E3FED9BFFF0013F4FCBF23FE12CD287FCBEE3FED9BFF00 -F13F4FCBF2F370A78F940E7D3A74F6FF003FC80A78F940E7D3A74F6FF3FC8F6C -C3D8A3D23FE12BD287FCBF63FED9BFFF0013F4FCBF20F8AF4AE7FD3B1FF6CDFF -00F89FA7E5F979B853C7CA073E9D3A7B7F9FE4053FDD0391DBA74F6FF3FC8F6F -20F648F47FF84AF4AE717D8FFB66FF00FC4FD3F2FC8FF84AF4AE717D8FFB66FF -00FC4FD3F2FCBCE02E31F2E39F4FA7B7F9FE4053FDD0391DBA74F6FF003FC8F6 -F20F648F48FF0084B3491BBFD37E9FBB7E3FF1DF6FD3F20F8C34819FF4D038FF -009E6FC7FE3BEDFA7E5E6E1791F2E391DBE9EDFE7F90503003CB0307D3E9EDFE -7F91ED987B247A41F1869033FE9A071FF3CDF8FF00C77DBF4FC83E30D2067FD3 -40E3FE79BF1FF8EFB7E9F979A8880C7C8060FE5D3DBFCFF20458C71D0FF87B7F -9FE47B661EC91E947C61A40CFF00A681C7FCF37E3FF1DF6FD3F20F8C34819FF4 -D038FF009E6FC7FE3BEDFA7E5E69E5900613A1FF003DBFCFF240B8DBF2E39CFD -3F4FF3F870FDAB0F648FD35F8A5FF23DEA7FF6CBFF004525147C52FF0091EF53 -FF00B65FFA2928AE33A0E9FE148FF8B5BE0EF97FE60B67FF00A212BACDB9620A -8C1E39E9DFFCFF009E393F8523FE2D6F83BE5FF982D9FF00E884AEDB4DB2FB75 -F470EC2771C7CA33EBEDFE7F97CC4B493679C7CC1FB43F827FB1BC551F886DED -C259DFC4B1CAD1E4813AEECF18E32817EBB589E735E555FA0FF163E0947AFF00 -8327B1B85D8971B4ACB129678995D70C077F7CFAD7C1DE2BF0BDFF0083B5CB8D -2B5187CA9E2208619D9229190C848191DBA75047506BE8B03888D5872A7AA293 -B993451457A650514514005496F6D2DDCD1C3046D34D230448E3196662700003 -9249A8EBE97FD913E085C788FC516DE26D5AD192CAD4ACD630C88FB8CA1C6253 -C0F9400D827AE738E2B9EBD68D0A6E72133EBCFD9BBC083C01F0A341D35FCE17 -4B6E24B8599836D964C4920047180CC40C7615EA22ABE9D69F62B48A1E095500 -B018C9C01FD2AC8E4F4AFCF6A49D493A8FA9A2D100EB45005150862E28A28C63 -B62AF600EB818E0741401B4773CD36591208CC92BA45181CBB9C01F5AE46EBE3 -1F80ACA5314BE37F0DC528E4A4BABDBA30F7C16FF38FCA941CB54AE524FA9D81 -500E7078F5ED40CEDDBFC3E98AE42DBE31780AF25F26D7C6DE1CB99B1911C5AA -DBB7A7A37B8FF3D3AE8E449A3578D959186432B020FE228E4945EAAC0F4D99C6 -78F7C103C4086E22DE2E01E7E6C7F747A1ECBFAFE5C7F86FE14DD3DE037AACB0 -2F182C578C1FF647B57B2A26E3E83D7D29DE5919E31F5AA551A5CA66E9F36A32 -0B75B6B7489170AA3007D07D3FCFF2908EBC7E9F5F6A53D318E9FF00D7F6A423 -AF1FA7D7DAA0D9811D78FD3EBED583E21F06D86BA9896125FB306231D7DBDCD6 -F11D78FD3EBED4064193B80F7FF3FE7FA357E82694B467029F0874D51C44703B -799D07E54E1F08F4CC1DD091DFFD69E9F9577BE720E8EBEBDBFCFF009FC85957 -232CA3EA7FCFF9FD2F9A60A9436384FF008547A67410927B0329E3F4FF003FC9 -CBF08B4C19FDC9F6FDE9E3FF001DFF003FCBBAF350E391F98FF3DBFCF63CC41F -C4BFA7B7F87F9ECB9A652A50385FF8549A6E4110919393FBC3C7E9FE7F903E13 -696A5B31372738F30F1FA7F9FE5DD79CA070CA7F11FE7FCFE4A645F503B75FF3 -FE7F4ABCFB89D381C2FF00C2A6D2F80B0B703BCA78FD3FCFF270F84DA663FD53 -8CF61274FD3FCFF2EE04C8A3A8FCFF00CFF9FD1C2641DC03F51FE7FCFE4BDFDC -A54A9B5AB385FF00854DA667FD4B0038FF005BCFF2A78F851A6073FB96C7AF9B -FF00D8FF009FE5DB79EA3F8947A7238FF3FE7D9564404608FCC71D3FCFF9E1AE -76354A99C5A7C2BD2E394308188EE0C9FF00D6AED2D6D12D22544E00007F9FF3 -DA9C67503923E99A723875C8A1A96ECD210A717EEEE38D57BC8CC90ED03A119C -55834DC0EE3FFADF4A49B3592BAB1E01E21D16ED75C93642DB4ED0A429F970A0 -7715E89F0DBC3F3E916B2BCA8C86475701BE9CF6F7AED4D9C65B7303F9F4E952 -C712C6AA00E07FF5AB7727256670D3A1CB2BB639BB719E7F2A45000FBB8C7B53 -80C7B63F4AA3AA6B7A768501B8D4AFAD6C2D9700CD7532468BCE3AB11DF14D45 -B3B6E5EC0C938EFE948140C0E71D318E95C5FF00C2EDF877FF0043D786B3FF00 -616B7FFE2FDAB4F47F88FE14F115C25BE91E26D1F549DF8486CAFE29589EA400 -AC4F4E7F035A284BAA0E65D19D08031D31C8CF1DF8A503F0C7A76A407232783F -CA9471EDFD28B77127700318E31FD2940C76C63F4A28A7600A28C52F4A076131 -48471E9FD29D484E0503B1E6FE3FF19E9D63716B62C8649EE6736B6E15F1E6CC -AA65640003D1219B39C7DC233CD7C07FB4C7EC9B7B7D77A8FC47F87AB70F7FA8 -192FB56D1AE4926EA418DDE4A8427CDDDE69237E1B3F2F1815F6AFC4AFD9B3C3 -9F12BC4DA5EABA9693A5DE4D6174F3A8BEB6121B8468E7530392A7081E76947B -8031DEBD117C1102786A0D372AA608CAA900ED4E41C0E9C0C0033D855E1EB54A -33E65B1E7CE3393E68A3F0DE3D6EDA1BA96DB5185F48D4A06F2E5B6BF4F2A546 -E98C37E23FC3B7AFFC008A2D5BC71169134EF636D7B6F35C1BD86E258654FB34 -4F7688AC922AE1E5B7881DC18FCA36ED60187E827C51FD98741F8950DBC3E26D -16D35C86DB7794EFE6248833C80E986E71D335E11AF7FC1397E1AB6A12CE34DD -6AC237E96D697B218508CF4DEA5BB7735EFC331A725EF18A92BEAAC7C9DAE6B3 -69E2D37FAFEBFA9DBD8DF79905B2C7B4A298D6DD904ACC4B332C66088313B99B -24E7764D5DF0678BBC59E33F11DF7873E0F5A5C595BEB56234CD4EEE5B549ADE -1B7B95885D23CA51BF76B22B796C70EA83EF139AFAFF00C1FF00F04E3F8676AC -649B40BDD55F77CAFAADF4E767418010A0EDDFDEBEA8F067C22D33C2B696D6D6 -F0436D6B6CA162B4B58FCA890641E14718CF518E7BFB454CC6295A0AE5A6E5F0 -A3C93F636FD96B4FF815E1C92EE61F6CF13EA4AAFA9EA659BF78E19CED4181B5 -06FF004E7BF4007D3EA36803D2996F0A5BC4912001546001D85495E1CE72A927 -296E77538722D77390F8BDFF0024B3C61FF605BDFF00D10F5F9245719F940C7A -76EBEDFE7F0E3F5B7E2FF1F0B7C61DBFE24D7BCFFDB07FF3FE78FC922B827E50 -319FC3AFB7F9FC38FA2CABE097A9C988F8D080608F9718FD3AFF009FF3C6278D -863C2BA9F18FF4697FF406FF003FE78DADB8FE1C633F875F6FF3FCB0FC784C5E -11D5982E0ADACBC1FF00AE6DFE7FCF1EDBD8C51F3342BF22FCBDFF00C3DBFCFF -002705E9F2E391FD3DBFCFF2444DAA06DEFDFF000F6FF3FC942F4F971C8FE9ED -FE7F9798CED00BD3E5C723FA7B7F9FE405E9F2E391FD3DBFCFF202F4F971C8FE -9EDFE7F9017A7CB8E47F4F6FF3FC81805E9F2E391FD3DBFCFF00202F4F971C8F -E9EDFE7F9017A7CB8E47F4F6FF003FC80BD3E5C723FA7B7F9FE40005E9F2E391 -FD3DBFCFF202F4F971C8FE9EDFE7F9017A7CB8E47F4F6FF3FC80BD3E5C723FA7 -B7F9FE40005E9F2E391FD3DBFCFF00202F4F971C8FE9EDFE7F9017A7CB8E47F4 -F6FF003FC80BD3E5C723FA7B7F9FE40005E9F2E391FD3DBFCFF202F4F971C8FE -9EDFE7F9017A7CB8E47F4F6FF3FC80BD3E5C723FA7B7F9FE400A01E3E5E847E1 -D3DBFCFF00240BD3E5E847E1D3DBFCFF00202F4F971C8FE9EDFE7F9017A7CB8E -47F4F6FF003FC803F4C7E297FC8F7A9FFDB2FF00D149451F14BFE47BD4FF00ED -97FE8A4A2A0674FF000A47FC5ADF077CBFF305B3FF00D1095ECBF0BF451A96A2 -F23212A8D8CAAF7DAC7FCFF9C78D7C29E3E16783723FE60967FF00A213DABE92 -F827A4C96F697370E36E5C31538E015E2BE4F112E4523CF8ABB3D1AFB46B6BDB -330C90211D47CB9239CD7CC7F197E065A6B924D15E69C678D53F7372836C9112 -BC10C0E70304ED3C1C74F4FAA5BB71C556BCD3E2BF8592740E1811C8E9C1FF00 -1FF3DB8A9579507CD13571BABA3F2AFC61F01BC4DE15B897ECD68DABD920244D -6B1E1F8EA0C592D9FA647F21E7D776771613186EA096DA61C98E68CA32FD4119 -1F8D7EABEBFF0008ADAFDA492DC95670410081DCFF00B3EFFE7B79B7883E0925 -FCFB2F34BB5D4510103ED7124981E9CAE3B7F9EDF474B364D2E7467AA3F3B551 -98E0026B6343F066BBE25556D3348BCBC56240748884FC58E147E26BEE7B6FD9 -EB4C8E642BE18D262E40245A44303A7F76BD0746F832DE4A24A7642AB809950A -38E0018E3BFF009E9AD4CDA0B4821EA7CB5F073F65496F6F61BBF12406F65209 -1A7C63314679C1770DF3F4E57EEFD6BEE1F05782ADFC2B69F2C6BE730C120600 -009C55ED07C3167A0A6D853E619E481C724FA0F5FF003DB68FD2BE7B158CA989 -7ABD0B4BB8628A00E7A515C48A2BEA378BA7594B72CA5846338039ED59DA2EBD -35FDCBDBDC5BA432AA190796FBC6DCE07381CFF2EF5AB3C2B34655D4321E083D -0FE95E33F1DBE3B787BF679D1094822BDF11DDC7BECF4D691836DE4195DB0711 -82A09C727903182574A74E5566A10DC7EA7A0F8FBE28F85BE17E9A9A8789F588 -34BB7949584382EF31032DB114166C7720617BE2BE24F8C7FF00050DD56F659A -CFC1512E836D03BAADE4A12E2E664C80094652916403C1DC4647CC315F2A7C5C -F8E7E21F885ACCDAA6BB7F777D77312611B9942AF7112F4890155E07703A9CE3 -CB6682E753399DBCA889E608CFC9D7BFAFE3FF00EAFABA19751C3C54AB6B2FC0 -49393D363D3BC73FB47F8ABC668F0EB7E29BFD423F34CAB6F737925CC41B24FD -CFBAB8C9C0180303D38E2078F6ECB36CFB4B81FC491C6A3F515D2FC3CF85F078 -8AE344826D3AF5E2D6AFA4B182EAD4A2476C63F29E690A907CCD91C85CA96882 -AAEE2F8040E5A1D364B8B88ECEDE133CEF22C28887E667620281DB9247E0475E -B5E8FB5B7C1148AF663A4F88377138DD24F1FF00BC919C7E43DBF4AEE7C0FF00 -B4A789FC12F147A4F8AAFEC21122CBF67B5BD96DE12C0F3BA33F23741C639EFD -B1C018167018461C6000D8E3F4FF003FD3534DF87D6DAD69F757B7D7B67A45BA -DA5CDC5AB5E39CDDBC3B374281413BCEF18DD81C1EE387ED5495A514D09D35DC -FB7BE0BFFC143F52B4BAB6B0F1C450EB3692CB183A844AB6F730464FCC5902EC -97191F7769C039249C8FB77E1FFC4DF0BFC4FD2A5D43C33AB41AAC11B0128452 -B2464F203A300CB9E719033838F6FC1A31DEE8D36FB7679604C62190FCA3918C -7A7E1F97A7ACFC1BF8F7E20F875AE41AA6897F73637303033A2B33230C1F9264 -1C4A8493D7A75183D3CEAF9750C42BD1F76438B943CCFD90BCF154905DCA16D5 -5AD60729231721F39C0C281C8F7F6FCBA403E5C9F4F4FF003FE7F4F17F801F1A -3C37F1EB4892EE2822B3F10DAAAB5F69FBC9C67FE5A27678C9E9D48E0360E09F -690B8C29181F4E3F97F9FE5F2B2A73A52719AD4704DDDB023AF1FE79F6AF803F -6F5BCBCB5F8C3A488AE66853FB163C08DCAF4B8B8C743FE7F97E81328DA78EDF -97F9FF003EDF9F1FB7F803E30E91C60FF62467B7FCFC5C7B57A995D9E215D115 -55A27CE0355BE18C5F5D0C1C8FDE9E29DFDB17DFF3FD75C74FDF371FE71FA553 -A315F6BCB1EC71DD973FB62F874BEBA1FF006D9BFCF61F950358BF1D2FAE863A -7EF9B8FF003FD2A9814B8A3923D8572E7F6BDF0FF97EBA1FF6D9BFCF61F951FD -AF7C3FE5FAE87FDB66FF003D87E554E8A7C91EC1765D3AC5EF18BEBA18FF00A6 -EDC7F9C0FCA81ACDF81C5FDD0FFB6ED54B1ED4BB7D8D1C91EC1765C1AC5F75FB -75DFD7CF6E3FCF1F9528D62F97A5EDD8C71FEBDB8FF3C7E554F1EC4518F63D69 -F247B05CBC759BFE337D7800FF00A6CDC7F9FE9F97DFFF00B025D4D77F083597 -9E596571AF4CA0CA4B103ECF6DC64F6AFCF229D3E538AFD08FF827DAEDF83BAD -0E47FC4FE6FF00D27B6F6FF3FCBC9CCA2950DBA9D741FBC7D36063DB1FA50785 -CF4C7E94A07E1FD29ACCAA06EC28FD2BE48F44F3D4F894BFF09C8D11AD6EF7B4 -A23497FB3EE7C9C1DDC99FCBF2FF0087FBD8CFCBD73587F19BF69BF03FC1BB4B -A86FAFE3D4B5E85008F49B46DD2162C0624700AC58DD93B8838C900D7877ED59 -FB4FD87816F755F0F78457FE2A125A1BED551DD7EC2ED81B221C0328CB9DDD10 -8E32C3E5F837525F11F8DECFC41AE5A5ADC6A563A5CA926B3A8C85A48EDE59A4 -22332B1219DE470C339FBC0927AD7B583CBA55173D6D13D91C3CF24DA3E80F8B -5FB7B78DBC56D7034CD47FE11CD29C054B7B0711B2F391BAE8A072DEE8541C7D -D1CD78478ABE2278BBC61672F897539B58D4ACC5D2D81D52EE29AE2333797E60 -8567946DDDB32DB41FBB93DB8E2E3D253716B92679783BA4E481EC31C0E7B015 -EB7F0FBC61A2C7F097C7FE0AF10DE1B4B6BB8A1D6346610BCB8D4A16DBE580A0 -85F36391C176C01B473C62BE8E14A9D256845232D65F133CB078BB5524E22B90 -07424423F1AD7D2754F13DDE9D7FAB5BE9BA9CDA5E92D10BEBD8ED7CC86D7CC6 -DB1798F183B3730C2938C9181C8E3386DE30BB781919CD7B5682E7C21FB2178B -E673FBCF1BEBD69A5A42C3AC162AD3B48081D4C92221AA76EC16467782BF6C1F -1EF84EE122B1F18EA611544612EAE0DC8441C0D90CEAC063E9D00E98E3EC8F83 -3FF0500D0BC512C5A7F8CA38746B9F246753B3DF2432483190D0852F1E7279C9 -1EBB6BF34EF34DB5BA22492251B724161D07F4AE8E3F86BE21D07E179F882CEA -3441AB0D160DF262E6594C4D33ECC755558D41DD8C93C124115CF570D46A2F79 -59F72A2DC7E13F62FC4FF1434DD37C3B06ABA74ABAB69B700B4577A5C525F44C -06E191E423FCB952371E32315D5F86B575D7746B7BE58E487CE1BBCB9A368DD4 -76DCAC03038C641190720F22BF29FF00677FDA8F50F01DF4167768357D02E095 -934E96674451BBE6684E7F76FF007860E54F3919008FD4CF03789343F15F852C -356F0E5CA5CE8D74A5EDE55464C80C54E55806043060411C10457CCE2309530F -377D62F63A294E5393B9D05140E945721D6145145002150719008A090A3D8529 -E3DBB57CADFB5EFEDCDA3FECEAADE1BD12D22F11FC4299014D35CB082CB281D2 -49D801B8608211581231929906B68539547CB144B696A7D31ACEADA76896335F -6A9796FA75943832DD5DBAC71C609C02CCDC019C75FF00F579AEA1FB4AFC16B6 -B830DD7C49F07F98BFDDD5EDDF9FA8623A8AFC82F899F14BE21FC79D525D47C6 -FE27BEBE8DE4674D2EDA568ACADC9E36C7106C0C0006EC64E01273CD5FF821F0 -7747F15F8DBECBA9E9D1CFA641A7DE4F2865FBB2790E96DC2FCCC4DCBDBA8519 -C96C60E6BD7596B506E6F5EC71CEAAB376B9FB0BE1AF8F1F0C7C4B730DAE8DE3 -CF0C5FDD48C112DADB56B7795D8F0AAA81F7124F4E2BD05650C011CE79E3D2BF -0E756F0978035F76686DA5F0DCA26B870F0E5563876830C602A9F9F7075CB1C6 -4A9380093ED1F0F3F696F8C7FB34CE8D73A85C7C46F0CF950C977A4EB97924B7 -56B1328915A1B8CB104C7FC3B485C80532A7678DEE737B392717D2FD7E679143 -39A4EA2A55A2E127DD6FF33F5868AF3FF825F19B40F8F1F0EF4CF197866F23B8 -D3AE9364D060F996970BC4B0BE403B94F1D00230C32181AE63C51FB49687E15F -1E69BE1ABEBFD3EC66BF8669E37BAB98D42246C982F97057CC0FF20C6728FC1C -1C29C5C3467BF2A918EACEE3E2FF001F0B7C61DBFE24D7BFFA21FF00CFF9E3F2 -48C679F93A67A0E9D7DBFCFF002FD66F89D33DCFC22F164B229466D0EED8A37D -E52606C83EBFFD6FCBF279B2A7EEEDFE9FE7FCF4E3E8B2B7EE4ADDCE3C47BD24 -D11F967FBA07F4F7E9FE7F0E30BC6C9B3C29A9F18FF4797FF406F6FF003FCB7C -E78C8E9FA7F9FF003D38C3F1BAFF00C52BAA0C6316D31C7A7EEDBFCFF9E3DA6F -4308AB33E62887C8BF2F7F4FA7B7F9FE4A17A7CB8E47F4F6FF003FC8451B5703 -8C8E7F2F6FF3FC80BD3E5C723FA7B7F9FE5E71E8005E9F2E391FD3DBFCFF0020 -2F4F971C8FE9EDFE7F9017A7CB8E47F4F6FF003FC80BD3E5C723FA7B7F9FE400 -05E9F2E391FD3DBFCFF202F4F971C8FE9EDFE7F9017A7CB8E47F4F6FF3FC80BD -3E5C723FA7B7F9FE40005E9F2E391FD3DBFCFF00202F4F971C8FE9EDFE7F9017 -A7CB8E47F4F6FF003FC80BD3E5C723FA7B7F9FE40005E9F2E391FD3DBFCFF202 -F4F971C8FE9EDFE7F9017A7CB8E47F4F6FF3FC80BD3E5C723FA7B7F9FE40005E -9F2E391FD3DBFCFF00202F4F971C8FE9EDFE7F9017A7CB8E47F4F6FF003FC80B -D3E5C723FA7B7F9FE40005E9F2E391FD3DBFCFF202F4F971C8FE9EDFE7F9017A -7CB8E47F4F6FF3FC80BD3E5C723FA7B7F9FE401FA63F14BFE47BD4FF00ED97FE -8A4A28F8A5FF0023DEA7FF006CBFF452515033A8F84D1193E17F82D00009D1AC -80CFFD714F6AFAB7E1459BDAE84DBC01B827E1F28AF96BE0A28FF857DE020571 -FF0012AB0E476FDCA7B57D83E0D5DBA1C5C019DA4638FE05AF8DC5EED7A9C11D -CDBFBC4718FF003FE7FCF4523E5C0E291571D4529E0743F85706C6E001148631 -9C9506B13C65E38D03E1F68F2EA9E22D5AD748B18C1FDE5D4AA9E63052DB5075 -76C29C2A824F615F24FC44FF00828498E6F2BC0FA02CA99F9EE75C5207FC0638 -DC1C1EC4B03EC3B7551C255C46B042BD8FB40C6807DD03B74A55E3815F9E2DFB -7E7C492D9165E1E51E8B672F1F9CA6BA4F077FC142B5F875541E2AF0F69B73A6 -90559B4849229D38E1B1248CADF4F9739EA315D93CA7131F7AC982923EEBEDDE -9715C07C29F8E1E11F8C7A62DD787B511F6A0ACD369774552F2055382CD1063F -2F23E604839C672081E818C7E15E6CA1284B966ACC625033E94504FCB9C640EB -522398F893F10B4CF859E0DBFF00126AE246B3B30BFBA81434B2B33055451919 -249F5000049200247E3DFC72F8B3AB7C42F155F6B5ACCC2EAF6F59544680AC60 -A838455C9DB1A8C719CF5EA79AFABBFE0A05F1725D53C4D67E08D3AE526D374E -F2AEAE50202CB7843F05BD1627E9EAE73D063E079AE5354BC7B911B08D479508 -61C0418C71EE413F881C638FAECBE8FD5A8FB47F14812E795BA11436CC8E6595 -9A69DB05A46CE4FD7FCFFF005AC15F44C7F4FD3FCFE1C37663F808C7E9FA7F9F -E514B2ECCA22FCC7AB1EDFE7FCFB74BD5DCEAD22B43734DF183E83A4DE69E2CA -CA78EE5812F716E249233865250E3BAB11B4E57215B6EE4465DCBBF8F5ABCF69 -6B651D85B43059875B554130580197CDE0197E6232D1EE70CC50E18B15529C3C -7680B166CE40EBE9FE7FCFB583120046C18001E9FF00D6FAFF009E8EEBA999DD -4FFB446BB791E949716D6CCBA6D9DB69C811255F36181E3641210E3713B0866E -0B06233854D9CD6B1E2C9BC4F25CBDC2451249334E2DEDF7F97012EEEC1158B6 -06646E3938C0CF5AC97850820C67B138E08F7E9F5FF3D2ACB6421C3C7B9483C6 -7B7F9FF3ECD3422E151CEE4C803A1EDFA7F9FC38A577A79F304B6E4C13A9C865 -1C8F5FCFFCFB496F70483148B875CF38FF003E9FE7B59DA33F7718C1C9EDFA7F -9FC389D63AA1B3D27E01FC68D6BE1C78AAD35CD1EE120BCB72D13C3286689F72 -FCD13807263619231C8201182011FB19F0E3E20691F13FC19A6789746694585F -2B3469709B2442AC55959727A1523A91C641C60D7E13C6D0E9771F68706385D4 -45388C02CC848E791D8E0E7A8C1C7B7E82FF00C13BFE2E4F69AF6A1E05BE9635 -B5D47CCBEB5CA61BED6A103AE475DD128383D3CBE31935866146389A3ED62BDE -89116A12B773EF83C29EA303F2FF003FE7DBF3DFF6FF001FF178B48E31FF0012 -48FF00F4A27AFD07EA991D3DBF9FF9FF00F57E7C7EDFDC7C62D1F231FF001248 -FF00F4A2E2BCACA7FDE55C2BFC27CCD4628A50315F6E79C145145300A0518A50 -303A5000063B52E3D8F5A31EC7AD18F634C031EC7AD017D88A369F434EC63B63 -FCFD298EC1B718E0FF009CFB7F9FE5FA0DFF0004FB5DBF07B5AED9D7E63FF92F -6DED5F9F3B7A7CA47F93ED5FA0DFF04FC18F83BAD76FF89F4DD07FD3BDB7B579 -399FF07E674D0F8CFA6CFCA338181D7DABE7BFDB17E37DCFC26F034763A2CBE4 -EBBAD09605981DAF6D0052B24C841055C1650A4F7C91F778FA02E258A085E49A -4582245DCD23901500E7393C01EF5F917F1CBE24DE7C68F897A8EAF05B37F68E -A3731DA697A6EE2CDB8E23B6842F396242B3053D4B1E074F130387556A5E4B44 -75569D9591E57A8BDDF8A75974335CA590950EA1A8B2C922D9432153BD8A8EA7 -3C9CF7C753C7B17843C4ADFB3FDC683A925AE9971B2D1A39F4C85A57D3BC53A5 -4A644491D5548F35585C6E1304DBB210630E922B72F6FE1DB9F84CB247AB5BEB -5E0EF1D442ECCC75BB60F67AA40F1C8255DBB0140CA5900DB2C6FE62F3128CD7 -03AC89679DEE64B33616F72DE7456C0B6C8D58E42A16249519C0249CE3AF5AFA -ABDD591CDB1DC78CBE16C3278935C7F02DFA7897C29636075A3761CABD85A3B0 -D915C160AA675DE8ACA84E49E3A304F3A7428CCA472A706BB9F0178A6E2CB45F -1169373ABBDBE8ADA75DDC476535C6C80DD322A0708480642AA141EB81815C28 -5DBF2E36E38C7A52485B9734996C63D46CFF00B4D676D3BCF4FB4FD959566F2B -3F3F97BB82D8E99E8715EB5F17134FB8F873A1DEC3A2A785AC67BC91FC39A6C7 -7934F2DD69F99165B9B94924711C9B92001D447E6EE90ED654523C9748BF1A4E -AF677A6CEDAF96DE6499ADEF119A1982B6EF2E40ACA4A9C60804704E083C8EBB -E24FC525F89777757F75E14D1349D56E6659A6BFD3A4BDDEC1576AC6125B9923 -48C0C00AA8368550B803145B60470CA7041C74ED5D77C43F89BAA7C478FC3905 -F416B6765A06990E97656764852148E3EAE5493F3BB7CCCDDC81E831C80C9C71 -CFB5751E16F861E23F1B69D35E691A6497902C8D6F1EC9511AE2655577860562 -0CD28475731C7960BCE287DD8D36B6381BA866D3AE0DDDBE4AE419221D08C8E4 -0FEF00060FB63A74FAFF00F62AFDA20FC35F1445A6EB124A7C39AD6C4770E0A4 -526EDAB700161803243F19C60F2540AE2D7C1BF0EFE0BE8AB73E30BAB7F1EF8D -27844D65A2E897C25D2AD372EE8CDE4F1956770707CA8DB057196C3823C6ACB5 -690EB5318922D3ED1CC973159C0311420B069238C9C9232410092405639E054C -A31AB17092D18AFCBAA3F736399640361C8C6411D31520391E95E0FF00B1B7C5 -0B5F887F0774CB33297D57418934EB84655522103FD1D8053F74C61464E09647 -E31827DCE6BB82DDD5659A38D98642BB0048F6FCC57C755A6E94DC1F43D28CB9 -95C909C5009F4A43CE38FD2855CF1D3DFD3F4A84AE0DEA78AFED77FB405A7ECE -7F07753F11BF98758BA0DA768C9122B937B246E622C1B8D8A5371FA63BF1F921 -E17F0E3789FF00B5B5BD6B518AE7C53A94ED77777BA8DE2C2CF333EE625DC1DF -93BC6032E36E72738AFA97FE0A59E297F887F1CBC09F0FED2D3CF7D16D64BC28 -992F35C5CB441230075C08E3C7A97F4C63CBEE63F034975AACD1F85F50B7B782 -696DD2D965C47097F33C806569F9936263CB19CF96E46EDA73F4D81A5C94D49E -ECE39CB999C0C9E17F2947FC4CF4C189161205E21C138CF4E703A938C75C1247 -10E93F1064F86DA8BDED849FBC919218E4300628C25592370083B5C3C4AC083C -15EF51F8934C9FC2D046D7914F6C0A07C5C47B0EEEE146493C9033C72083D081 -67C376B67A8C21E75F34E3852C78E3FCFE55DD297299725CC70A5B0154F6CA91 -D3D78C7FFAABD7A0D7EE7E0FF843499340918CFE2040F7D70D3B3C7246B086F2 -D22D88AC87ED3870E650CF0E08550C87C9B5D960D2750558FE48C9001DDF74D4 -D65A6DCEA72C91C014B410CB72C1DC280880B3119C64E0741C9EC2B3A94E1888 -724F630AD463520E9D45B9EA5F0A7C67A97ECC7F153C3DF10EC6E6F20F877E22 -BB8EDF5E898B4504C9B56379C42A7E711492B956FBC48E832C2BF4D8FC3ED0FC -61ABE85E2ED3EEA39425B48FA75CC4AC50DBDD08D9C81C0219638F6F1C0CF73C -7E51278526D57C0FAFE97A8C565A75C88488AEEF84CB34AC51F7448DB4C5B959 -4E4360EEC004FDD1FA1BFF0004EFF8A57FF143F667D106A4AA6EBC3729F0E34A -1029956DE38BCB6C0E87CB7553900E50938CD7C92A4DF351A9BC1FE1D0E0CA67 -2B4F095B574DE9E8F63D9FE29DB8B7F84DE2E8D73B5344BB504F27881BA9EFFE -7F0FC9B65C1C6DC60FE5FE7FCF4E3F5A7E2E0FF8B57E30E39FEC7BCEDDBC87FF -003FE78FC96C723E5C60FE5FE7FCF4E3E8B2D8F2C19EBD6B5D0D0BD38C7F4FF3 -FE7A7185E361FF0014AEA7F2E3FD1A6EDFF4CDBDBFCFF2DE0B8C7CB8C1FCBF4F -F3F87183E365C78575338C7FA34DFF00A2DBDBFCFF002F5DEC73C5BBA3E62857 -F76BF2E39FF0F6FF003FC9C17A7CB8E47F4F6FF3FC9B126235F97BFF0087B7F9 -FE4E0BD3E5C723FA7B7F9FE5E73DCF4402F4F971C8FE9EDFE7F9017A7CB8E47F -4F6FF3FC80BD3E5C723FA7B7F9FE405E9F2E391FD3DBFCFF00206017A7CB8E47 -F4F6FF003FC80BD3E5C723FA7B7F9FE405E9F2E391FD3DBFCFF202F4F971C8FE -9EDFE7F900017A7CB8E47F4F6FF3FC80BD3E5C723FA7B7F9FE405E9F2E391FD3 -DBFCFF00202F4F971C8FE9EDFE7F900017A7CB8E47F4F6FF003FC80BD3E5C723 -FA7B7F9FE405E9F2E391FD3DBFCFF200031C0183F974F6F6FF003D8000BD3E5C -723FA7B7F9FE405E9F2E391FD3DBFCFF00200031C0183F974F6F6FF3D8000C70 -060FE5D3DBDBFCF60002F4F971C8FE9EDFE7F9017A7CB8E47F4F6FF3FC8000C7 -0060FE5D3DBDBFCF600031C0183F974F6F6FF3D803F4C7E297FC8F7A9FFDB2FF -00D149451F14BFE47BD4FF00ED97FE8A4A2A067A17ECED68B75E0EF01AB2028B -A3D912076FDCA0181DF922BEC0D2A05B7D3A054181E5A9FD07F857CA5FB2DE9F -25E7847C1054615745B005860E331C78E3F035F5A5AC7E55B4487F8500E062BE -2714FDFB7A9C715625AE43E2A7C4ED1FE11F832FBC45AD3E218176C36E182C97 -3310C5224CF566DADF40093C038EB892BDABF3DFF6F0F88D79AEFC51FF008452 -3B89D34AD16084C96A5808DEE5D4C865C0EA4472A20CF4C3E31B8D5E0B0FF5AA -CA1D16E53763C4BE27FC56F107C5EF12CBAD6BF3E64C6C82D620561B68F8F923 -18181C0C9EA4804F3D390A28AFBF8C6304A3156440514514C0BBA26AF79E1DD6 -2CB54D3AE64B2D42CE659EDEE236C347229CAB0F520E383D40C74E2BF4A3F661 -FDA2EDBE37F87E6B6BD892CFC4FA646BF6D8502AC7329242CB10CE71C0DC3185 -2CA33822BF32EBBEF81BF11EE7E167C4ED175B8AE9ECED05C4705FB22EEF32D1 -A45F390AE39F946E1EEA0F502BCEC7612389A6DA5EF2D50D49C4FD66FC28CE38 -F5A8ED2E62BDB586E6DE449A09543A491B065652320823A823906B13E216AEFE -1DF017893558DCC525969973728EA7054A44CC08FA62BE22317CC9752CFC78F8 -C9E2A93C59ABF88B5C45FB24FAADF4B70B18FE0F3A62E5549F45638FA7B57990 -4099013681C00474FD3FCFF2EF75DF0DDEF8AEFF0042D2748B66BBD4EF7508E0 -B6B74203C923A32AA02703259800491DBA76ECFF00E1893E3775FF00857D7814 -9183F6AB6C0CFF00DB4FF3FCBEE6AA6B962BA1A53B389E1D27C8B9DB823D47FF -005BFCFF0028E342A325791EBF8FF9FF003C7A0DE7ECFDF11E0F13EAFE1C4F03 -EB77BAD6906117F69A7593DE1B6F3537C45CC21800EBC839EC7D0E2CAFECE5F1 -5573FF0016CBC61F868575FF00C6FF00CFF2C2CFB1ADAE79DAAE15BE5C639E3B -73FE7FC8E347C3DE1FBEF15F88F4AD0B4BB7FB46A9AA5DC3656906E0BBE591C2 -20C9C000B11C9200EBDBE5F55F0AFECCFE2CBD6B95F13782FE23E911AEC301D2 -BC192DFEF3C86DC1E5836E0630416EA7818AFA3FF658FD85EDB55F1C68FE37BD -BEF1968569E1AD561BB8F4EF1278663D2A7BD9A3C4A9B337731F2D5847B98C63 -70DCA8C08256945BDC563E0BC039201C6320FF005FF3FD3853C291B78033F4FF -0038FF0038E3ED8F8D5FF04ECD3BE1779179A36ADE35F11E91773345159E87E1 -78B55B9B4C00479A56E60241C1C304DA3041DA4AE7C2BC51FB33F8AF4FB9B5FF -008467C0FF0011B588486370DAB78365B13191F7422A4B386CF3924AE3818E4E -0E568123C52E610843A82AC307AE31FE7FCFB4917CD1E76E38CF1DB9FF003FE4 -71E91FF0CE5F151B20FC31F17E3D3FB0AEBFF8DFF9FE55ACFE027C479BC4BA57 -875FC07AEE9FAC6AE66FECFB4D46C9ECCDC794824976198286DABC9C1E38F6A4 -EFD85CA708D1EE561B4F385EBD8F078E38FF003F4F4BF811E329BC2BE24F0D6B -7716ED38D26F20BC7446DA6410CAA719F5655E7EA7F0E9BFE1893E3683C7C3EB -DE076B9B7E3A7FD34FF3FCB80D134CBBF0AEB3A968FAADB9B5BDD3F529ECEEA0 -DC18C5222A2BA1238CEE07A1C574D15CF78195556573F71D0AB21DA7EA7F2AFC -F6FDBF40FF0085C3A461403FD8B1F4FF00AF9B8AFBCBC19AA9D7BC1DA26A658B -9BDB186E4B91D77A2B67A7BD7C1FFB7F6EFF0085C5A467803458F1FF0081171E -D5F39962B62ADEA3ACEF04CF99C0A28A2BED91E705140A50303A5002E31D8D18 -F63D68C7B1EB463D8F5A6018F63D6942E3B1FF003F850171DA971EC47F9FA534 -52418F623FCFD28C7B11FE7E9463D88FF3F4A31EC47F9FA53186DE9F291FE4FB -57E82FFC13F863E0EEB3C63FE27D2FFE93DB7B7F9FE5F9F7B78CE08C7FF5FDBF -CFF2FD06FF00827E82BF0775AC8DBFF13E9BFF0049EDBDBFCFF2F2732FE0FCCD -E82BCEC77DFB5378CE2F077C0FF143322BCBA85B369712B9C02D38F2CE3BE421 -76C7FB3DBB7E4FDFDAADFEBDA4C735F5969F0997CD79EF848628707085BCA566 -DB8DCA70A491F4AFD1FF00F8282045F83BA464EDDDAE42703BE2DAE7AFF9EDED -5F09FC13F04EA5E32F889E2B96C96E1974FB686112A784FF00E1218519809151 -E1F2A411EECBE1CA64E1874C8AC32E8F2D072EECD2AFC7666C7C4AF8B5AEE91E -07B2F873A6DF59378565B78DAE20D37521A8D8CC43ABA34225433DAB6E525A36 -9392DC2A0F96BCCFC59E26FF00848858B791768D6D07D9F75F5E7DA587CC4854 -6DA0A4633858CEEDBCF272457A06B5FB3FF8EEFF00E22DA4177A15F41A6EA5A8 -D9D90D757C3971A6E9F1B4ED1C4AC6368225401E40B8C2EE6CE0E4835AF63FB2 -6789FC77A6AEA7F0E6C752F1558C97B7968D77750456304D15BBC689730C9248 -11925DEF840C594C2E0938F97D34E2B433B3679F68FF000AB58D6741D3F56B66 -816D2F63F3118CBB5A36F3678D51C9C2A6EFB34A41270C07CBB9814199A0780F -50F11DB4B7F0CB6F6BA7C5711C1235D1647C12BE648AAAAC5D22122339504A87 -538EB8F62B4FD89FE3EE9D389ACBC2973672A0C472C1ADD923804104644F9E43 -30FA123BD407F61CF8EEA1827831D54E4606B362383C11C4FE94392EE559D8F3 -7D4BE12EBBA42C2B7106679B01604490CA87CAB670AE9E5E5589BC82303FBEDB -4E3EF04F10FC26D5FC3EB6F97B7BFF003E18A70F63279814493BC0A81301DDF7 -C6C0A20257A36D2182E9EB7E07D73E1BF8A26D0FC53E1D86DF5AD26D9926496F -11DBCE95049148AC85D7E54741807690AB900838E4758D76597529A4B485F488 -BE553696F3B154651D727924B0DDF526ADAD10AF63A5D3FE0CEB7A9EA17105BB -5B2A410433192E6430867920170B06E650AB208CF219954107E6C0CD77BFB386 -98FE06F88DA17898EA1E1457B0D5A7D2EF2CF5DD4D2C67B105149BB092056C6D -6210947FDE2ED640D8C78A43E20D4ADEE56E22D42F609D66FB479C970C1C4DDE -4C8C1DFF00ED75E3F2A321323337CDEB96EB4B75615C5B8643230899E48958EC -79502B91CE370C9C1C76C9FC7AD52D4502C4B74FBD56D5C4E766390BF7874EEB -B87E3F95C2A3B9298E72BD47F9FF003EDE85AE7C7BF11EA967A8D9DB697E17D0 -ECF52B67B3BA8B48F0D58C2CD13AB2BA093C9F3002AC4677023A823B1662DCFA -13F600F8832E85F1365F0D6E325AEBB03C44903E5960579226CE338D9E68C03C -9607B71F56FC42D57C5965E26B54D2B46B4BEB3967712BDCDEBC255424980556 -093099D84313D7B0C827E07FD8AB509348F8C3E0299B9790A40D20E3065B768F -3D3FDAAFD579F4BB5BA3996DE373D0EF4078F4CE2BE7334A57A8ADD4D611E78B -8993E0AFB79D1505FC4B14A08DA884B281819018805867382557231C7A6F3292 -A40183D891D3F4A238D6350AAA15474006001C7B7F9FE4F038E98FF3FE7FCF4F -3E30704AFD0E94ACAC7E48FED8D2DD7863F6EED6756903ED16DA7DF5A9889570 -B1C36E1829C71968DB9EC40FC383B9F1EB41E1AB0D134FF360B1459E3BA88471 -446E63958161BB613C0DC159FCC65DC42903207D0DFF000540F08268DE2AF027 -8EADAD800FE6E8DA9DCEFC028551E0DC0F4C6263BB1D17048E2BC02CBE1CDEF8 -7A4F09EADE2582DADB42D71F7C6DF6D89A4587646E646447DD19F2E54750C327 -2A42B6429FA8C24D4A8C6DD0E3936DDD1C2FC71F12C5E279C5F5ADB5DD9C48C5 -DE2BBB9FB43EF69A591886D8B805A4CE31C1C9CF3C57F01788F4FB256FB5C6E7 -31ED568D436D3907A1E3B11ED573C53A7C1770C056D6388343B59526F3039C10 -188C9DAC7BAF18F400E2BCFAE6D1F482C4CA628F7614321383CE07BE6BB925CC -986EB94D8F19EA31DE48CB6E8CA19BE54279193C0FE5FE7A7596773259B19226 -DACF1B46C7008DACA558723D091FE78E474AD09E49D6E2E0190AB7CAAFC05C1C -822BD5FC0B7FA058061AD4103912EE8DE78CC831E44CBF30D8FC073111F29C90 -32085C54BB27725A5B13F85358D42F1B572D7373B25B4114A96F3794ACBB8BFC -C807CC320B918EA32483935F6B7FC129917FE14278B9D798DFC637CC9F4F22DB -BF7FF3E9C7C69F12340B6F87BE0ABBD56DEFA1924D690B5A5AC96E6296359551 -ED8C7B70376D9A32C3A73F28650AD5FA47FB137C204F837FB3AF84F4B92DE483 -55BEB68F54D504D1B4727DAA645660CADC864511C67207FABCE01C81F23292A9 -5EB555B3692F91E465A9D5C657AEB6D12F3B1E95F1738F859E30E3AE8D783A7F -D307F6F6FF003DBF2536FEF3EEF7EBFE7FCFD3B7EB7FC5DFF9255E3218FF0098 -35E71E9FB86AFC95C7CC78EDD7FCFF009FE9EF6034833D7C47C488C2E31F2E30 -7F2FD3FCFE1C6578AACBEDBA0DEDB0FDDB4B0BA062320128467A7F9FE5B38C76 -C607E5FE7FCFB65789AE16CB45B9B865252189E4603AE021240FCBDBFC3D4567 -B98A5D8F0AFF008567344767DB50ED38C84A4FF856F30FF97B4E3FD8FF00EBD5 -F97E22D934AECB6973B598919DB91FE78FF3D1A3E2259F1FE873FF00E3BFE7D3 -FCF4E7B533B39EA14FFE15B4DC7FA627FDF1FF00D7A3FE15B4C07FC7DA7FDF1F -FD7AB63E225A7FCFA5C7E4BFE7D3FCF451F112CFFE7CEE3F25FF003E9FE7A16A -63E7A8531F0DA6CFFC7DA7FDF1FF00D7A3FE15B4DC7FA627FDF1FF00D7AB9FF0 -B12D3FE7D2E3FF001DFF003E9FE7A27FC2C4B4FF009F4B8FC97FCFA7F9E85A98 -73D429FF00C2B7987FCBDA71FEC7FF005E97FE15B4DC7FA627FDF1FF00D7AB83 -E2259F1FE873FF00E3BFE7D3FCF441F112D3FE7D2E3F25FF003E9FE7A16A61CF -50A9FF000ADA603FE3ED3FEF8FFEBD21F86F32F4BA53F44FFEBD5D1F112CFF00 -E7CEE3F25FF3E9FE7A1FF0B12D3FE7D2E3FF001DFF003E9FE7A16A62E7A8503F -0EA61FF2F6831C9F93A7BF5A3FE15D4E3FE5ED0639FB9D3F5ABDFF000B12CF1F -F1E971FF008EFF009F4FF3D1A3E2059F6B4B9EBFECFF009F4FF23876A63E7A85 -3FF857538FF97B418E7EE74FD68FF857538FF97B418E7EE74FD6AE0F88167DAD -2E3AF1D38FF3C7F91C1FF0B02CFB5A5C0E7DBFCFA7F91C16A61CF50FBD7E297F -C8F7A9FF00DB2FFD149451F14BFE47BD4FFED97FE8A4A2B88DCF59FD8B6E21BF -F0D68DE45DB4EB65A4E9B673C0D115F26716D0CC792A376639E13C640F63903E -B45508A00E8057CEDFB12E830D87C1FD0AF15417BFB0B4B99081DC5A5BC40F4F -4840FC2BE890368C7A57C3E25B7519CA846E08E0E338E057E447C5AF104DE2AF -8A1E2BD5A790C8D73A95C32E79C20908403D828503D857EB56B8B9D3A43D9707 -0471D457E4C7C5EF0EB785FE26788F4F2432A5DB4CA476497F7883FEF9615ED6 -4ABF793091C8514515F564051452D300A50E4038C7E5494EF2F39C76EB43DB51 -1FADBF045FCEF835E027DC5FFE24361F31FF00AF741FCC1FCAB4FE256907C41F -0EFC51A5AA967BDD2EEADD42F525E26518FCEA8FC1CD3EE749F851E0CB2BC431 -DD5BE8F690CA879DAEB0AAB0FC08C7E06BB2C6597039FA57E7726955938F7367 -AD8FC4DD53C4F7FE09D5B40D7B48956DF56D3B528AE6D65650C2396356753B48 -C1F9941C1E2BD357FE0A17F1C978FF00848EC49C01CE936E39FC63F503FCF4F3 -FF008B9E166F0C5DF88F4372B7371A2DECB03C880E1FC99591D93201FBA1B1C5 -7A1FECFF00FB0B78CFE3A683A6F8A05FE99A17856F272B1DDCD29967962490A4 -8F1C483A8657501D9092BE9835F6B55F372C9751D3D9A3CA3C51F1EFE276B9E2 -DD63C576BE35D6345D6B59784EA373A1DE3D825C98A211C41961280ED45207D5 -8F735574EF8C1F1CF549648ECFE2678FAEE48D0C8E906BD7AE557BB1024381C8 -E6BD53F6ADF853F08BE153E8DA37C3AF15CBE20D72DA79935B5B89BCF6019633 -1B092389600A84302A1B702EB91C1C7CFB1DC4967341736E5A3B885D66864518 -28CBC87071D4100FE5F8677B1676773F15FE3C5969D16A53FC47F883069F2362 -3BA975BBE1139E780C64C1FBADD3FBA7D0E3E8DFD93BF6ECF16FC16B0F1168DF -16748F19F8CF4AF39AEE1D67F7B7B7D6522A4692432FDA2400421407E18146DF -90FE6653E4CD3B55D63513FD892EAD3C16374CDB6D2467F25DB9644D918EE460 -0C6036DCE06E61DA699F0B3E23F88ECFC529E1ED5EDF568FC37AD5A687335ADE -E229249E79E181E16DA0187CC4701B20A89F2060C9869B1AD0FA03F6ABFDB43E -247C5EBDB0D0FE1E68BE2FF87BA1C322DCC57789ACB55D41C26D6CF92FF2C2A6 -4C6C05B242B360ED03E7F8FC7BFB444C6111F8DFE25B9981F282EAB7E77E0807 -1F3F38DE80FA6E15DDD9FECF1F17218A38D3C4B6979369978BA70316A1333C4A -B7D796DE610F18678E392C24738F9C2156DBC36CF1B7F19789FED8D71FDB778F -319CDC99269DA571290ABE66F6C90DB5117703D140CE2939586CD29BE35FC6AB -59E5866F8A7E3A825898A4892F882F15918750C0CBC11E957FC3FF001F3E2468 -1E33D0FC55378CB58D6F5CD10CE34F9B5EBC7D405B79B1949762CC580DCBC1C7 -F747F74638767925CBC8DBFB93CFB7E27A7D739E7D3E8AFD93BE02FC39F8F09A -CE8FE25F1A4BE1FF0018348A9A269F68009644084C8ECAF1959549C6111C30F2 -989C020D4DDCB415AC4ABFF050AF8E4C0E3C496431D0FF0065DBF1FF0090FF00 -CFF2F2CD1F55BCF186ABAFEB9A9B79FAA5FEAD35EDCCCA8115A6955247380000 -3258E3A0FC2BBFF8E9FB137C45F815A1DDF882FA1D3F5CF0DDB6CF3753D36E97 -116F90471AB47204724964E115946EFBDC71CBFC19F0ACFE28D77C37A04C56DC -EA97D15B3B03F73CD94042700F446E71FD2BA697B9797633ABF0D8FD8DF04692 -743F07689A6B2ED367650DB918E576A2AE3F4AF843F6FF0018F8C5A3FF00D812 -3FFD28B8AFD07841D9D3073CE3FF00D55F9F3FB7FAEDF8C1A37FD8123FFD28B8 -AF9BCB1DF1572AB7F0D1F32D1452815F6C8F3400F6A5C7B1EB4631DA8C7B1EB4 -C031EC7AD2EDF634817D88A7631D8FF9FC29A2920C7B11FE7E9463D88FF3F4A3 -1EC47F9FA518F623FCFD298C31EC47F9FA53821E72A4601EBDBAFB5204C83C63 -03FC7DA9E57AFCB8E0FF005F6FF3FC801A5719F9718FD3AFB7F9FE5FA0DFF04F -F5FF008B3BAD0C11FF0013E97FF49EDBDBFCFF002FCF965C13F2E3FA75F6FF00 -3FCBF41BFE09FCBFF16775AE31FF0013E9BFF49EDBDBFCFF002F2B32FE09BD0F -E211FF00C141541F835A29CEEFF89FC6074E3FD1AE381C7B7E95F9F1F0FF00C4 -9E26F0CFC40F137FC239ACDEE8B14D0437B7496BAF8D1D278D47969976741210 -C1805049F998853CE3F523F6ADF042F8DBE06789621E524DA74075389E55E14C -3F3B9181D4C62451EEC3902BF2C66BF83C39E30D1B52B9D334BD42D99C5BCABA -BA4B25BA36731BB24243B2A83236067A7DD3C0AC72F97361EDD8D6B27ED2E741 -07C7BF1C699E31D1EFB54F146B1E21D334ED46D6FE5D1EEB5AB89AD6E0C12C72 -856DECC0FCC839C3608E07CB8AD0D6FF00681D4741F0BD8F873E1FF887C59A06 -9897B737E631A8BDB8B6494AECB48C44F82919F318BE13799092884556F1EFC2 -5F12EB1E19BAF88767A75ADDF86E17F2EE354D334E8B4CD3511A4448CDBA388E -5972CC558884105464B6735C178A7C292785C69A5EEE1BC17D68976A20490188 -312363EF451B81520ED2C38E09AF4ACBA19DEC741FF0BFFE287FD148F177FE0F -6EBFF8BADBD33E28FC63D5AC3ED76FF10BC57E539789037886E4BBBAF9795540 -E589C4AA4000920363EE9C793E3DABA5F05C3A845A9DADD5A2CDE4C53A487CA2 -B93326ED9B518E247018F041CFDDC1048A492173346E3697F11FC4BABA5D5FDD -36B3A96A7E4CB15DEB134D24F3F992410C60CAE3E600CF6EBC9F977104A843B7 -9DB0F08EA9AB58EADA82431CD1E9CA27BC6322A7961DCA80475CEE183F81E01C -0F47D03E2FF87AD2F6176D3EEBC8B7BEB39C4C6DADE69E5B74DA6585CBF53E62 -42CAD9DD94E594000737E20F195B6BDA569696297D2EBB68562B4B886D2181A3 -5065DC886203236B5B00A00DA226C63755A7707AE88E01A3084E0E40E430344A -0AE370DBCE39F51524F34B7533CD2492493C877BCB212CECC792C491C9CF39EF -5EDBFB36F8974BB1F14F85B45D72C2C6C740BCD4662F74FA779C35699A38E24B -1B8919187D9C318CED08DB59F76DDC55953696A4AD59E1A11B7EDDBF367183C6 -0D7AEEB5FB297C49D1BC31AAF885347B0D5342D3AD9EF26D4F4CD5ED6E615851 -58BBE164DE701589C29FBA7D2BC9EE6D65B2B89619C62789DA39064300C0E08C -8CE79EF55AE5639952C8EF437D20B663172FB5B3B8827A6064E7A8C714D36F61 -DD1F40FEC4DA73EB5F18BE1FABA189904736C3FC3E5C0F21C8FF00807F9EDFAC -0838048E7E9F4F6FF3FCBF3C3F60DF8773EB9F1626F100062B2F0EC0E5C6402C -F32C9146B8F42BE69C8E06C1EBC7E87469B54038241E481C67FCFF009F4F0F30 -D6AAF2474525688E03A71FA7D3DBFCFF00200C638FC87D3DBFCFF2029E381FE7 -1EDFE7F92EDC0C9E31D71FFEAAF3927B9B9E47FB417C21D1FE2FF80355D03558 -A0686EEDE489259A2121B7760156641D4327518C74C74CE3F29B52D1AF3C03E3 -D97E19F8DEEEFC1D3E64834BD4C3B4C82D59DA433430E428674C1DBBC0C97057 -772BFA43FB443F8B6F75DF0D5A689A55A6A96926AEB1EA71DCDD98B65B18653B -1879326D8D8AC44B8C9DC00C1C92B5BC79FB3668DF15BE1345A4F89B4F8AE241 -0BC71DE44E92DC5892E0FEE2668C1006D0BF740200C8C702686265152A69D93E -BDBCCF3AAF325250D1F7EC7E7EF867E1AEB13789B4CB5B8D1A5BE86F626B9B5B -64B6798C898754DD144FBC1675E0640E8791835CAF89ACF41BF4D3DF4CB48222 -6DD1678959E6F9822E5CB3A8C316DF9551B57030C73F2FBFE97F01FE3C7ECF3A -F5CCBE02BBB1F1AE953F9C14DD5D982F6DD3CA745676664195590ED219BE6193 -D063C9B5CF136B3E17D52687C5BF0D35517F29BD91CDE69F197692787CB0E1C9 -F9846C15D71C64718CE6BB618FC4518A5521CFE69DAFF23C5588C6E1E0A33A7E -D1F75A7E041E07F08DA78974FBBFB35A4F7B756904D753456A85FCA8E34CF992 -142C523C9009DBC60648DC009344F08C7A5580D7F5F92DECB4C8D659ED63B9CC -B6F7924263325BCDE5FCF1EE56CF20672BC80772EEFC29FF00859B25FC7AC7C3 -EF86B777D285319975858EDEC5C1F95C30DE81C1525597772ACFEBC7AFFC23FD -82BC55E32F1347AFFC5BD460BBB7F396ED3C39A530FB3ACA64CB79AAD1EDDB8C -A944E30CDCAF4ACEBE2B135E36FE1C5EFD5FC88A8F1B8C8AA7CBEC975EAEDE5F -F04E57F64FF839AC7ED2DF11B45F17EAE6583E1B7856F0C9A5C13977FB74AAEC -55115C11E523AE4FCA33923196665FD51B68BCB8429CF07A91CFF2AC3F05784E -CBC21A05869561616DA759DAC6122B6B588471C6BD955540000CF15D101802B2 -A714924B65B1F4385C3470B495386C8E43E2E8C7C2BF188FFA835E7FE886F6FF -003FCBF25B1F31383D07F9FF003FFEAFD6AF8BDFF24B3C5FDB1A3DE7E1FB87E9 -5F92B83B8E01E83FCFF9FF00F57BB825EEB26BFC48318ED8C0FCBFCFF9F6E7FC -7276F85354E028FB2CBF87EEDBDBFCFF002DF01B8F931DBAF4FF003FE7DB9FF1 -DC67FE113D50602FFA34BD3B7EEDBFCFF9E3D07B18AF891F31AC6C554E00E070 -7F0F6F6FF3D810918E9FE71EDFE7F948BF30538038FCA940C63803031C76AF3E -ECF4C8842463A7F9C7B7F9FE40848C74FF0038F6FF003FCA50318E00C0C71DA8 -0318E00C0C71DA8BB0221115C647A74FC3DBFCFF0020274F971C8FC3A7B7F9FE -52818C70060638ED4018C70060638ED45C088274F971C8FC3A7B7F9FE405C7F0 -E391F874F6FF003FCA50318E00C0C71DA9020E3E551F4FF3FE7145C08C2FFB3D -C74EDD3DBFCFF20274F971C8FC3A7B7F9FE4F118E3E50BDF8FC2811018E00EFF -004E9EDED45C0604E9F2E391F874F6FF003FC809D3E5C723F0E9EDFE7F91B704 -0D9DC723B74F6FF3FC80BD3E5C723FA7B7F9FE4C00274F971C8FC3A7B7F9FE40 -4E9F2E391F874F6FF3FC80BD3E5C723FA7B7F9FE405E9F2E391FD3DBFCFF0020 -0FD31F8A5FF23DEA7FF6CBFF004525147C52FF0091EF53FF00B65FFA2928A819 -EF3FF04FE9F51D47F66EF0ADF6A7234D7256EE047DA14790972E900C003A4491 -8C9E4E01249CD7D283A578F7EC85651597ECD5F0DD615DA93685657241FEF496 -F1C8DFAB57B16315F09886E55A6FA5D9CDB0C96359636561C11F8D7E7CFEDA7F -0B9F47F162F89ECE1C4134714376AA1890E14ED73C6002ABB4F23A27AF1FA107 -D2BCEBE2EF82A2F12E95721E14952581A3951C7DF5D8C187E447E5D476E8C162 -1E1EB2974225DCFCA0A2BD2FE267C13D4BC0D23DDD92C9A8E8E493BE34669205 -033FBCC0C01FED74E39C1AF34AFBD84E3522A5164852D1462B418638CD7AEFEC -C5F0CDFE22FC52D34C85574CD2A58EFAE8B2EE0DB5C7971FDD3F79B1D71F2ABE -0E471C7780FE19EB5F10AF921D3ADD92DB24497B32308531C91B80E5B1CED1CF -D39C7E88FECEFF000A2CBE18E846D6D5370DB9795D7E79642E72EDEF8C0C76C0 -02BC9C7E323429B845FBCC4B5763D92DA211411AED5560A01E3A60629FB77704 -000F07232314B8C0031D38E9457C5D8D93B1F037EDEBF0B7FE11EF1C59F8D6CA -D563D375B0B6F74CBB8E2F115B04F1B40789148C724C72135F1ADFF8F3C5BA37 -859BE1E2F88750FF00844639CDDC5A4B4988DC3F5CE0659430236B6402377524 -D7ECA7C56F877A7FC51F01EADE1BD4A436D6F791E05D2A86681C10C8E3D81009 -191919078271F933F177E15EAFE14D7AF7C3BAB42D65ACE9D20649D5730C808C -82AC4728E30738EDEA081F5780ACABD1F64FE2424F9657EE49FB5AE9763A1FED -09E2BB3D32CADF4FB58BECA160B4896348FF00D12166F954003A927A727F2F46 -FD9E3F61AD03E29FC3D9BC63AA788351B0BBD644AB630583811C0519E13248AE -A439DC80851B7017EF12D85F9DF5BF1F78A3C4D64961ADEB9AC5F416CFBFFB3F -51BB91D2260080423121480C70401F78E3835D2F80FF00688F197C25F0C5D69D -E1DD766D22C5A7FB6491DBE9F6F75B9C844663BD0B70A8BC2E7EEF0335DA972B -E566EA49EC73BADF86FC7FF03FE22EAB169573A6BEABA41B8B20BA8DB2E66565 -78242A258FCA923742E03155C860428E8390D0FE26FC44F0CDB6B56765A15FDA -596AD319AFA1D2EC90452398A78485DB11555F2EEE750A9851BC1006D52BEA5E -15FDA1FC69A05ADF69FA478C2C75CB3D6253777565A9A5BEA22594F25DA1B947 -C39CE492A1B3D7A71D3F83FE2BCDA36A136A43E19F866E35B8229E7178FF006A -B0900F2C87F2C453242B205DFB4AA2B64E13E7D82A927D8AB773CB2EBF690F8B -D73A9D9486C350B7B9B6D4D358825B9B18D025EA4F7170B211E4AAE04B7772DB -5BE4FDE608202AAE4683E15F136BDA8AC53476E7706CD9E89135D5DE78C9E015 -1FEF7CD8EE2BD4E2F889666502CFE13691A65C5B3B0513437775E5827714549E -56400139C142324FB82EF1DFED25AF789F46B4D235BD574DD3ACB4E3E6C7A7CA -D04312F5E7EC70C71C6E7AFDE8D8F6A2DD90CE0F56F853796964BE239E0BB369 -684217DC4C7049B84604A4009E61DC7E55E410785C62BD97E0A685E19D63C25E -14B4D6AEAC7477D5FC45A8C32CF7FA35A4C93C70DB58C8B01B999D1A02C5D914 -A71BA6C3151C8F15D6FC5171E2A963BFBABBBABEB96CED7B95F2844A080A2341 -C052B8F9485C0C657D33577B491430C0F2C8E76A4299627B9C0F4E393C71D4FA -45EF2E544BD11E8BA8FC56F1BF8D3C3ABF0C35BD72F5FC2FA7DE7DA4E9372DBA -4B3F2D59163F3197784190A232D819C8008047D71FF04FCF8553EAFE2FBEF1CD -FC11B596981ADED892D9178E8012A318F962241CF79548F6F98BE107C22D63C6 -7ADD878674411DC6A97921325CCE0889300925980E117AE4F271D371AFD6CF85 -3F0EB4FF0085BE04D23C37A7B99E0B18CAFDA1D70F2C8CC5A473D71B98938C9C -0C01C0AE5C7D6587A3EC97C523187EF2A5D6C75CA8A9901428CF615F9EDFF050 -0007C60D1BAE7FB123FC3FD22E3DABF42B18F6C7E95F9EBFF050027FE170E8DF -F6048FFF004A2E2BCACA7FDE51A627E13E6603DA9718EC45201C74A5C7B1EB5F -728F2C31EC7AD18F63405E7A1A705C763FE7F0A63B0631DB1FE7E9463D88FF00 -3F4A31EC47F9FA518F623FCFD299418F623FCFD29C108E76F183FD7DA854C83C -1E07F8FB7F9FE4E29807E5C601FC3AFB7F9FE40015C67E5C707F0EBEDFE7F904 -0E78EDFE3EDFE7F9057AFCB8E0FF005F6FF3FC9A475E074FF1F6FF003FC9A18A -CBD4EDFF003CFB7F9FE5FA0DFF0004FD18F83BACF18FF89F4DFF00A4D6DED5F9 -F057AFCBFE79F6FF003FCBF41FFE09FC31F07B59E31FF13E9BFF0049ADBDABCA -CCBF80CDA87F10FA5AEADA2BCB596DE78D66865428F1B8CAB2918208AFC93F8C -BF0E750F84BF126FB48B5B9DDAAE857716A3A5DF346701C626824605403C9018 -0057EF8E474FD7065DCA47233E95F3D7ED87F0466F8A5E10B5D53468564F10E8 -5E64F1C6B9DF716E46E9225555259CB2A141DCEE1D5ABC5C05654EA72CB66765 -78DE3747C0F75E25D47E39DB4BAF78967D535AF10AF9916ADAA6B405B68DA1C6 -5592327C8E4B9642CA80203226C549CB60F9BEBF7177706D3ED44BC12067B79C -40614B843230694703712CA06E2727673CAE05CD574A4D1756FED81A6A6A11A9 -CDD584EAE72D8DAADB57070A40DC83A85F639F49F07780AE7E325F5BD83EA567 -A9EB7AB409A95EF89A532AE9FE1CD3A289CEC729B6304A00BB4AAC7185895587 -98767D32EE71DEE8E3BC05E1DF0C6ADA0F8A2E352BC9E7D6ADAC669AC6C2DE3F -910A0426699CE005C17558D72772E49503E6C7D17C77A8683A54FA62456F7FA6 -4B279E6CAF2DD5D0485763329E0AB15CAE57040C61948057A7F177C41F0C1F16 -EAB37847C3874CF0FB694DA25BACB727CF9801B45E4E4AE3CD75018A2E074F9B -F88F9B32E33C60FA7A7E9FE7F91B3BB25DD1BD652C9A9DC5B69FA568D6D3DE5C -CAB04712C6EC64760A88BB0B1DC770040181B9B0415F92BBAF881E12D67E1EF8 -4E7B099FC357F1BDF0B5D4E6D16469A7B1B98C3B25B5C1C058FE61291B3218C2 -D863E5F1E71E1DD262D775DD3F4D9EF6DF4C82F2E23B77BDBB6DB0DB2B385324 -87FBAA0927AF00F15ED5F1E7C0D69E0BF0369167E1DF14F85754F09C77A5047A -46A124D7BA8DD88C799773294DAA1548411ABB088385F9896629B686B63C1080 -5CE3001EE4703F4AED7C0DF197C63F0E74DB8B0F0FEB926976924CD7417ECF14 -AD1CC63D8648D9D4B452141B3721538E338AE248C9E9FA7FF5ABAFF881F0BB56 -F8711787A7D464B4BBB4D7B4B8755B2BBB166785E371CAEE2ABF3A90432F6E3D -41A6BB327CCF42D0EE3E1B7C69D3974DD7520F86DE3828B6F63AA592797A25D6 -D8963885D292CD0B920665401382CC33907CC34DD185A788F538E696DE6B6B19 -64B58EE6DA4592DA79012AEF1BFF001280B80C3AEE6EE063023B09F569DECADB -29F2E65B9C65615E3A6460BE08214F5C127815F54FEC8FFB3E7FC2C6F1447752 -422D7C27A0C90CB3288B74770C1815B704919C85CB1CF0319FBC2949AA517263 -576EC8FADFF633F8616DE02F84763AA9B6316B1E208D2F6E9B7EE1E565BC855F -41E5B06E79CBB64F000F7B0981F4ED8E94D8EDD612360DA0003681C0E9D38F40 -3F2A9318ED8FA76E95F3537CF2727D4EF8A515CA0A31DB1415DC391FFD6E94A0 -63B63E9450A3A0CCED4340B0D51EDDEF2D22BA681C3C66550761F51C7FF5AAD9 -B75650BB30B8DB803B7A54D55752D46D747B09EF6F6786CECEDD0CB35C4F208E -38A35196666380AA002493E953ECE3D10B4326F7C1D63A84A649226DDEA188EB -58F71F0F220FFBA7744F4CFF00F58D7CDDF18FFE0A75F0EBE1F6AB73A47852C6 -E7E216A90482279B4D9522D391B7956537243670003B950A1C8C36324799DDFF -00C146FE2F6B3E297D13C3DF08F498B5584C9149A25CEA4F757A248D4B48B88C -2F2029C8DBC6D6CFB6B1C24E5AC11CB2A749BD8FBB6CBC0B670B09087DF9EA5F -18EE0E31D6BA082CA381422A6147419E057E7DE85FF0536F1DE9DA4C775E24F8 -389768EA6759F48D4DE2FDC055677586489998286525F2170C3257B7D2BF017F -6D3F867FB43C8D6BE1ED55F4DD655B9D175B096D78CA73B59137B071C7214923 -23206451F56953D5A348429C7548F760304700638E3B74A50303D31E9483E955 -64BE852E840668C4C36931020B007A123B03B4E0FB1F4A345B9B5CE77E2EED1F -0AFC61D88D1EF3071D3F70F5F92C07CDF771D3FCFF009FFF0057EB3FC5B18F85 -7E2FFF00B03DE73DC7FA3BD7E4C01F30E0F6FF003FE7FF00D5EB60FE1671D6F8 -9001D383D7FC3FCFF9E39DF1E027C25AA6073F6697A7FD736FF3FE78E880E9C1 -EBFE1FE7FCF1CF78E47FC529A9F18FF4797FF45B7F9FF3C7A0F5473ADD1F332E -085200031C7B500631C01818E3B53621F2271FC3F8D380C63803031C76AF38F4 -C00C63803031C76A00C63803031C76A00C63803031C76A00C63803031C76A000 -0C63803031C76A00C63803031C76A00C63803031C76A00C63803031C76A0000C -63803031C76A00C63803031C76A00C63803031C76A00C63803031C76A0000C63 -803031C76A00C63803031C76A00C63803031C76A00C63803031C76A0000C6380 -3031C76A40838F9547D3FCFF009C52818C70060638ED4018C70060638ED400DF -28607001C838F4E9EDED4823231F281CFAFD3DBDBFCF67818C70060638ED4018 -C70060638ED45C0FD2CF8A5FF23DEA7FF6CBFF004525147C52FF0091EF53FF00 -B65FFA2928A433EC0FD993449BC3FF00B3DFC35B1B98F65D41E1AD3239171F75 -96D22523F307FCF4F4D154341B38F4ED16C2D614F2E18208E28D3FBAAA001DBD -00AD0AFCFE4DC9F33EA73053648D6452ACBB811839A7518F6A903CCBC5DF0B13 -50669AD954391CAAAE4E38E3A7B1AF01F18FECE3E1F96594CDA02DB4EC0AF996 -61E0DA4E0FDD5C29EFD41AFB2F1ED504D6105C1CC91827D79F6FF0AEEA58AAB4 -7E16438F63F3DA7FD93ECCDD878B52D461841E6368559877FBD818FC8FF8769E -0EFD963C38B73193A6DCDF4E01064BC91881EBF2A803B771DABED01A2D9039F2 -573F53C54F0D8C16E418E30A7D7A915D6F31AED593172B3CDFC07F08ED7C3B6F -0AADAC36B1444810450844504B7200000EA3A62BD3638C42A1546D03B7A53B3E -C3F2A4FC2BCE94A5377916925B052D252D08046048E2BC57F683FD9DF43F8E3A -434B6F25BD8F89ACE222DB51450E70012229147DE42CDD7AAE72B8E41F65BA57 -7819632433020107041AE7B43D12EACAFE2768BC98D636598AE0F9AC4000F5F4 -1FFEAED70AB2A5514A1A31EFA1F917F12FE12EAFE1ED48E9FE21D26E741D6107 -CB24F183B978E411F2C8A338C83804100FA798DF69D77A4BB0BCB76445E3CD5F -9A2C7F7B38E01EB838C631F4FDB0F8ABF077C37F15B437D3B5DB033ED24DBDCC -5FEBAD58FF001464F0BD0123EEB606E071C7C5FF00163F620F13F871E4B8F0A2 -B7896C1E5706CE44097091755C9FBB271DC63A0F979E3E9E8E3A96234ABEEC89 -BCA2CFCFBBDF05E8DA848F349A7432349D591D9413EA429039F5C7FF005B4A0D -2D2DAD9218EEB518634E91C77F3851F41BBFCFF2F50F16FC2A3A2EA125A6ABA4 -DF683A84793E46C36ED9FF00719707EB8AC47F000644F26F99083F319620FF00 -FA085C57A1ECDBD612B9B2AB1388BED213504D9753DF5CA2E0AA4D7F70EA0818 -0705FD38CFA7E94AD7C1FA269D379F0D8C713C5F30918B3043D8FCC4F3C7F9ED -E889E024119135E485BB797188F1DBBEECFF009FC37BC1FF0009E4D72FFEC7A4 -E8F7DAFDFC981E5F946E8E3A0F902ED1CF7C0A3D9CFEDBB226555743CF6C34AB -BD5DD56D6DC9858E0CCE36C407AEEC0DD8F45E73C1C76F56F85FF05B5BF186A2 -9A7787748B9D6F547525E5863C055F52C70B0A1E9924648193D31F4A7C2BFD84 -7C4DAEDC43378C25FF00846B4D06302D6DCA4970C80608182563ED827763272B -C62BED3F863F087C35F093C3E34FF0F69CB6E085335C4A774F70C06034AF8E4F -2DC70064E028381C55B1D470CAD49F34884A751F91C7FECF9FB3DE81F03B4956 -2F0DF78AAEA2DB79A836010085FDCC233958C1452718DC4027B05F674007418F -A7E1ED5C75FE817B71A84D2228DEF26F4B90C0346BC1DA075ED8FC7DB8ECA303 -B0C75ED5F2952ACEB49CA674D1B3D12B0A07E18FD2BF3DBF6FF1FF00178746E3 -A6891FFE945C57E85E302BF3D7F6FF0004FC60D1B11918D123E403FF003F1715 -EAE54D2C4AB9389D207CCB8F6239A31EC7AD0548CFCA463DBFCFA518009C8230 -71CF6AFB7BAEE7983B1EC7A7F9ED463D88FF003F4A36E3B118F51D3F4A318EC4 -7E1FFD6AAE65DCA0C7B11FE7E9463D88FF003F4A36E3B118F51D3AFB7B53827C -A4ED2303A9EDD7DBFCFF0022EBB80A1368395EDF975F6FF3FC959700FCB8E3FC -7DBFCFF20AE73853C0F4E9D7DBFCFF002423AFCBFE79F6FF003FC84D77188475 -E074FF001F6FF3FC976E49E074FF001F6FF3FC86523395C71E9F5F6FF3FCA408 -060EC00FBFF9FF003CFA714E497518153E5E3007E98E7FCFF91C7E817FC13F86 -DF83DAD8DB8FF89FCDFF00A4F6E3D3DBFCF6FCFE6560BC2E0F5F4C7F9FF3D38F -BFFF00E09F2C5BE0E6B5918C6BD30C7A7FA3DBFF009FF3C793983BD066B47F88 -7D3B4628A2BE4CF54F917F6ADFD933FE121FB7F8D7C15699D619DA7D4748B74C -9BDCF2D2C43FE7A756641F7F923E6C87F85EEE1F127832C7C49A2E8F2CBA3C1A -9958759D1645317DA5E272C11B70FDD32B312571D4E0E3391FB418C8C11C7BFF -00FAABC63E33FECADE0FF8C0ED7D2472685AE6C6CDFE9D120F38939CCCA57F79 -8E7B86E48DD8E9EEE171DC8B92AEDDCE19D2BBBC4FC899D8DBC9E54F13DB4E49 -0B14CBB59BFDDFEF7D4647BD7A8FC3EF04E90FF0BFE20F8CBC49666E2D6C608B -49D194C8F1EFD4A77043A9523718A28E47287208619C1031EB9F14FF00634F1C -783C5D49FD889E2ED1227DEB75671891F9240CDBF3203C027686032393824782 -5E7876E6DED64D1A3D5B56B3D33ED42E5F4A3765ADBCF00A7986270C03ED2577 -0C1C71C76F66338545784AE73BF777D0E408E7B1E3FBB8FF003FE7F0F6BD1E17 -F197EC99E244917CCB8F046BF6D7D14ADC98EDAF8185E31E80CB1A37D6BCB27F -085C2BFEE6F91540FF009696C58E79CF2180EDE9FF00D6D4874BD52DB48BFD32 -0D7752B5D3351319BFB5B19C4115D089B746245C1DE15892339DA49E86B47176 -B917B9C8CD3476D1C6669123DFF77790B939E9CE3FCE3F0EE478C3C45AFF00C3 -38BC0F7116CD1ADAFD752B2BEBA88B5CDAB15659A0814F289202AECA4000AE40 -DC4B0E9BE19FECFDE23F883331F0B785AE3549602556FA5C6D8DB693CCF290AB -D338047D2BEBDF853FB0358E99716BA8F8DF526D4888C33E9166BB230FD76BCD -CB3AE0E30A13904E71C56352BD3A7F132A29BD8F9BBE047ECE3AC7C49BCB430D -B7F64786FCFCDD6B179968B8C6E00BE3CD932318EC40C950057E9B781BC1FA07 -813C396FA3F86B4F8B4ED2A125A38A325F258EE2C5892589CF5249E9E9C61EB3 -E08365A643A7E8508D22CA180A45069B043147164B9384C6D19DD9381F8F26BA -9F0DDADC59E95145709B2552770C83C96273C0039EBD07F87CFD5C54EB55E5B5 -923A69C795B4D7CCD4A280314551B0503AE3A7E14A051C01E8281D8A3ACEB363 -E1DD2AF352D4AEA1B1D3ECA07B9B9B99DC2A431229677627A2855249F6AFCADF -DA33F68CF187ED43E31BDB1D0EFF0054D13E085A5F3E98B7D68925BDB6B3328D -C8B34EC804625601577FCB1821D94ED635F497FC14A7C7BE2683C2FE06F863E1 -63716F7FF1035092C27B8B49C4721B74F2D5E1E71C399D3277018420E431C7C8 -EFA678A7E167F69785346D1357B3B38AD62B5D674C9E25BA86E760CABB2188A1 -E559D1F6B1049604E715A529A55A14DC6FCDF81C353154E35961DDEED36ADD2D -DCC4F0EFC2DF86FA5E95693DF5F5CA32C172D2E9961A85BEF85A3379E5A79E62 -759370B7B740CAB8267DDDD6AD786BC7FAD5D5EEAF245A8DF4573AADCDE5C5E8 -82EC410FFA547E54B308CBAC7BC24921DD805386DCBB772C3A8F8AB4CB2B4686 -E7C116F6D2DCD9916F733604855A2748E423CB0B91BA37DE8AA5D901240E070F -6DA6CDA82B2C311718C1C1DA3E9DBFC8FCBE81B4912EF7BA476BA4EA779E3E49 -B48D6FC46DA2E9F1DA4EC23B7996DE3941F2C0B60DF2AEC0A8BB50F0BE528180 -00189E24F84FA568BF67D67C3FE2232788208D6E74ABED2AF635BC13A4B1223E -C55DD09FDE97542C5BF7473B48F93064B77B49BCB642853B139E2A3304733832 -A6FEF96E7209C91C8FAFE745A32561A95B73F413F623FDAF752F155C37C2EF89 -9398BC7566A23D2B579984835C87123861220319658D1487DC7CC5C364B649F4 -CF1BAF8B60F8C5E1D366827D0CDA6A1F6E79448D009B7DAF97E702382712F978 -E701FB74FCE7F8A7E3FD4EFEFBC31F103C3DA0E99E19BDF05C913DADC2CD6C1A -6F2B6344A46C12CEDB11448CC59738204430A7F5A3E0978DACFE2D7C26F09F8D -121B512EB5A6C17538B653B239B601246370CE11F7AF3D306BE7B1F84BB4E2F4 -35B39AB0BF11C49FF0A77C50655657FEC4BBCEFF00BD9FB3BF27DFFCF1DBF293 -6FCD8FF3FE7FCFD3F5A7E2D281F0BBC61C0CFF0063DE7FE93BD7E4BE3E6E9E9D -3FCFF9FE5E9E095A1622B2B3402303B74E3F9573BE3F00784754C0C7FA34BFFA -2DBFCFF9E3A3C7B0EBFE15CE7C4118F076B040C116B2E3EBE5B7F9FF003C77EE -998ECD1F3305C6380303F2A00C63803031C76A003C6540C64500631C01818E3B -579E7A200631C01818E3B500631C01818E3B500631C01818E3B500631C01818E -3B50000631C01818E3B500631C01818E3B500631C01818E3B500631C01818E3B -50000631C01818E3B500631C01818E3B500631C01818E3B500631C01818E3B50 -000631C01818E3B500631C01818E3B500631C01818E3B500631C01818E3B5000 -0631C01818E3B500631C01818E3B500631C01818E3B500631C01818E3B500006 -31C01818E3B500631C01818E3B500631C01818E3B500631C01818E3B5007E967 -C52FF91EF53FFB65FF00A2928A3E297FC8F7A9FF00DB2FFD14945219F6143F16 -4431A20D27E5550A3FD27E9FEC7B54BFF0B83FEA11FF00933FFD8514579FFD9F -86FE4FC5FF00993CA83FE1707FD423FF00267FFB0A3FE1707FD423FF00267FFB -0A28A3FB3F0DFC9F8BFF0030E541FF000B87FEA11FF933FF00D851FF000B87FE -A11FF933FF00D851451F50C37F2FE2FF00CC39507FC2E1FF00A847FE4CFF00F6 -14BFF0B87FEA11FF00933FFD851453FA861FF97F17FE61CA83FE170FFD423FF2 -67FF00B0A3FE170FFD423FF267FF00B0A28A3EA387FE5FC5FF009872A0FF0085 -C3FF00508FFC99FF00EC28FF0085C5FF00508FFC99FF00EC28A28FA8E1FF0097 -F17FE62E541FF0B84672747CFF00DBCFFF00614A3E3128E9A2A83EA2E3FF00B0 -A28A3EA387FE5FC5FF00994959585FF85C83FE80FF00F933FF00D85452FC5D49 -861B4604673CDC03FF00B251451F51C3FF002FE2FF00CC2C8CED43C77A4EAB09 -8AF7C2D697919182B70C8E0FFE43AE78DB7800B973F0CBC385890C4B58DB124F -B930E68A2AE384A31F857E2FFCC9E54C6B59F80372327C33F0E445583129636E -09C0F5F26BAAD33E24D968D6CB6F65E1E82D215E91C12246A07B058C63F0A28A -2584A32DD7E2FF00CC6A293BA3407C6445C11A2F23A7FA57FF00614BFF000B9C -608FEC6EBFF4F5FF00D8514547D470FF00CBF8BFF32D3B6C0BF19957A68BFF00 -935FFD85387C6A03FE60DFF935FF00D851451F51C3FF002FE2FF00CC69B5B0BF -F0BAFF00EA0DFF00935FFD8573FADF8D74BF103ABDE787A299971869260C40E7 -8E53A649FCCD14552C1D08BBA8FE2FFCC89AE7569196751F0F63FE459801FF00 -7D3FF8DD1FDA3E1E0303C330FE3227FF001BA28ABFAB52EDF8BFF333F650EC28 -D4BC3CB9FF008A6213F5913FF8DD386ABE1E1FF32BDB9FF81A7FF1BA28A3EAD4 -BB7E2FFCC3D943B00D53C3C3FE65780FD5D3FF008DD1FDADE1E0723C2F6E3FE0 -69FF00C6E8A28FAB52EDF8BFF30F650EC38EB1E1E3FF0032B5BFE2E9FF00C6E8 -FED8F0F74FF845ADF1FEFA7FF1BA28A3EAB4BB7E2FFCC3D943B0ABACF8794607 -85ADFF00EFB4FF00E3747F6CF87C74F0BDB8FF0081A7FF001BA28A3EAD49F4FC -5FF987B287617FB6BC3C00C785ADC718CEF4FF00E375BFA47C52B5D0E0F26D34 -08E08BAEC8A70833D33811F5C003F014514BEAB4BB7E2FFCCA8C2317748BE3E3 -66001FD8BD3FE9EBFF00B0A3FE176FFD417FF26BFF00B0A28A7F55A3FCBF99AF -3313FE1758FF00A037FE4D7FF6147FC2EB1FF405FF00C9AFFEC28A29FD5A97F2 -8AEC1FE35EF423FB1BF3BA07FF0064ACAD67E20E8DE238041AC784ACB56854E5 -63BD31CAA0F738688F627F3A28AA5429AD909EBB983FF16ED998B7C2AF0CB67A -66CADF818C63FD4D5CD235AF06787EF63BCD2FE1CE87A75DC64159ED2DE189D4 -8E320AC408E38E3D68A2AFD9C7FA6C56474EBF1AF6B6468D81E9F6AE9FF8E538 -7C6D03FE609FF935FF00D8514547B0A7BD862FFC2EE1FF00404FFC9AFF00EC28 -1F1BC0E9A263FEDEBFFB0A28A7EC617BD803FE177FFD417FF26BFF00B0A5FF00 -85E18FF9827FE4D7FF00614514FD943B007FC2F0FF00A82FFE4DFF00F61487E3 -7E47FC8179ED9BAFFEC28A28F650EC07CC1F1D3E0B1F8E9F192CFC6FA86BD2D8 -58DA69E9610E8E96E24D80306671296001273FC1DFBD60E99FB3EEB1E1FD527B -BD2BC6C532DB6037DA5ADCC914233E5C458C80305CE40DA14372AABC60A28853 -8C2A3AB15EF5ADF239BEAD4BDABAF6F79AB5F5D91CCF897F643BDF13416C9378 -E04725B45E44722E9033B4C8F2313898658BC8EC5BB963EB4FD17F63F6D1E2D9 -FF00097F9BC63FE419B7FF006B1A28ADDC9CB737514B6296ADFB1749A95CA4D1 -F8D3ECE5581DBFD97B811E9FEB853BFE18B5724FFC261FF94BFF00EDD45154AA -492B225D38BE85C8BF6449EDF48D534E8FC5766F05FA2C65AE7408A678546EFF -0056CD2164277725483C0E46057BCFECA7A34DFB32FC339BC20F7B278A633A84 -B7905CB836C2089D2302154264E0142D90464B9E3BD14544DF3AB48A5151D8F5 -0F16FC52FF0084A3C2DAC68DFD99F65FED0B39AD3CEFB46FF2FCC8D9376DDA33 -8DD9C6474EA2BE4BFF00865B19CFFC24DFF94FFF00ED9451441FB35688A5052D -C3FE196C7FD0CBFF0094FF00FED959BE20FD9106B9A45D588F15F91E7C6F1EFF -00ECDDDB772919C79A3D7D68A2AFDA4BB8BD9C3B1E67FF000EDC19FF009287D3 -FEA09FFDD140FF00826D818C7C43031C0FF891FF00F745145666803FE09B6063 -1F10C0C703FE247FFDD140FF00826D818C7C43031C0FF891FF00F7451450003F -E09B60631F10C0C703FE247FFDD140FF00826D818C7C43031C0FF891FF00F745 -1450003FE09B60631F10C0C703FE247FFDD140FF00826D818C7C43031C0FF891 -FF00F7451450003FE09B60631F10C0C703FE247FFDD140FF00826D818C7C4303 -1C0FF891FF00F7451450003FE09B60631F10C0C703FE247FFDD140FF00826D81 -8C7C43031C0FF891FF00F7451450003FE09B60631F10C0C703FE247FFDD140FF -00826D818C7C43031C0FF891FF00F745145007AB7C52FF0091EF53FF00B65FFA -2928A28A00FFD9> -%%EOF diff --git a/Docs/InstallGuide/SOURCE/prefligh.tex b/Docs/InstallGuide/SOURCE/prefligh.tex deleted file mode 100644 index edb32ce2f..000000000 --- a/Docs/InstallGuide/SOURCE/prefligh.tex +++ /dev/null @@ -1,126 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Chapter file -%% -%% Written by Michael Basler, started September 1998. -%% -%% Copyright (C) 1999 Michael Basler (pmb@knUUt.de) -%% -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Preflight: Installing \FlightGear \label{prefligh}} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\markboth{\thechapter.\hspace*{1mm} -PREFLIGHT}{\thesection\hspace*{1mm} INSTALLING THE BINARIES} - -\section{Installing the Binaries on a Windows system}\index{binaries!installation} -You can skip this Section and go to the installation of scenery in case you built -\FlightGear along the lines describes during the previous Chapter. If you did not and -you're jumping in here your first step consists in installing the binaries. At present, -there are only pre-compiled \Index{binaries} available for \Index{Windows 98/NT} while in -principle it might be possible to create (statically linked) binaries for \Index{Linux} -as well. - -The following supposes you are on a Windows 98 or Windows NT\index{Windows 98/NT} system. -Installing the binaries is quite simple. Go to - - \web{ftp://ftp.flightgear.org/pub/fgfs/Win32/} - - \noindent -get the latest binaries from that subdirectory named - -\texttt{fgfs-win32-bin-X.XX.exe} - - \noindent -and unpack them via double clicking. This will create a directory \texttt{FlightGear} -with several subdirectories. You are done. - -\section{Installing \Index{Support files}} - -Independent on your operating system and independent on if you built the binaries -yourself or installed the precompiled ones as described above you will need -\Index{scenery}, \Index{texture}, \Index{sound}, and some more support files. A basic -package of all these is contained in the binaries directory mentioned above as - - \texttt{fgfs-base-X.XX}. - - \noindent - Preferably, you may want to download the \texttt{.tar.gz} version -if you are working under \Index{Linux}/\Index{UNIX} and the \texttt{.exe} version if you -are under \Index{Windows 98/NT}. Make sure you get the \textbf{most recent} version. - -If you're working under \Index{Linux} or \Index{UNIX}, unpack the -previously downloaded file with - - \texttt{tar xvfz fgfs-base-X.XX.tar.gz} - - \noindent -while under \Index{Windows 98/NT} just double click on the file (being situated in the -root of your \FlightGear drive.). - -This already completes installing \FlightGear and should you enable to invoke the -program. - -Some more scenery which, however, is not a substitute for the -package mentioned above but rather is based on it can be found in -the scenery subdirectory under - - \web{http://www.flightgear.org/Downloads/} - - \noindent -These may be older versions which may or may not work with the -most recent binaries. - -In addition, there is a complete set of \Index{USA Scenery files} -available created by Curt Olson\index{Olson, Curt} which can be -downloaded from - -\web{ftp://ftp.kingmont.com/pub/kingmont/} - - \noindent -The complete set covers several 100's of MBytes. Thus, Curt -provides the complete set on CD-ROM for those who really would -like to fly over all of the USA. For more detail, check the -remarks in the downloads page above. - -Finally, the binaries directory mentioned contains the complete \FlightGear documentation -as - -\texttt{fgfs-manual-X.XX.exe}. - -It includes a .pdf version of this \textit{Installation and Getting Started} guide -intended for pretty printing using Adobe's Acrobat reader being available from - -\web{http://www.adobe.com/acrobat} - -Moreover, if properly installed the .html version can be accessed via \FlightGear's -\texttt{help} menu entry. - - -%% Revision 0.00 1998/09/08 michael -%% Initial revision for version 0.53. -%% Revision 0.01 1998/09/20 michael -%% several extensions and corrections -%% revision 0.10 1998/10/01 michael -%% final proofreading for release -%% revision 0.11 1998/11/01 michael -%% support files Section completely re-written -%% revision 0.20 1999/06/04 michael -%% some updates and corrections, corrected links diff --git a/Docs/InstallGuide/SOURCE/start.eps b/Docs/InstallGuide/SOURCE/start.eps deleted file mode 100644 index b2aa07334..000000000 --- a/Docs/InstallGuide/SOURCE/start.eps +++ /dev/null @@ -1,1377 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: jpeg2ps V1.5 by Thomas Merz -%%Title: start.jpg -%%CreationDate: Wed Jun 02 03:07:36 1999 -%%BoundingBox: 20 20 398 327 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -%%EndProlog -%%Page: 1 1 -/languagelevel where {pop languagelevel 2 lt}{true} ifelse { - (JPEG file 'start.jpg' needs PostScript Level 2!\n) dup print flush - /Helvetica findfont 20 scalefont setfont 100 100 moveto show showpage stop -} if -save -/RawData currentfile /ASCIIHexDecode filter def -/Data RawData << >> /DCTDecode filter def -20 20 translate -378.00 307.00 scale -/DeviceRGB setcolorspace -{ << /ImageType 1 - /Width 378 - /Height 307 - /ImageMatrix [ 378 0 0 -307 0 307 ] - /DataSource Data - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - >> image - Data closefile - RawData flushfile - showpage - restore -} exec -FFD8FFE000104A46494600010100000100010000FFDB00430003020203020203 -03030304030304050805050404050A070706080C0A0C0C0B0A0B0B0D0E12100D -0E110E0B0B1016101113141515150C0F171816141812141514FFDB0043010304 -0405040509050509140D0B0D1414141414141414141414141414141414141414 -141414141414141414141414141414141414141414141414141414141414FFC0 -0011080133017A03012200021101031101FFC4001F0000010501010101010100 -000000000000000102030405060708090A0BFFC400B510000201030302040305 -0504040000017D01020300041105122131410613516107227114328191A10823 -42B1C11552D1F02433627282090A161718191A25262728292A3435363738393A -434445464748494A535455565758595A636465666768696A737475767778797A -838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7 -B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1 -F2F3F4F5F6F7F8F9FAFFC4001F01000301010101010101010100000000000001 -02030405060708090A0BFFC400B5110002010204040304070504040001027700 -0102031104052131061241510761711322328108144291A1B1C109233352F015 -6272D10A162434E125F11718191A262728292A35363738393A43444546474849 -4A535455565758595A636465666768696A737475767778797A82838485868788 -898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4 -C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9 -FAFFDA000C03010002110311003F00FAF68A2B6F4AD22DEF2CD6493CC2CC48F9 -5801FF00EBAF76317276441894574E3C3D680F3E61FF00818FF0A3FE11FB4C67 -6C83FE075A7B1985D1CC515A3E24BAF0EF84AD12EB58D422D2ED98ED125D4C10 -13E9CF7E47E7597A578CFC0DE21BD167A5788AC6FAE8E488A0BA566232074FC4 -55AC3556AE913CD14ECD8FA2ACEB977A2787EE6C6DEF6F96D66BD631C0934814 -CAC3A85F7F5ABDFD8F10C02F26E3C738FF000ACDD29ADD0EEB63228AD5FECB87 -38DCFC7538FF00EB521D2A3E30ED4BD9C82E8CBA2B44E9B1E701DF8EBC543258 -004619C73EA3FC2A952930BA2A5153FD8B1C9771C8E0EDFF000FCE91AD3E4C07 -7DD8EBC67AD57B098EE434539ED983101DC73FECFF00874F4AAED149196CCB21 -031F7828FE954B0D5189C9226A2AB0673FF2D1BF4FF0AA3A6EB969ABB5D0B2D4 -23BB6B793CB9563652636C743C7D0FE357F53ABD89E78F735E8AA05A63FF002F -120FC13FC2A376BA419170EDC67EEA7F875A3EA757C8AE6469D1590D71724B11 -3B0F6DABC7E9FE79A3ED172BC999C8CF390B81F5E3A7AD1F53AA2E646BD15CB6 -ABE268F4716ED77A8FD9C4F22C282455C962C140E9D72471537F6A5E6571331C -FF00B2BF9F4FF3CD69F50ADE42E789D1D15C72F8B55F537D35751537C8824787 -09BD548C82462AE7F6A5EF045C13EC5579FA714FFB3EB7909548B3A5A2B97935 -7BD66189DA323AA84520FE940D66F39CCCD8CF5DABFE147F67D6F22B991D4515 -C46B3E331A059BDD6A3A8AD9DB8C7EF25551F80C8EA7D299A378E17C4364B75A -76A2B75031203C6AA791DBA7FF00AEABFB3ABF913ED237B753BAA2B92FEDBBE3 -D2E0A9FF0069171EFDBB77F4F7A6FF006EDFFF00CF66FF00BE17FC28FECEAFE4 -3E7475F4571E75FBF20E27C7BEC5FF000E947F6FDFF5F3CE3DD17FC28FECDAFE -41CE8EC28AE3BFE120BFC1FDFB67D3CB5FF0A5FF008482F87FCB766FA22FF851 -FD9B5FC839D1D8515C70F105F80499DB27A655303F4A07882FF1FEB989F745CF -F2EB4BFB3ABF97DE1CE8EC68AE3CEBF7FBB027247FB8BFE14875FBF1FF002F07 -D7945FC7B53FECDAFE41CE8EC68AE38EBF7E09FDF9FA796B9A5FEDFBFCE3ED07 -FEF85FF0A3FB36BF9073A3B0A2B8EFF8482FC7FCB738F745E3F4FCFD29078835 -023FD791EC635CFD3EBEDE94FF00B36BF9073A3B2A2B8C1E21D4327F7F9FFB66 -BFE1F97AFB52FF00C2457F807CE3DB3F228FE9F9FA7BD1FD9B5FC839D1D95145 -15E51615D4F87D3769ABFEF1FE0CF7AE5ABABF0E8074C5E40F9CF735B52F8899 -17D9483F77FF001CA68071D3F24A9B6F63B0F6C64FF2FF0038A632023A8EBEA4 -FF00FAFF00AD75A97726FDCF9B7F6D169934BF02FD9E05B8B81AD218A23C2BB7 -1853938009C75F6AA9E29F85FF0010BE2A6A1A2C5AA785B44F0AD8595CADC9B8 -B5916697E5180BC374E49E07FF005FE83F11F83745F160B2FED8D3E1BEFB1CA2 -E20F319BE4718C30231E9D7F0AD750A0F047D327FCFF0087E35E9C717C94A108 -2D55F7F3395D0E7A92937A3B7E07CEDFB51A2FFC25FF000B371519D65472A477 -5C74FD3F5AD5F8F9F13759F06F8ABC27A069081175966F3A74883C81548CAA03 -C648CF241C7E55EB5E20F05E87E2BBAB0B9D5B4F82FE5D3E5F3ED5A5DC4C3276 -6183D7F9F5A6F89FC11A078C9205D6F4CB5D44404B42D32E5A32782CADD41F70 -45446BD3B414E37E5BFE239529FBCE2ED7B1E55F0F7C4BE2D9FE23DF68FA85B4 -EFE1BFB299ADA4D40462ED5C18C10DB08C8F9CF3B7BAD52F12F8F6EF50F19EAB -A558EBD24FF610A0E9DA7DB2C6F1B86232F2C808FC063A0CF5AF5BD0FE1E7877 -C37A84BA85869D145A8C89E5B5DC8EF24C572095DEE49C7038CF6CD51BDF84DE -12BED567D4E4D1A14BEB820CF2C2CF1898E73F3AA901BF10734D55A5ED399C74 -1FB2A9CB64CF35FD9D3E266B3F116CFC4716B1E4BB697762D6178D36B15CB72F -82467E51C8C735CBF897C7DE2DB5BEF13DE5C5DC96DA7E9D3ECB5BDB68E39A08 -F819F353962411CF4F6E95EEBE1BF00685E09175FD85A5DBE98B74E1A516E36A -B91DF1D077E98EB591A87C21F096A575793CFA242B25E802E7C991E359B1FDF5 -5600F5EE2AD57A51AB2972E8F6D0CDD3A9C8A37D51C6F8E7E2A4FA27C16FF84B -B47960D4AE54421251132A39670B9D84861807A67B60D71763E35F1C1B6F0B5F -59C77570750684EA2B7B14421DAFB7262C61940C9EB935EFC7C21A37F618D186 -996834A000FB1792BE491E853A62B0E0F84BE14B39ED644D1617FB2B892DD247 -778E160720A2312AA476C0A296228422D38F5613A7524D34CDD43B903B21461C -95CF4E2BC03C55F103C53637FE20B89255834FB06DB6D7B62A92C51E38C4C872 -C4F4E84751C706BE89780331C715C76A5F0B3C2DA95D5DCF71A243E6DDAA8B83 -1B3C626C6705C2B00C793D7AD450AB4E0DB9AB9AD584E4928B29F83756FF0084 -BFC0F63771EA0973713DA0DD79044506FC6378561C0EE063AFB578E7ECDB6735 -9EBBE3879B5295961D41E3649028F35BA973C67381D07A9AFA2F4BD1ACB45D3A -2B2D3AD92CAD225DB1C50E155067B7E7D6B06DBE1878634CD625D56D34682DAF -A493CD79A12C9BDF0724A8383D4F51C66BA21888C54E36DF63395293709763C2 -757F8A5AC5DF84356F1268DAE49AB49652379725BDAA416C8A00F95D5C6E6203 -67208CE0574DE28F88FABDA7ECFD65E2DB57823D4A682176C460A02C406183DA -BBF5F83FE108619214D06D56DA421E4B63930B938E7CBCEDCF1D719356E7F02E -82DE1E8F427D3206D1D0055B4E4A000E477F5E6BADD7A32B72C767F818AA7575 -BBE878AFC40F18F8C3E1EF85BC3DE277D5AD6FDAFE58ADE5B336E163F9D19F70 -23E6070A01E7D7000E2BBBF8D1E2FD47C07E05BBD4F4F44176AF146AEE9BD572 -7EF1191D87F8D761ACF83B46F10E9F6761A85845756768E92430BE76A3282148 -1EC09AB5AC68B67ADD84B65A8DAC77D6720C3C3320653F507AD4FB583706E3B1 -A2A53B49296FF99F367C48B8D4DD3C0135E6AD05FF00DB6FA095E3450A51CC91 -31DA07F0F233EE07AD7D0DA7C59B3B7E5586D5FBA31FC23FCFD3DEB1D7E14F85 -23F219745B72D032B425D99FCB2A4152B93F2E081D38E2BA4F2B6AAAE3014600 -C71DA8A9554A2A2BA0E9D29424DCBAD8F9F7C40B7971FB47496B67A8269BE6E9 -A81A7F94BE3683F2EEE3A818C8FEB5D0FC2FF17EB1A9789FC49A16A57316A516 -92EB143790A00581670776303F80741D735DF6AFF0F3C3BAD6A9FDA77BA6432E -A1B428B9CB070B8C6320FA7E752687E0FD17C32930D2F4FB7B3128CC8D193B9F -04E32C793D4E093DC8AD7DB41C6D6E8671A3353E6BF5B9C2F88BC59A8F84BC76 -A75178E1F0D5C4256395BAA4A172413D4642B1E7D7AD5AF855AF6B1E28D26F35 -2D4C28824B8616615369F240E0F5E73C7E550FC4FF0087DAC7C4268B4CDF676D -A4473097CF0A5A6384C15DA78EEDCF18C0EB9AEEECAC534DB386DA25091C6815 -467B63A9AA738F22B6E5454FDA36DE878A7ED19637139F0DB2DD4D1C4F7AB198 -9402A32E9F3723D71D7B8AD8F887E2BD43E17F80F43162F14F733CE96AD75711 -E4282A4EF2140E9F43D057A2EB7E18D2FC47F67FED1B38EE8DBC82588BE7E460 -47231F4A5D6BC3BA76BFA79B2D46CE1BEB4E07952A82BC74E0FF0091570A89A4 -A5D097464E53945D9B3CB2F7C4DAF7837C51A258B6AD0EBD69A9FCEE86151229 -EA0A15C0C71DF38CF34DF11788BC477FF163FE117D32FE3B1B692C45C12D06F7 -4CE37607AF71D79CFB57A0E95E00D0346BA86EAD74B863B8886D8E4726468C63 -0029624818246075CD68FF00C23DA71D67FB60D9C6354F2FCBFB567E7DBE99FE -B5A7B457BD84A84ED66FAFE055D320B9D3F4F8A3D42E92E275243DC15540C7FC -9AB664554DE5902E01CE00E3FCF4FD69757D12C75FB17B3D42DD2EAD5C82D137 -DD6C7233F43F954777A1D95F693FD99340B258B22C662249054741D727A0FAD6 -573AAD25A215A789630E6488211F7B8C549C9E40C83FECFB567DE78634CBED2A -DF4D9ED637B180288A066E102FDDC73DB039FC2AFF0092215DAA0051C753C63B -7FF5BB7E34F4057BEA2F3E9E9D13FCFE1FAD21CE3A0EFF00C1C534153DC76EA4 -F3FF00EBFD68CA919DC3BF563FE7F1FC282C79CE7A7FE39473E9E9D13FCFE1FA -D378CF55EBEA7FCFF852718EAA7A7F1139FF00F5FEB400E39C741DFF00838A53 -9CF4FF00C739A61DBFDE1DFF008CFE79FEBF852F19EABD7D4FF9FF000A005504 -0EFC60F094D318C11DB04729EFFCBF5FC28E31D54F4FE2273FFEBFD683B7FBC3 -BFF19FCF3FD7F0A00475258F0792DFC3EDFE73FA734D2B86539C1CAFF0FF009F -C3F5A93E5DDD57AFA9F4FF003F4A69087038EDD0939FFEB7B77A00F44A28A2BE -08E80AEA3C3B3AA58053FDE35CBD7353FC49B1D0FC4777A55ECBF6331AA98E59 -14B2484A838C8E17EAD8EBE95954AB1A2AF276B9A422E6EC8F6359831E327E94 -F2D90739E87F887F9FF0AE22C3C576EEA844B1BAB8CAB29DC187A823A8E2BA1B -4D5A397A30C103D6B48D5BABA60E06B329383F37D32298536E7961F56151C53A -BA860C318F4E0F352AB89073B48CE0FCB5D51AABA98B83E8444150739FFBE87F -9FF0A0939E8DF98A984608E318F651C7F9ED5198B1D00C7B271FFEAAE853B8BD -466EE7F8BFEFA1406C0EFF0098FF003FE14BB5813C7E494986F4E7D97FCFE15A -00D78F71EE3D89155E5B60C38181DF9EB564E76F61C7F738AF8A7C7DFB6FF8AF -C29E33D6B468342D26682C6EDE08E490481982F193F3739F5F4C577E0B015F1F -294282BB5F2393138BA58549D6D99F61B44C879041F7EF519E0723F315F0F3FE -DF7E317007FC23FA40E47693FC6B67C07FB6B78A7C53E30D1346B8D134A863BD -BA8ADE4913CCC8566009196F7AF4A5C398F845C9C55979A3CF8E6D85949462DE -BE47D8CCBB8F4F9BD4530A7186191C7F9FF3D2BE5BF8EBFB597893E16FC4FD5F -C31A7E91A65CDB59884ACB71E6173BE157C1C103ABFE55E93FB37FC61D57E317 -866F752D56CED2CE486E3C955B4DDB48C0E4EE24F5CD70D5CAF15430CB1734B9 -1DBAF73AE9E3E8D4ACE845FBC8F547B7C2F1CFE1D6A164C12A4631DB1FE7FF00 -AF5A063DC723AD7CF1FB4CFED07ADFC1AD7F47B1D2EC2C6F16F2DDE673761CE3 -0DB71F2B0F515CF83C3D5C6D554696B2674622BC30F0756A6C8F7431E79E8781 -D3B7F9FCAA09201D30738EA17BE7F9FB7E35E1BFB3B7ED01AE7C5FD5AE6CB52B -0B2B55840DAD6A1F7138CF392475AEBBE2EFC7BF0EFC26B411DDCBF6BD5248DF -C9B1854B3123A6E3D867AF20D76CF2FC4D2C47D5796F3EC8C238CA33A3EDEF68 -F99DE4B6FB71D41FD3FCFF00F5EA3FB84839AF8F2FBF6E4F13493C86DB42D323 -88FDCF30C8C7EA70476CFE95513F6DDF16EEF9F46D2194E32009413E9CEEAF66 -390E3DABB8AFBD1E7BCE3089E8DFDC7D96555BA707D6A368C8EA38CF61C57857 -C5BF8FDAE7803C0BE09D6ECEC2C659F5C81E49D660C550858DBE500E472E4724 -D677C0CFDA4F5EF8A1E34FEC5D434CD3EDA1F21A7F32DF783C32803049FEF573 -ACB312E8BC425EEABF5EDA1D3FDA14155545BD5F91F401847F0F1DBD38A8D979 -20E4641FF3FF00D6ABCCA081D88AF1AFDA2BE316ABF086CB446D36C6D2E85FB4 -C8ED741881B3CB231823FBC7F4AE2A146789AAA953DD9D95EB428537527B23D5 -0C606E2573B8E339F6FF003F5E950B440ED0DDB196EDEE4E3A7BFA76AF90CFED -9DE2BC0FF8936939C9E76C9FCB75247FB66F8A976E747D27008E02C80E3EBBAB -DC59163BB2FBCF27FB6709DDFDC7D6EF6E472A18FF00B2473FFEBA88F535CF7C -2DF175C78F7C1765AC5E430453CF16F658436D19C120679C66BAE9212CD92377 -5E403E9FCFD7F0C578B34E94DC27BA3D7849548A9C766502A18608A8DD48CE09 -3F41569E0651B872300F3E87FCFF008D78B7C4DFDA5345F04DD5C69DA72FF6AE -A90EE574507CB8DC74563DF9CE71E95D587A357132E4A51BB33AD88A7878F354 -7647AF631F4F4C526DFCC63FCFF9E95F2749FB5FF891DCB2E8DA622F604487F5 -DD57BC37FB55788F59D6ECAC64D2B4E459E5085915F70F4C65B1F9D7AEF27C5C -57334BEF3CE59BE164EC9BFB8FA8F6718DB9F5F97FCFE5F8D30A13C81EBD47F9 -FF00EBFE15E09F187F683D6BE1F78B46956561617301B58A7DD3ABEECB672386 -E9915C40FDAF3C4A0E7FB234B3F5593F1FE2EF534B29C555829C12B3F32AA66B -86A527093775E47D5EC9C0CEEE00E48C7E7E9EFE950BA953D1BF407E98FE95F2 -C47FB5DF890300DA46964641E164CF1D31F376AFA7FC3B7EDADF8734BBF92348 -E4BBB38A5755CED52CAAC40F6C9FAD73E27055F0893AAB73A30D8DA38A6D527B -163A1EFF00F7D0A5E02E3E6FAE471FFEAFD2A2D556E63D3EE5EC823DD223344B -20C86603806BE5D7FDAC7C4B6F7060B8D174C4F2DF6380AFB9707903E6EA28C3 -60EB62D37496C189C6D2C2B4AAF53EA6627D1B3CF7149939FE2FFBE8564F8535 -F87C57E1BD3B5584C7B6EADD2460ABC2B100B0E79C0271F5AD7DA43723F25C1A -E4945C5B8BDD1DB1929454A3B099C8FE2C7D47F9FF000A5E7FDACFA6457CB379 -FB58F88AD6EAE205D274A658E46457C499201201FBD50A7ED6DE230D93A4698C -BD4A80E38F4FBD5ECAC9F16D5D25F79E33CE30AB76FEE3EADC753CE3FDE14C24 -E075C71D481FE7FA57877817F6A1D2F5DBA16BAF5B268F2BFDC9230D246CDD3E -A2BDC13E745653953B4E42F5F43FE1FAD79B5F0D570D2E5AB1B1E8D0C4D2C4C7 -9A9CAE7A1D14515F9C9E90578BFC4CB7B3D47C4FAAC3B9E0956DD44873B7CD72 -ABB154F6E33CFB62BDA2BE79F8ACCF0FC44D49D4C9BB644542608FF56BD41FE5 -5E3E69FC0F9FF99D985FE215F4ABAD4744B58C58EAB34A42E24B5DE64F2F9E19 -D41391FCABB3F0DFC57BB8DE18B51B79A2D87CB79949218FA98FAAE73D338AF3 -1BBBCBAB885E18F7ED6E0C92310547B53E5D7E7BC4D41E670646746F24005635 -0C3241EC48C824F4E315E0D0C44E97C323BE708C8FA5FC3DF10AD7548CB47306 -C10085906467D7D3BF3D2BB3B2D7E1BA452AE3078C86C8FF003EDDABE43D2CDD -DA38BAB49239668223399606398D09071DB2403CE7B835D77843E291B1BF64D4 -A77166D1FEEA48802E1C907041EA300FBF0057B547318B76A9A1C72A3A69A9F5 -1C770B210060E707839A9D5860771EB9CD79BE8DE2F59AD52E033340CFE58950 -0D9B873807E87F0AEBAC75B8E741F331E87A76FF001AF661553578B395C3A336 -76A13818FCCFF9FF000A634631C6DFD7FC9FEB4473EECFCE7D454BBFA75CFB9C -7E7FE78AEC8D5EE62E36D8AECA319C823D98FF003FEBF857CB1E2FF8F9F05F46 -F14EA967A978474DBAD42DEE1D2799B4C56DEFFC449F2CE79AFAB998F6DDD79E -6BF267E378C7C5CF158CFF00CBFC9DFDEBECF877074F1D5671AADE8BA3B753E7 -F36C4CF0B4E32825ABEA8FA8BFE1A4FE05FF00D093A4FF00E0A53FF8D56A7857 -E3FF00C1AD63C53A3DA695E0ED3E0D4AE2EE38A09A2D396331B93F2B03E58C10 -71CD71DF013F64BF0B7C4BF86F65AF6A7777897533B0611B855030A7F4DD5EAD -E1BFD8A7C1FE17F10D86AD6B73A81B9B29D278C348305948233FA57A1899E514 -5CE9734F995D6EF739A82C7D4519F2C2CEDD0F96BF6CD007ED0DE210381E55A7 -1FF6EF1D7BC7EC1D1F9BF0FF00551C7FC7E93827AF02BC17F6CA4D9FB4478948 -00031DA1CE49CFFA3463FA57BA7EC27AC5869DE05D5A3B9BA8A173787E52DC8E -179FD457A98F4E590D249748FE470612DFDAB52FDDFE67D42D19503B7D0E457C -47FB7DAFFC569E15182B8B093F1FDE0AFB61BC49A449D2FE1E7803233D6BE2CF -F8280856F19784A4475747B097001CF1E60FD39FD0D7CD70EC1C33185D747F91 -ECE716783959F6FCCE63F656F14A782ADBC4FAE4AA1A2B1B6695C13804631FD6 -BC53C5FE28BCF17F88B50D56FAE269DEE6679479AFB8A827207E03038F4AF6CF -D957C28BE38B7F14682C5025FDABC27792072BEA3A5787F8A7439FC35E24D534 -9B98FCA9ECAE1E0643DB06BF45C3FB2FAF56FE7D3EE3E46BBA9F54A56F875FBC -FB33E087ECBDE1ED0FC256FAF7892CADF5BBCBAB7333437506E8E24E5861589C -9DB8E71919ACA1F1DBE05A2228F0CD90C00B81A42E06076C2D75BF007F683F0E -78D3C1767E1FD4AF63D2F5AB7B6681A191422C8A3E5531F63F295EDD41AF34F1 -87ECC3F0BFC0DA549A86ABE37D4A38D71B61458B7BF3D0640AF90A6DD4C4D486 -64E7CD7F76D7FD0FA39250A10960946D6D6E33F6CCBED3F53F05FC3ABCD2E258 -74D9D6E24B78D5360542B16063B715E43FB3EF8FB4BF86FE3F3AB6B05D6CFEC8 -F166352C7716523800FF0076BD3FF6AE8AD23F85BF0A469EF349626DE6F25AE0 -01214D9163701C66BC9FE04FC35B2F8AFE381A16A17773670FD99A612DB6DDFB -83281F78118F9ABE8702A92CADAAB7E4F7AFDEDCCCF1B14EA7D7D3A76E6D2DDB -63EA33FB5FF80D9B896EB9E9FE8EFF00FC4D4FE3AF8BBF0E2F7C3BA0EAFE22D3 -2DF56B3BCF34D9FDB2C44DB08D9BB00A923EF2E78AC3FF008612F0C800FF00C2 -47ABF63CAC5FFC4D703FB587C3FB6F871E0EF01E91697325C4101BA8D6499143 -B6161EB8C0EDF8D7814296595F114E9E1652BB7E6BA1ECD5AD8EA54273C44636 -5FE67A3780759F83BF1235CFECCD23C27A41B9F2CCA564D2A35014607741DC8A -F486F839E065C7FC51DA176391A7C5F97DDAF8F3F65DF12699E18F89F1CFAA4F -F6649AD9E1491C8D8092A79FFBE6BEECB6D66C2F65F260BA8A56233B55B9AC33 -5A557075F9294A5CB6EECDF2EAB4F154B9AA455EFD8A7A668565A259A5AE9B6B -058DA20C2416E811147B01C54E532E430C01EE7D2AF941CE38F4A89E2E706BE7 -9B727767BA92B591E4BFB44F8C6E7C13F0D2F6EAC24315EDC32431BAB10572C3 -278E7A673D339AF87346D3AE3C53E25B1D3C4A4DDEA3749089652589791C0DC4 -F53C9CD7DD1FB47783A7F16FC31BF86D577CD6EC93A47C827047A7D727E95F0C -F87F5593C2FE28D3751D9BA6D3AEE3B8D9C1C947071E9DABF41C8797EA93F67F -1DDFFC03E273952FACC7DA7C1A7FC13EB6FF00854FE03F833E0A5D4B5FD32D75 -6311549AE6F2059496623A29071CF18F6F7ACED23E2E7C29BCD5208ACB45B35B -C9182A3269B86CE78E767B9AE96E3C49E0FF00DA1FC04BA5CBABBE9CF332C934 -0A55678D9304F072319239EF5E6377F09BE1DF807C45A53A78A351BDD41E6578 -2DA311316EDCF038CF53F87BD79B46D514E38A73F69AF7B1E8546E9B8BC328F2 -69DAE7A07C4DF891E02F0C78A3EC9E21D0E0BED4440922CB25AAC8429CEDE4A9 -ED91F435C8AFC69F8508ECFF00F08D5B6E3C13F605FF00E27F2FC7D6BCF7F6A7 -5DBF14FE524A9D3E020B0C1E771A77C12F84BE1EF1FD8DCCBABDF5C5BCA832AB -1BE38CE3D3FCE2BD1860F0F4F091AF5252B34B6670CF15889E2A5469A8DFCD1D -F2FC65F84C1947FC22F687AF5D3D79C9E73F2F43DC77AF7CD0AF6DEFF44D3EE6 -D23F26D66B68E58A31F2EC42A0A8F6C0C0FD2BC57FE1987C0B1BAEED5AECE5B0 -019473DFFA76AF54D5AF2D7C0FF0FA69924DF6DA769E56266EAC1231B7F1C0E9 -5E2633EAF3E58E1DC9B6FA9ECE0DD7A7CD2AF6492E8731E29F8FFE15F09EBB71 -A5DEDC486E2038731A330048040F941F5FC2BE63F8C56D6BAAEB4BE24D16D9D3 -45D41432B188A01203861D067B73EFF4AE3752BF7F116BB35D5DDC1DF773E5E6 -900E0138C9C7A0AFA83E245AF83B58F850744D3B56B137D0C68F6CBE77470CA5 -B9E4F237706BE82142195D4A6E376E5A3EC7853AF3CCA1514DA4A3AA30BF652F -1AB4C350F0EDD4E36C6AB35B2B49838F9B7000FB95FD057D17B769C8DBD7A64F -F2FF0038FC6BF3FF00E1FF0088E6F0B78C34AD461661E5CE85D401F32EE191FF -00D6AFBFB49D520D6F4AB7D42D98C904E9E621E01231FE7FC8AF2F3AC3FB1AFE -D56D2FCCF5B26C47B5A3ECDBD63F91E0773F12BE0FC73C91CDE1FD304CB210D9 -D2D5B90719C8439CF53CF35CC78F7C77F0AF53F0E5D5BE95A04097CD1324325B -5A080AB11C36ED99EBC7E7DABB4BAFD90F42B9B99663ADEA2A1D8BE36467193C -F6EDDEB8FF0088FF00B2FC7E17F0ECFAA693A95C5D8B58DE69A2BA4192AA380B -B4753E86BB6854C039C52AB2BFAB382BD3C6A849BA71B7A23C6BC2BE10D57C5F -A8A5A6996735C13F7E48E32C107A9C57DF7A7DB3DAD8C10C92195D1154B364E7 -819FF3DEBE2BF847F12F55F03F882D2182667B09E458A4B7DAA7EF30E46475FF -003DABEDE1968D5B691B80E7A7F9FE95967B3AAEA46324B975B1D191C69F24A5 -17AE973D028A28AFC6CFB00AF9D3E30BC6DE3FD491DB6B2C5195C1F58D7FC2BE -8BAF9C7E335B01E3DD4242B905627FBDF7B11A8C7F9F415E2E6CED874FCFF467 -6E155E6FD0E46DD8471471394DAB8DAA7AE7B66AC09ADB51B883ED865122463E -5B52074071F781E9D6A9DB4CB2CAD32DBB492BAE0A30DC07BF229D6B31923818 -16924704B67F87AE41EA7A0FC6BE53B58F52CED727BFD36D5CC135B5C09D5402 -E002B220E31C8C6727DA9F69E22B1D5AFE282F64F3E253E4B8D9E5C836FCB9E8 -79F538E78C5451C9F679B66E11A390C4A9C1FC49EB4AF2C101BB996DAD9A6963 -314726154C45B077AF190C3079ED9ADA33BBD49B7635BC35AD6ABA7A9D474E95 -7CF92552960A018F701950C7B9F4EC38CD7A1786FE2D4897BF67D5921B4BF620 -B88D898D72795C01C104FAD792E9EB796417C8B9482C62388EC4108C8303E6DF -D18FBF19C77A768F0B5A3324A5EF92E2E0CD2DD798AEEC492429CF0546473ED5 -D74AB4A9EB4E46528297C48FAD348F17C33C2B289E29632C7124672037420F1C -1E3BFE15D5D96B714AAAFBD4E30548C904E3FCFF005AF91BC31A9DFDA26A1736 -1A9DBF98646CD92056B7E320720E41F6238CF5AEFF004CF8BF0CF79345796975 -A6DC249F2988F990118E84F1B7EBCE6BD9A198425EECB4672D4A0D6A7D1B0DCA -48995E540C715F04FC4AFD8EBE24F89FE206BFAB69F63A7B595E5DBCB116BC55 -6209CE48EC6BEACD0FC796D756D1CD15EA4AB201F2F99B590F4C107A9EF91DBF -5F956EBE24F8BAD358F14E950F893542358BD9E0B5985DCA45A2C723731FCDF2 -F5FE1ED5FA0F0FE2EBD294E5859453B2BDD3DBCB547CDE69429548C5564EDE47 -D5DFB3BF80B54F875F0C2C343D65228B5085CB32C4C1C72AA073EBC57A594E9C -00319FB9DBFC2BE4ED37C73ABE9F07C0FD5AFB5CD453496B491B57BC92EA5303 -332E10DC313839271F31EB5D0A78EAEF5CD73E2FDF693AD5CDD68F6FE1D9E4B3 -B8B7B9768639824A4346D9C2B0C755C741535F0F56AD59559B5ADDB6B6DEC5D3 -AB4E10508ADACBF0B9E73FB46FECB3E3FF00895F1875CF116896767269772B02 -C2D3DDAC6DF2411AB654F4F994FE55E667F620F8A431BB4FD3867A66FD47F4AF -AD7F67EF895A1789BE16F86B49D47C5B05D788E781925865D47378CFB8E472DB -F38FD3EB58FF000C3C292DCFC5BF1659CFAFEB77167A5ADBBDAC52EAB70E0166 -933952E739D8BD7AF3EF5F45433AC6E169BC3B714A9AB2BC5EA969DCF26A65D8 -6AF255756E5E7B5F5EC7CD163FB12FC508EEEDE57B1D3B6248AE48BF53C023DA -BD8BF68FFD9C3C67F12C7834E896F6D3C9A669A6DAECCB32C7F3E41E3D7A7D3D -2BB0F845F13B54D17C1AB35E69BE21F174D71A8CD06FB3DD74F0A876C162CDC0 -C60673DB15C578966F19F8EBE3AF8E749D0A7D56211D9DA49040DACCF649625A -DE025846A1813927238FBC726B4799E36AE21549B8AE44DA76D35B2D75F32560 -B0D0A2E114DF35B4BFCFB1A5FB2C7ECF9E30F855E20BABBF10DB5AC704AA4298 -2E16424EDE38AF40F8DBFB34F87FE30C62E27925D3B55815845770100649CFEF -1483B8671DC1F7AE774FF1A49F0EFE355A691E2EF19816D16856E259350BCF2E -0966C49B9F6336016217DCF1563F686F8A17577A4F87741F05CB77AA5E6BAC65 -371A05C03325BA95CB46E33CB02C0374E2BCDA988C656C64710A56935BAD17E2 -7742961A9E19D171BA5D1EE7CE7AFF00EC3DE39B2BB923D324B3D4A00E42C924 -A22E07AE735068DFB1278FAE3508935236361687EF4F1DC2CA40F4038FE75F48 -FC13D66FBC5DE08D5FC1DE2AB8D52C7C4BA197F3FED17AF1DF3C6FBA48D98A90 -DC2C918EA7A0AF32F0A8D567FD9C7C6FE2893C47AF4DAAD9DD5C5BC33CBAA4EC -6350F1E3196C03F31E7AF26BD98E738F4A5094E3A34AFCBDF67B9E63CBB09A4D -45EA9BB5FB6EB637BE3EFECF5E25F18F823C05A0F8796DEEA5D0E1962B996E26 -1106CAC6148CFA953F9560FECE7FB37F8CFE197C413AB6BD15A4362D6ED1010D -C8932DB81E83D307F5AEC7E1ED9F8AA5F87F2EBCBA7EA4D7F1E8B2CFA7DCC9AF -5C5D9B998C4C54985900C96031C9EB815CAC7AFDBB7C2DFB5DC78FB58B5F1E17 -6926B23A8C82E16412B7C9F67CF0300606DC018E39AE38E3314A84B06A49C6F6 -DB5BBD5ECF43A9E1E83AAB10D3BDAFBF6D3B1F5198581C8F9B1B72075CE2BCC7 -E387C15B0F8C7E1E86D6E2E1ECEFEC8BBDA5C20C84240C861DC12A063AD79D7C -53D43C59A8FC42F871A5DADD5E41797BA4B4D71603509ACE29251B89DFB41231 -8FEEF6C71580DE25D7AE3E086B707FC243A8A6AF0F88E2B179FED32992D81902 -F96B2EEDCCA391B8E3238C579B85C3D5A52856A53B3BFDDAD8EDAF5A1514A9D4 -8DD7F4CF38D4BF630F8836B7CD1D9C5657B0038131B858F3F864FF00906BB0F8 -23FB3378E3C0DF1234BD6758B4B48AC2DD9C48D15D2BBE0AF0547F9FA56078AB -E27F8B2F3C3FE1F8A5D5B52B2BBD2C05D466B7BA75692433108A7079CC4CA79C -F4E7AD7D3FFB445EDDE8FF0006FC517767733D9DD24516C9ADA5313A9F3907DE -04633C838EA09F5AF7F159A63928D0A8E2F9F4DBE5DCF270F81C25DD6826B975 -DFFE01D9BDBB2F201C73D01C544C08C82391DBBD782F87ADFC456DF0C75DD62F -60D46C658FC39712C37D278827B93239818F99B0A80AD9C1073C7415D4F80BE2 -2691AD7C2E82CCF89EDAE75F3A74CED10BC56B9560AED920B6411C77E3D6BE7A -787941369DECEC7B71AEA4D26ADA5CF4E788489D32BFC59F4FFF00566BC23E2B -7ECA9A378DAFAE354D2AE5F49D5652EF30003C3237A95E3073EE3AD73F67E22D -72FECBC151EABAC6A763E1A9EDCCBA8EA82E5D00700ED4966CFCA09C7F1727EB -4CB6F8937FA60F1C685657779A8594FA5DEDCE9DAA36AE6E443E546EDFBB7D80 -F2197F8891B47535E8E1E188C24F9E8CECFF00E0F538EB54A3888A8D58DD7FC0 -3CCF51FD90BC7B6F3116C963771F40C2E5509FCEB7FE1CFECA3E2AB1F11DA5E6 -B52416115ACA24D91B894BF1C6083C735BDE29F881E307F865E1096686E34B49 -2EA10355B7D59DA6B8C93F2BA845E31FED76AEF3E2368257E29F83B4F4D5355B -7B4D4A47173143A84C88C0472370A180EA074EB8AF66799E364BD9CE495EFAA5 -7DBE67990C0E113E78C5E96EBDFE4703F1FBE02F8AFC77E3D6D5344B4B79AC45 -A4516E96E163395C83C1E7A9AF353FB297C44C0FF897D9AF38C9BB418AFB2BC4 -BA54BA7781354B5B0BFB8B6962B29047792334B2C642603E725988C6735F3EE9 -3E30D4F4AD6345B63A9DDEB778D36D9A4D2B5A7B877CF1996D997E551EC78FCE -B1C26698B54B960D5A3A6DAFE66B89C061BDA734D3BBD77FF8079CC3FB2C7C43 -8668E4363689B1D5B78BA438E783835ED7F15FE1F78B3C47F0C7C39E1CD1EDE0 -7920B7892F775C6CC144450013C104E6BCEDB5EF115FFC34B65B3F10EA42F1FC -43342B73F6C777F2D622C1720E402474FF001A99BE216B9E23F1AF819E1D4AFE -D2C22BBD3ECEF2249DD56E252544E2439E704639CF0D5D153138AAD28D4A8E3E -EDDEDFF04C69D1C3528CA9C13F7ADD4E3BFE196BC7DBB06C2CFF00F02D3348DF -B2DF8FD48CD85A1CE39FB5AF7E95E99E38F166A3A66AFE3FD35F57BDB6BE7B85 -5D3EDFCE915D810B8F257A81D785ADFD6BC5B2787FE33785E3D57597B0D3BFB0 -11EE12E2E7CB85A4264C3364E0B12072793815B7F6A632C9DD6DDBFE099FF67E -11BB59EFDD77B763C487ECBDE3C278B3B4E9D3ED6B5F487C12F0FEBBE11F055B -E8FAEDBDBC335B33846824DE0AE73CF3D79354BE2BFC4683FE11186DFC3375FD -A97BAC33595B49A6CBB9C3630594AF70481D4633591F0975CBEBE9B50F06EBC3 -5786EEDFFD2926D4AE196E5E36206090723073DEB83138DC46328FEF6D64FB6A -7A187C361F0B5FF757BBFBBF23D941E4718E800AC5F1A69573ADF84F57B0B4DA -6EAE6D1E38B7FDDC9E07E19FC6BC3F4BB5D5A1F04F8CB54B3D4B59BED4EC2F96 -DEDD7ED93CA446C22DDF26E20E15DCF4ED9ED535DDEDBDBE87E1E9B41F16EA1A -AF899CC0D259ADFBCC5C90BBC48993B464F39F5F5AE2F62E13D25B33B6589F69 -0778E8D77F91E79A4FECCBE39B5D52D269ECAD0C31CCACF8BA53C2904F1F4AFB -06384AC518FBBB768E0719C76FF3F5AF00F1D4BE24D4BE2FEB1A7E9B71772430 -E94927D9175296D9233B572CA17393C9E303A9E6BD37E0C6AF36B9F0EF4BBBB8 -BE9350B96044B34C7E7272786C924F6FAF5AEAC757AB898C6A5569FA799CB81A -54B0F3953A49FCFC8F6CA28A2BF2E3E8C2BE7CF8BF02FF00C26DA84BF2FDC8B2 -ADC973B17EE8CFA66BE83AF05F8B96F6F3F8BAF7ED2DB1888844E80EE5F957BE -0F7AF0F37FF775EBFA33B709F1BB76383511B5925C42EE92B36C0DE511C7D0F4 -FCAAAC81206091A4914EB8004840257EBF9FD2BA2962FB52C0A2568DE263B9F0 -7748071CFE9550CAF2F93000C6D073BCE3763DABE439B53D86BAD8C7B83710A1 -49622E029DBB006C679C9391FE7E94F87CBFB3E1F32A15C6547407F9FD6A6367 -12B07B4C478C88CB67730CF718E474AA924B1C5247FBDDB71192E655E3E6EE3F -CF154A57D086BA967510C2058E6048C604883845E4E38EFD7E951DAA2AC03CC4 -59E3982AC241D862C11E9DC8EC693C9F23644C105BCDF33124EE2DDBF90A58E6 -2F180CE51A33B7108F948E801F4EDF8D6B7DC97A88B7F77A2A5E3E9F0482D1E4 -58D36046921CA924ED6C02323B9CD6B26A69790C0B25D6D948067696354691C6 -4B6141C6718E9D2B3965605942159B71242FA1EB9FF3E98AD8486CB53D2C7957 -66431B6FF22705416C0C63DC6075F5AD39EEACC56EA4F6D78F6AAAF09664043B -42D9CBE0E7B1E3A575FA578AEDA5BEB59FECF16F908DD05C408AABE8436327D7 -38C9F5AF3F7B4D46CE466587CE5DA1F6A37F0F6CF3FCA98278E4DC274100392C -029CE7D0F6E95BD2C44E93BC599CA9A92D51F42E89E24D275354D29A088DB8C2 -2DADD5BA042075E06576FBE4631D2BB1D1AFB4DB781ADADAD2DA188AEC68A085 -5548E98200C11D7DB9AF97F47D5A5D16CC7D8A6586050136ED2460F1C74E7AE3 -35DD7863E205B46904574F3DACAF184CBA920E0F623B74F7AF729E653B5A472B -C3ABDCF76D2FC3FE1EB5B98EE6D343D36D6E23E5258AD234743D32081915BF04 -36F14B24D1C51C72CBF7E4450ACF8E3923AF7AF2ED0BC41395845C461526C805 -518B2F605BAE720678F51EF5D4E99E20E103603B01C73F98FE99FC6BD5A78B55 -BAEA734A8F2EC8EB2D6D2DEC10A5B411DBA31DC561554049EE40A6C5A6DB4177 -35CC56F1C773363CC995543BE00032D8C9E140E7D07A0AA56DA9452A86CAE7AF -15796E958741D48DD8CD76AAAD79983819DA9F84B45D66E05C5FE91657B381B7 -CDB982376C0ED920F1C9FA76A9A2D0EC6D5ADCC361042605D90948D14C6BFDD5 -E38FA0E2B455C10791FF007CD2940DC02A7FE035D31AB756B9938DBA1422D3AD -22BA9AE63B58A3B8940124C8AAACFC003240C9E140E7D07A542344D356C66B31 -A7DBAD9CA4992DC468237CF52CB8C1E833F4AD231601E08FF80D47B58741FF00 -8E7F9FF3D6B752F3056205B2892348A38C471A00AA8A146D1E8076FA564CBE13 -D21EF4DC8D2EC8DC7FCF536E9BC8EBF7BAFF008FE15BB83E83FEF8A19724E47F -E394D36B54CA693DCC39F4BB77BC8AEA4B689EEA1188E778C17407A856EA3DC0 -AAE743D3DE1789AC2DFCB793CD74F254067CEEDC463AE79CFAF35D0BC5C6154F -6E8B8AAB2DAB0C0DA7F007150F996CC9E5EC61CBE1BD2A40E4E9B68DB9C48C1A -052198630C78E48C0FCAA4BDD3ADEFE1786EADE39E17003A4A819587B83DBF95 -683C26390824E47041A6375C639F43494E5DC9D0CD934E89ACDEDCC4AF6EC863 -30320DA57FBA57A631DAB36DFC31A3D84A64B7D26C6DDF0537C56C8A71E9903B -FEB5D098B77D7DFA544F10607238F5AD63519564CC59341D3A5B0FB13595B1B4 -E3F70D12F963FE03D074FC2AB1F0D699126C4D32D635DAC9B56DD00DADC30031 -DC751DFAD6F49060823DB8A84A955E40C63FAD6B1A8FA3138A7BA316E746B59E -28E27B485E08C8291BC4A514F623D3DBF1A496D209678E69608DE68B3E5C8C80 -B2673F74F51D4F4AD968D5D8F6249A85E01BBA71803FCFF4FD6B6557B92E3D8C -E68D5C104020F07359B1E81A6DACED345A75B452B6732C70A86E7DC0CD6D4906 -39071C6723A6338A88823822B68CBB0BFC48C55F0EE9D144238AC6DA28D5FCC0 -8B0A801B18240C75C719ED518D134E86443F60B7571279CA7C95C87FEF0E3AFB -FB56E98D5BB60E7351188818201AB5276B05A2FA18B71A3D85DCE2696CA09640 -72AEE88C47A1048E3FAD457BA0E9FAA4A25BCD3EDAE64DA23124F0ABE17B8E47 -03D7D2B65A203EEF5F435132ED078E4E0F4CF34D49A138AEA8C48FC3D656CB0F -93650A080FEE82C2AA632719C0EC78ED4A2C2DD2E8DC882213E36F9A106EC7A6 -7AE2B54C0B2AF55EE32171DFA7E633F5A1E02FDB3C93C9E7FCFAFE95A29F7172 -AE864C3616D6FE67950471798773F96A1771F538EFEF55E3D0F4FB7B96B882C6 -D619DB96952050C7EA40E6B5FECEA40E300E318F7E3FFD5FAD46D0B28247200C -9C7A66AD4F4B034BAA287F67C1E719CDBC7E715DA65280B11E84F5C510DB4365 -02C504490440E4246A140F5381D3EBDAAE1041E45256B72B43ADA28A2BE1CE80 -AF07F8A4EFFF0009D5E85FE148C939FBBF22F6AF78AF05F8AA1A3F1E5D33AEF8 -E458D4201863F20CE0F5AF0F37D70EBD7F4677613F89F238F860682FE6BA1792 -B433291F651F70371F32FA7FF5EA58A579213218C98D1898F6B6E2C0803A0FC4 -FBF34D8CDC472C6CB3E226DC16DE65DE5471DCF39AB3B5622AAB0308436F6310 -C01EC7278C7E99AF8ED59EC44A9FBCC1966491439051B1B8A0EF91D7AD30C363 -7D0B8FB4AF9A321D90723F0CF4EF5A320509BD1642ADF323151C7B71C1EBE9DA -AA794B741CB26F63C36E197DDDB27E94681AF43325B49A4B9925837411B73E5C -A03127D81FE9D6A092D9650366F4DBCE524D85CF1CB7F9F6ADD92091E72A58B4 -61FCB70700F4EC074E4FE151CFA7ED91982C88631F3E465FAE3DFF00CF34D49A -138F63092E2612C7290E5A324302F81EC08A9FCC57BA2893AE49DEA41E4823DB -AD4F70DE45D3AC8B225C1E1599414F6DC7AFF8E2AB04FB2CB1BB318588DABB80 -191D324E323BFD2B44EDA10D1A506B528B2961958BA8C0590484E39C63DEA85D -894DA32A3F9D1872C790A47B7B75AACECEECB18852553C6221C9F53CF7A9A322 -26E9F215C326EC9FC4F7AD13B12D919D752290C72B4B0A336DF2DC678FEA3F9D -69DB5D6F525645922C65773F4F41552E44134A91DCAE5792C5C6D3B474C1ACE1 -65776533BE9F30F28E4989C64B01C8C67BE3FC6AD4B5D04EFD4EC6C35EBEB150 -20BD9E28C825D439C019E075E3FA57A0E85F18037911EA366075FDE26D6FE1E4 -F4C8C9AF15B6D74B02B292A381B1864B7F9F7AD28274578FC85208FBEC4E39EF -FE7B56D0AB38BD190D23E99F0DEBC9AAC3713DB5DAC9146A192257DCE724E063 -AF6C66BA3B1F10BAE0C8AF181C12D90377A723FCE2BE59D335AB9B1BB54B595D -5D31B9A23D39CF3E86BB3D1BE233DD44B1EA173716F297DD1CC4F98848E01604 -9FC3EBED5EF51CC22FDD99C93A2D6C7D1F69AC2CA14EE073D0EECE47AFBFF5AD -38AE43E704118EA0D78FD9F8AE7B3485AFCC4D1C4A8864B460AAC3A11F5EFC74 -AEB347F10ADDDBF9B0C9E6A281BB0012A7DFFC2BD78555357472B858EE832B7A -7E749B548E0AFE67FC9FEB59167AB2B81F31CE33F2F22B463B938FBDC11F8D75 -46A3464E048C8A48E57EBB8FF9FC7F0A66DC12783F89FF003FE153A4DB8F049E -F8A07CDD376318FBDFE7FF00AF5D31AA99959A2B0C63A8FCC9FF003FD69C4AF1 -CAFD771FCF3FD6A465E3E6C8FAB0FCFF00CFE14D2AC08FBD9FA8AD94905C81E1 -5231904F61FE7FC8AAED6FE841F6CFF9FF00EBD5EC924F5FFBE85213B87393F5 -61FE7EB4DA4C7A332DE365F6FAD478E70456ABC21F83FF007C9C71504969CE71 -8A9E5EC4DBB141A304F1C1A89E33B4839231D7356E58593AF15116001C83F88A -576857B14DE1E495E073C7F9FF0022A1C30EB9EDD79FF3FD6B44A0FA1A89E318 -C11C71FE7FCF4AD14CABA28326E008383EC7DFAFD7DEA292DFAF19C67A1E3F2F -F38ABAF0E57E50738EE3DFFCF151B2946C1F53FE7FCF5AD54BB058CD780B1E0E -381C75FF003FD6A165287079F71D2B576007918E9CF4FF003FD2A096223D7F01 -D7F0F5FE95B46A3EA66E3D8CF68C31CE706986239E32C2ADC96DE9D3F4FF003F -FD7A8CC6C99E3F2ADD4930BB2998BEA0FB9A634471807F2AB8C013F30A6F940F -4E2A869A650742C390093D41E9FF00EAF6EF48B106504EE53DFE6FF3F9FA55D3 -1B6395E38EB51B4408E41FA629DC2C5468B8E48217D4F03FFADE9E950188100E -402719079FF3FD7AD6818881ED51142130D9E80924E3FCFF004ED549B158D9A2 -8A2BE4CDC2BC07E2CB9B7F1BDFDC858E5445883ABEF20650765E95EFD5E33E35 -B3D2DBE22EA0756BFF00EC8B59E08D526BBC0B6965DAA065C365303392CB8F7A -F17368B95049775FA9DD84FE23F43CF9CC8D1B431C48EDE6798D838007A6E3D4 -5450FDBA1BC3693450310DBA3B80FC38C7A678C62B4355D325F0F5BAADD83269 -729F2EDB54B6749ADE73E8B203EDD08E306A1962C2B35B3C322C437BAB1DD907 -8E3A7A1FAF35F1CE2D3B33D6DB516191625BA9A1779D5790B2AB15272338C741 -FF00D6A5BEFB6D94C935CD905D35C6E5983E591CFDEE327DF9AA7A67892D5AF2 -511EB4961A8A1089652B796D27D01FBDCF7F7C60D6D0D4269AEE18EEE21711E4 -3CAA0155239C839C8039F4A5669EA5269E852583CB58E49E30AFB80031C63B71 -4B756DB2D641BC22C8A5DD8904E3B018E82AC4AB6B7BA9AF97769022C782A642 -F1CA70496048E38FCF1D6A95B4C97335CA79C90470100485964F346EEDD31F5F -C28DB704D3123813FB3D8228759065D548CFB609F6E4D529F293B240ED3A372C -319D80761C569CF2A09D45B937700C86D8E0EC23B023F1E0540CD18511279B1C -CB2ED92E618890471C903F97D69790DC7B193259ADE209A173240A097F332A7D -38E9E94B142A3645804139393939FCCF6AD396D77A47E7DD428A1599158E0BE4 -F078273F97B55136A6483745188EE233B565DBC6719040E38F6CF5E6A9333B33 -3A281ADE55884815F767CC652463EA7E9481B02478EE8800EE60060139E3031E -B57A5B46FECE8637B9226203B1C8DA79EE0FF8F349260C489026ECA7CC778C86 -E99E9C1AD2E2B5881EE56EA3DD7118DE32B920957CF3FD05526B510D996B3B96 -0CEDF75B8C1C0E87B568B960F126C29F21DCA8DD39EA7FCF150AA328C226E43F -3291C86FF1CD689AD990D0B69702311ACC4C3203D19B3F5E95A91EA82D718720 -1054E391FCBF1AC78CC728785E1773236D32B900A7BE48F7EDF4A1566B748441 -22CA1188642F823DF06AEE9A16C75FA66B9369F6AE8AE440C559E090964C81C1 -18C1FA73F5AEDF4AF1359DD436D22CAF657402969172771F55C60638E98EDF8D -7905A6B32CB04DBA458963218B48701863FCF1DEB4AD75968C479DE1300821F0 -B8F6FAFAD74D3AF283D19128267BDA789EF52E24683CBBA059537038663B3249 -EDD07B76AEAECFC616CB3889E7C312028653B9463BF5FF003D6BE7ED17C5C6C6 -7CE19A0EC81F073EBC0FAE3D335D25B6B8D711BA92AE5947CA630241923AB77E -9D71CD7B1471E9E9239A545F43E82B3D7A39D7974C601E33D3D6B562BE460157 -1CF635E1BA7EAB3DBC96734134B71037C854CFB4363F881E73D71FA77AE9B48F -1E472078A4260BB192D0CAE01519E307D3183CE315EB42BC6472B858F5613290 -30467BF14EC02072BFF7CFF9E2B97D3BC4D0DC852B2AC80F43BC1078FD7FAD6C -5BEA2920C87038CFCC6BAE336B631704CBCD1E4F4E7FDDA614603819FF00807F -9FF3D6849D58672A4FFB24D4A4A9031B79F527FCFF008D74C6AF433716883AE3 -81D3FB94A54F391FF8E75A91954807E5F5FBC7F9FF005FC2985403C107F13C7F -9FD2BA1493D85723317030A41E0FDDFCAA092D783F2E0919C6DE2ACFCB8EA3F3 -27FCFF005A32A31CAE3AF53FCFFAD56E3DF733248361C63B9E314C3907A75AD3 -F2D49C8DA78E99FF003FFD6AAF2DBE464103DBAE7F4FFF005D66E3D84E3D8A18 -0C7D29A622339F7E6AC3C38E7BFA9FF1A6B646723F2A49B424DA29B421B1B7AF -000150B290BC80063DF1D6AF940C3D0D34A1CE7EF568A63BA33D955BA819C9E7 -F0A8CC0B8181D0838FF3DFD3F5ABD2420B7F772698613EBC71DFFCFF00F5EB55 -20B19CD6E318C2E31F87F9FEB51496ACA4918E3FC3FCFE95A5B5954F1DBD7DE9 -ACAA7A80067B7F9FFF005568A6D12D197E5BF619E9FAF4A61E7A8E95A7E403D4 -E7A75FF3CFBFAD44F6808CFF005FF3F9FE15AAAABA93CAD6C67F943271C0A6F9 -44107D39E2AE496B8CE3239C7F9FF0A8CC457DFE95AA927B05DA25A28A2BE60D -C2BE6FF8B3770E89F152EA49E5D4E1D4B503047A5BB5BA3591658BE656672060 -9C6480D8E7B8AFA42BC93C5BF0F25BFF008857DAF43A56BCD7DE420B1BD94C77 -9A479A142FCD6EB978F1D0B3000F3835E5664B9A8ABF7FD19D786BF3E878CEA9 -E23F11F842CEDB52D4F4836B0DCABC85B4D905FD8E41E985CB21F7DB8EB56A1F -1DC32C905C5D931C37709726D504981C80BD46391CE70C33D2AEB7C2FF008BD6 -BE39D16F0784AD6D2E74D0EE358F04DF5B59DC5C46C4643C334A4152546E5039 -201F7AF3BD6068FE3FF1E5C685E2AB8B76F18A36D92FB438A6B3BDB66DA4B2C9 -6B38F325014E4342AC3E6FF64E3E6A74B45FE47A2A6CF44315C6BAF14FA5DE59 -5AAC017CFB59E0DCD2A7A07DA4AB739F6AB539B992EE4FB3C8D12C6190C33905 -F71E841E84707BD727E02BDD7E3D62FBC3274CB3F106896920B4B7F10D8BAA4E -9827FE3E56460EA70BD360C106BB897494B92F63E5452CEAECAAE087627B8247 -1CFB57149383B1D49F3ABF52A86114D0B5B324233BA369F8CE3AF62071EB4CB5 -263BAF3104664BB254445C65CEEE73C77F6E39ED53C85ECECDA398A152CA4954 -6C30380303AE7AF34D7BEB3D4241692C44B4431F6889C2B42C4615F0793DBA02 -7A56714AE931EAB6219619926BB860536F2EFDC638909C718CE718E7D4139FC2 -9B637086D9D83FD9E33211314DACE0103A82720F4AD1363AB691691C56BE23B6 -D719D4B4D0DF42CB23AFAEF60BD381C9A76AFAE6957D63A6CD05C5C58789AE6E -85A402E57CF8DD8ED0A89342085C16FBA5875F7ADBD97664A93BDD99CBA94812 -5B574E1CB2C33489811103838C60F1CE0902996EDA5E8B7D63752CB73AA5DDD2 -149523B70B075E0EE0FEDD7033F8564EA51F8A0EB577A75FD86951DD5BDC7957 -57101636F02B2603C89BB70E307D739ED5A1A759DD476E6CEE74696FAEA00D8D -4AD107D9A74CFCA10125C70573BB8E2B4F6124AEF521D5D7421D2F4DD4E2B1B6 -4BE9ADB54824C4925EA148D5013841C9049C839F4C8C53A5B079E59A10B848C9 -69523E5828C91B719CE401FCE9BA468F636D6EB2DC79F63AD17114166C4BC020 -1DF38201E5FA91C0F5A92E5AD1EEA6B29CDC46F038861793E64033B8300A09C6 -4F53E9E959CA3B5905D58A30C2D70F76D140EE21750E0A9DC81977293F854524 -2ACE4191A4914655DFE55C7FC07D0839E38CD6C39106A4D736D1B79E50C77538 -6DA557E5C3B63EF7000E7A03516957726B51CE934C502C8312C5CA91FC277720 -1249E3E951AEE3B26CCA16B2DB168C3A29994053B77216EBE9FA52A5A128B980 -8BA490FCCA708FD6AD2DB492DA1DF0B42BBB6BAB672467F507DBB9AAD204172A -5E40A5481126EF9BA739EDFE453E6EE271B10C11BC824F3D51E1C0C46CB8FCF1 -CE334EFB4B11B7ED00CA000D1B0C8001E8075E3E94F96DFC8BA56927752707E5 -72C411D876A2691FCB5DF1A095C1259C60E3B73EE6AE32B68C96AE4D1DF2AA17 -62E373818D9C1E381FE7AE2B42C35931832473190B00183705BD87A63F4AE744 -66D048FE5AC83A649CF2704D580F259AA25B0F30FCACA17A1E3A0CD52934C9B6 -87796DE29786289704A407CC55DBF71873C0EE78E95B96DAEC1ABBA5D7992C4B -BF2D398C6E638202E3238E3B7A579A5A5CB5BD9A2ECFDCBFF18C9E735A116AD2 -EDD92A477607C9F679CF0A7AEECFF81AECA759A337047ADE95AECF06A093C0D1 -CED29C11BB68E077F4FAF6C75EB5D5E97E27D494A89A10C0F076F0739E8074FE -95E1B67ADB5932C713C972ACCCD26D8C945933855E382319C63D39ADCD3B5B93 -48856DD9A5916725E047725B208C63B01923AF238AF5218C69239DD23DF349F1 -8A5DE13E785B246C917FCE6BA7B4D456423E6C37D3FCFF00F5ABC0B4CF124D77 -BE6F3A1B744423FD23827819E077EBFD2BA2D17C63F650199D05B1E464316538 -E9F9FF00F5EBD4A3885339E50B1EDB1CE188F988F63527DEE9919E38615C4E93 -E2B8A6B7898BA85640541CF4AE82DF548DD7EF007AE07A577C6A35B33070B9A6 -C995C9CF1CFDE1DBFCFE1DA9863653FC47D3914C8AE837A73CE40A9D4861C608 -FF0076BA6357B9938BE8439E4E33F830A33C7F17E2D5294DC0E7E6FA2F351F96 -C3A027FE018FF3FE735D2A49888DE207AA9E7B7150496CA7381B4FA839AB5838 -E9FF008E5186E78FFC729D90F7DCCD6B6651919E3BFF003FFEBFA542C8C3B1CF -7E39AD6F2F23A60E7B2FF9FF003D6A392DCBF1B01E31D08A9E5EC2B2338A861D -334C3103D3AFD2ADC96FF31E0F1EA2A031E3DBA546A89D5103211D87A7033513 -C48FD8FE02ADE7148C01E319CF19AA5263BF728185B23F0E9FE7FF00D54CDA47 -04107D31FE7F2ABC62239C64FB7B546D1AB02081C0C56AA634532818E71DFAE3 -FCFF00F5E98D06703A918E9C71FE1FCAACB424127008C9A8F1B5813C74E95A29 -7611428A28AF14D02BC4FC65A4F8557C77E26D427BBD720D71A082364B4D46E3 -4C889118D86392360246C6327A8E95ED95E0FF0017F43F146A3E25D52E23D42D -5FC390DBABB59A3349200231BFCC8D86064F20A329C75E79AF23346D50BAEFFE -676E13F89F2392F19DAF8B27BDD2A7F0BF889B4ABE8E0115C5E5F5F7DB0C8A31 -8128909C9E3A8E47AD50D3743B2D5E55D3FC6BA5DBEAD7311FF47BF95DAF5221 -EAB7072F031C11C3E391EB5CBA437DABF84F4F5F0A5FFF00C2393ADC63ED5A80 -FB45B4BD72BF38671CE3A8ED5DCD9EAA20D39E5BFBA533C4D99DAD919410003C -027B77C71ED5F26E728AB267AEA2A4EF228E99A7DFDBDEEAF05EEBCFAD6868E2 -28348BC905D058C72163B8CE5780A33C91F5157AFE3BB8AC9AF6CAE60B4B69E3 -D90E9F73766E24864FFAEEC4B9EF807A67E950D83B4B0E50C739BA713A3326D2 -C09E0E3A67FA735A0FA15D3AEA260B8D32396252E219599A491781F2E10807A7 -D6B3E67276635B7BA57B4D5EE6EEC1619F4E4B5BF422391209B70CF049CE07CA -73F8E0D4125EDCDDB5DD8CD6D2451C606CB91F3C7BBAE43E002DEF9E94DD2924 -BDFB35C4D756B0492B6D69FCB75C0C0EFB8FF2E2AEDE38D0AEFECD1C8B7D0CAD -BBCC0A59013C7183C67D303D6869DD93A1807519F4981255D50CF364AB5A2BE1 -9FF0C9CF4FC2B6B54B28F5BD264B0D46C3ED36EEE0CCF68DB279464101B00138 -3CF39F5155F55F0DDE49A735E47A47DA2DF248700489BBA70721C1EBEDFA55DF -F842EF6EEDE1F148759AE2205D112E18A08FA7CF190318E795208F7C569095BC -81AE9B95B46B2F1358E9D2E9F378C6D3C51A12C2D1C7A4EB302C77904449FDDA -5CB12EDB4103E6C838C1AD7F075B5A7876C04565AFDDBDBCD3179ADF58B60CF6 -CA493B20562405C91F771802B39F54BDBA8E6B9F255E0036CC90468CCDEA0B36 -080476C9F5CD437777349000970D696AAA1A3888CAAF1F8FA9FCFDAAAA556DD8 -514A2C65FADACB05CBCF14D69789810F9F72C7CC1DF2E7941F8F3CD5EB7965B1 -6B39E186DA425435C4A67F35761E0E1FF8CE33FCAA3822BABA0B2473C6E257F3 -14CB80593FD95F4182739E2B17C5BE2EF0CF81354F0EE8DA95D6A8756D55C185 -74D44308CB85DB36E20EEC9E00E391CF359414A6ECB72A6D2D59A5732457267B -5807FA3BAB3493436C5018F3F75D8745CEDEBD08A934C79AD2D56160240EA1BC -E09E5E3FE02B80FEBFCA9FE07D4ECFC4B2EB5368F06A36F75A4CA62D47499996 -2B868FBBA1048D84ED3C9072C39AB175A1787340F0CD8D9E8B73FD9B33448B04 -77F792CF19972772063B99480464671D00EF5A28B4DC6F67F993A35CE8C49228 -6C52E2E23B6314770CAB2F9E77472485B8DAFEF919C7AD4371E669B64D23400C -DBCA9582712C51F5C03C7CB91CF5E2B567F02DD0D7ACA3D5A678AD56D55C5822 -FEE1E4DD957279230704601CF39ACAD2112256B6D46D7576B692FCDBEE4F242C -8E43B2B1C28DC802903001395EBD4A777A48124F644363709A9445A3B77B8584 -9CBDB8F36307BAEFE7FF00AF47912C85CDC4CBE5804AA0C6231D97DFEB50C16B -A86813EA4912DAEA4925D14B8B1D1235B5DFB4E59485DAA587F7801E993C545A -4F8B748F13BDCBD8CAB25CA48C2E2145612A05FBC367038E72738E3349C746E3 -B0B9B5D772589258DE468C828FC6C620F1C741FD289ADD3ED2183B3CB8DA25C9 -1F9FBD5A92D5A58B7C2CD0C6C4FCB20E98CF391CFE9DEA184E5A34702305F2E0 -82091DB07B77ACB9ADA31D8AB2493DB28892669324E5A5217078E47A7D69C61B -E318B9899670ABB4C6CFB8C8DBFBE727A7AF4E2AC4302C92C9B5B7161B50B9C7 -3D81ED4DD925ADE2C810F036BF6C8F63F502B5849C7513572DCB7B369370E264 -7B88E46048B624C511EEA5875ED9CF5AB516AB3DC4662B546897CC3FE951A86E -4E36383E99EE7E958E9E64A8D6F652986E5DCCDBE4918BFBAA8E84FBE462AE5A -6A8D6EC96AC2EA4BD862F32E638822B3A1F518EB856EFC75E6BA54ECB996C66E -2B666DBEB4ED6A6298C4D3C4C03066019BA61B1DB19EDDC56D693AF89F33CAED -B55CC6225F984841EE471CF18F515C3D94F2FD86E6E618E08A7497789262CC8D -900005093CF3D78AD4D3E737021B68AC4DBC8920FF0045F336C6EDB4E58E3271 -F8F18E05747B471466A1CCCEE6CB5F8A79DCE0DA4A8C082B3F2C327078EDFF00 -EAAEC74AF17DF58DBA1DC974AA7A87C1C7B8E9C76FAD791DB5C4B09B9699046D -6FB404D80330C9C631D7A77FAD5BD235E6B5F965958804B2BC632C0F50194E38 -F7F6AEAA7899476664E9A67D13A378EEDAE0444CC91B3924C4F200CBE9907AE7 -8FAD75767ADC73EDDAE1B20721B3FE7EB5F375AEAE84C45F6DC093E76C718C0C -678F4CF3E95D35878BAF2C4A2A3EF8F66C589902BA81C2E08EBF8E7A57A94B18 -B69A30953EC7BEC57AAE08560FE841C54EB2230E703D89EBFE7F5AF27D13E244 -1765227778EE0E4F94C06401DF1CF1F8FF002AEBECBC4B1CEA086257AF200CFA -D7A70AAA5AC59CEE1D0EA4EC3D48EBEA7FCFE3F8547B06782A73EE7FCFF87E35 -9F0EA68E83EF7F8FEB57166273866FFBEBFCF15D51AC64E16D87ED18E71EDC93 -9FF3FAD1C67EF0C7FBC6944E48E73F830FF3FE1DA9C183F4DD9F5247FF00AABA -2351489B34336A1C7DCC8FAD44F0075FBCA7D7FCFF009CD582A41EE47A8614DD -C71FC5FF007D0AD3461728C96D81F7BA0F5FEB8FD6A3785876C7BE7F4AD2249E -BBBE9914C3106E83F0C8A5CA8564CCB395E0839A4281BAF5F6357CDBA8C6411F -8E7F3FEBE950496E546406207B73F954B8DB6159A29B478E84FE74D31E79E47D -3F97D3F9D4FB0AF1D00ED4103FCF14949A0B9CED14515E79A057CF1F1934F9ED -FE214B7D6F31B391D22CB2BB30954285C32007D7DABE87AF05F8C5118FC77148 -6785124545C3745F947DFC91819C735E2E6DA61D7AAFD4EDC22BCDFA1C2DEC2C -2E6589F6AB40430F2B8DC3D149073F419ABCEA34FBFB5963C359794CCD300C66 -8B3BB6800F5C9C76EF54B55BC86D2F6612B8BD48489048BF74363F847B67D6A5 -B6F1169B7769035A35AC9E64E01916E43B15E3E5E0679E7EB9AF8F77B9EBE9B2 -2E58DA4BAA8D43C84D4273671AC804B1801D5BAEDE30463B020E6B36FDA4B7FB -2C5A259A5CCD112F77633CDE5CA909FE301F692DD32393CF7E6A4D5357D462BE -8EDEC56ED7CCB826416F30D981D003919FC3B022ABED85BC557772B27DB7539A -101A37C21B6381F370492381F9F5A15AE5EE8B9E1DD7749F17C76D77697D7117 -9EFB54DD5B792A0E070036323D081F5AA9AAF85AF63D4F5296D74502EE24DADF -67BADA97033C1CAB02BC7AE7F2A92E2F552C6DB4E8A08AE0C042ACB0C630DCE4 -904741CF6CF43566D24B77BDB86927B8B49400536DD63CC23A824F5C7D3F9D54 -64A2F98895E5B1CC5BDD5826AB6715FDDEA667B42656B59D4C7241FEC8B8550B -22F3E99E9CF15D6F882F2E6F638A35B2874DB2243ACAB034B2927BF98AEC98E3 -F9D416F74D74F3ACF02DD2A385F993CD2548CE48C76C7F914EBA1240B1C76B70 -C2D542B794433C4DE9D3F97F2AD25579D0A31EC456AF2DF9BB4701CA28892441 -E59F2F3CBE0F24E7D2B474AB0B29A41A749A834503360CAD09381DC8208AA324 -EF35C44B2B7D85DBFE3D7128FF00483DC2F4C8F6EDD2B3AC3C7D69A3788134DD -5ED2EB4CB9327956E6FAD5A3B5998F3F2C8D80D9E4E3823F0AC629CB643BA5A7 -72DDDE870DFDD5CCF716F6B335BFCD1DDA4A488900C80ACA7EEF278E7DEA0F1B -781A3F1ADB69B71ABC125E7D99775AEA76332A3DBA903E7DB8F9B6F6CF3C7D6B -69D843E1D9ACA3B1FB0444FCE517F75FF0220743CF18F5F5AAFA75D6A56B672C -567325DDBBC241B64940DEBC8033D0739E7B66A9392B34C7A3B9CCEB3A2DE587 -8B749F13E91ACFDB6EA158ECF5492E434524D6E102ACA368C33288E34DBC641C -F515BD797B65E1F6FED0D22C663158C81EE2CE47636A0F660761C83D872C31C9 -E958BA65BDF59E9EF6DAB24EC97533ED459817817270C48C9703A76C6E15D2EA -6915A6A2F736FE68B38943C96D92219F939DE87EF70738C76E2AB9F9ACA466BB -AD0ADE21D0ACA1B5B4BED07C2F65A9C5A82ACFAA24D793C72DA8241260CB61B8 -2DF291E9D3A07F8BFEC9A74110D567B74D391A2FB3202DF68811A2DC4C851D94 -FCC7191D88EF571ED4B58C5A941E7476C7F7C7CAB82F0B263A7405318ED9EB8A -9B4A9E16DD3DCE9B637704A8408AF6312B28C83DC723F971E954E7A59F4EA55A -EF4EA714BE21B5D0347BEB8F18E9D0E931C13AC6BA85ABC939909E32DB41F2C1 -F7E3A66B57EC6350B02D2AC6F33C6FF66D46DC849E3B7651F764C90411EC0F4E -95B72F87AC52F06992CABA86997A9BE48AE544B1B1EE19F907A0EDCFB572B793 -DC6910A1D26C5B55B2B691ADFCA88EC68CE30AA84F19CE06CC73C0157CF77744 -A8F2FC445AC58C9A3F872D9ADF7EB0D75298FF00D227441C020932647236EDC7 -7ED4FB7F11585D4D896E0D9C0D8492CA42C6E411DC2101B03D7A63AD5DBBD4A3 -D6F413A52D9C13CE8EB2491BAB44F6E4E4EC652BF2B82723BE307A7357633A6C -9A05D58EB5A0B5DCD70DE5AEBB60CA2FA3E992148DD8F5C3F39343E592D7462D -637B6C675DDA22C7BED515D11406594EC0431E3191C9E3B679A3ECCB72E0A389 -5E34C1507B71DF1D738F6F4ADBD5B498AD5F476B7373A869E4E649256DAE1176 -9DC430EC324E33DEB1A4D4ACE5F108864B98F4E79958C76F22658AA9001C2FCC -73C1E46067AF4ACB95AB9A5F62ADF11240F13C20EF2BC1524E474C1EDC536C61 -B5B5D41652B1C61A4F3177EF6446C8E481CEDCF61CFBD68490B4334A81B6AB12 -A18104B9F51CFF00FAF354C10067CD0B281861B81663DB03AFE3EF8A399C7625 -2D8346B5370125BCB9FB4EA4EEE92A311146464950A483C6DDBC75A82C0DB0D3 -0DF69D2BBC86E82B2185A358D7B8049C9E71F31AB52A98FC95308F3E3C948C9D -F927BEDC704026A1B5B179E058277775663E6895CA9C13E807207E47DAB684EC -F52651366FA61B523B7796D6DED91A5696D210CD23A00C54B1DCA14E319383CF -5AA36B7D617315B5E24523DAC9B9239AECB230393B8B28C739040F603AD41731 -DC5B442DAD02FEE90A34EAE5A331B71B88C004800E79F6CF39A82DACCDBDB269 -F2497D21DDBFCC12953B7393B415C95E48E9C7D056B1958896BA1BEFA74B0689 -2CF792C6259A45DB35BCA376CC8C00DC73D3A8C75AD3B0F10B5859408EB3491C -ABBADFE40AC17828371238E9D4035CBEA5756EF1B457F1AC86265754B525898F -D1500E7048C9CF279ABC1DAE2EAD998CF1ACD1921E691B6AFDD38E842839E067 -8C7E5AF3EAAC4DAC8EC6C3C536F79742D85D47E746A64912789D076E013C13CF -635B1A7DD4703A4D0DD4D677583B429C0C608E8C081DFB579FCDA9B582482F6D -60974F46C472100B07C6012FD08C76A9A39E56B579218E48EE95D4A2DCB83236 -71F3283D41C9AE98D57D198B8F73D734DF17EA163340BE7C53C676A92EA4305C -F38C707F002BACB0F8896C2E36319218C71BE452158E0719E99F5E7E95E072F8 -99AD6F0C7233417516E0D6C928049C81F74F5C63B1FC2B560F12CAF1AA4891DE -E17E5814ED917D0EDED8EB5E852C5382B377319413D8FA5ACFC4D1385CB000E3 -8C104FD2B561D521940F9941201C6D3EDFA735F38E81E234D46632C5ADBD85FA -E2336972ACC0E0139DA701B3E80F38EF5D1DA78E350D3DB6B3A5EA007F7EB2EC -DC476DA475E83AFB57A34F151918CA9B47BC472863946CF27F87BF7FE952821B -A8C1ED84FF003F85799F87FE2259EA6D1C66E04133827C995F6C981DF69E71EF -D3F3AEDACB538A61F7875E7E6CFF009FEB5DD0ABD533170358C58038E3FDCFF3 -C52609EA3F34A8D2752A30C08EBCB1FCFF00FAFF00877A980DC3384C7AE4FF00 -9FF0FC6BB23553D19934D0D008078E7D02534C41BAAFE49C53F629E857F3273F -E7F5A6918C741FF023FCFF00AFE15B277D813217B62C49DA7B9CE3B9FF003FE1 -55DAD8F181CE40E9DEAF700F057F33FE7FC2930AD8CE3F0C9FF3FD6938A60ECF -7388A28A2BCC282BC0FE34D8A6A7E27BADAF1DADCC312224CCF82432F381DFFF -00AD9AF7CAF9FF00E2B5BAB7C43BB5926898CD1C5E5DB32F2E368072738C7D6B -C5CD937415BBFE8CEDC2DB9DA7D8F2593C1DAF585C490477D05EC36E328917CD -200470C70BC8FC79EF5A1E1BD2AC74C9B4E4406DA60A479B6E492CE3249CB70B -C1AD6BD9EE61852D6567B5D2F718E35B46388FD490A7DBF9557D56E6481AF512 -E6148B7468C64524B8DC080BEF93D4F1EB5F20DBD8F4D4229DCBAAB77753CB2F -D9C4F35BDC8549A5E087C601207078E7D39A8A5B49EF352BD33CB05BDDA02279 -275657038EC4631D31DC8EB5562485ED1E596D6E1304A931C8A438CF0318E87D -3AD24334724F6D0B59EF11821209DF2438F7CE3D6A6DA1A5FC8B161772CB78C8 -9673DB3B0D91F9981B5BB124F38EDC67A53E1B5B9926984D771473C4F89A0381 -8C0EA0918EA28B98ACEC6F9F4FB896E56E2645410C72805A3DD8EA46339DDF90 -CD485F4D892EECAEE5BA7748C5AE9B04E326424F019B6E3838E722980EBA8DED -AC15D992493CC4DD2A3FCC46D385E38C74E7DAA35BF6D45755BCB38C5D416C04 -712C4CADE62F4DC403D467D78C525AC50D96A7B2EC9B5B9863F2651F312A78CE -31C76C7E3593ABF86E4F12C716A4B7034ED5A2DBE46A0530EAB907191F30079E -869C6CB70777B1CAFC45F8AABE13D7743B41A35C595A48E1AE96E1419266C28F -DD805B9F9BDBF95690F1EDBF8E7495B0D22F65F0FDC433F98C75884468E39E15 -9B39273EDD3DABAB83C41E2FD5743D29BC428F7165A3B661BEFB522DDCA81FAC -726E2D804670E09FC6B4EFFC336FF10ACCEBF6D7CA8E92FEEE5D562796DF7ED2 -0F98D1E1F3D7E6DD8C6475C574DA165CBBF733E66F4BFC8C9D58F8734DB37D76 -45D5F40D4C42BF68D53C36C279D0827936B2B0561CF503A13E958DF0FF005ED4 -BC556F7F6CFAEE85E2C8750988B5BEBAC693AEC381F29168D1C714D27AAEE232 -31CE6AD78635BD5344F08C77517832F748D134E8B75CBC51C4D785B030CB2005 -581E06194B707DAAB78FA6D2759F08DB5EF86AF6D75469A26BCD4EDB54B33188 -A2C0DC5810B8C61B257238AD536938B488B6B745ED316F6C2C759B7F1469935F -5DE9F1968AF34E091EB1326E5C79962EC8BB006037465C1C21FE238E8A0B9D22 -EF4F17177AD476F21E3ECF2C4D1CE84742C8C0103FFAF5E7BE19F1C5BDC7856C -E3D19AC350F0FDB39FB4E87AD42B716247CDB9A10C311B64F5CF4661D6BB2D27 -C5761A769910BFBDBCF0EDE2AE34F6903DC42F6F8C288E4405957AF0580EB914 -4A9C24D741A93DF72F4534DA7249662575B75F962665044917AEDEF515CDC5B5 -F4460768E366C21766C71C11C700671F5E956ACBE25DDF89A6B3B6D70E9F6964 -76241790C7BA53F36036F190C0F1DB39EB9AB9772CADA93436E64BB2498C4924 -82359578FA73C0EBDAB92A4545BB3B9719A768F42A9588C8D6F1BC93D898F2B6 -920DAE87D41EE07B1E28D3E3B5B4C42B1BA595C31574489410DFC2D9279C139A -A5636F73AEC0B697769359DD59CE3CA8E4932C01C7CEAD9E9FE4D3A10F7304B6 -D6B70CD3A2B43282EDBFCB3D76B7001393F8E2A53B3D0D524D74312E6116BE30 -7FB0E876B78D2DBB117F75732451348A54052173F3E01ED838E7AD4DA0EB31DE -DBC7A94713D86E5117EFD91893FC6DB431001E3DC638ADDB885AEED6382E6F7C -9B8890812AA92CE78DA091F28F9303A738CF24D58D427B5F8916DA67876C44FE -1DF182978F4FD55C6FB58E418253041E08070BC56D16A768F532778EA8C37427 -ED3297BB8A38216668A6882A1001CAA9CE4E476C55AB29D7CF8E768E29BECB11 -68639787815BFDA3D725BB9E7763DAAD4D0EB1141A8E94F04B0EA1A694B4BDB8 -07CA8EEE524AF9AA09CED246475FCAA9492DBDB69B0C2B317B8DCC658E45C86E -C483EDC0FE559C93E6D741FBAB633743B571E1CB917F2DADB5FC5284FDCABEC4 -89B073B980E98C640EE2A39ADBC8B50C9346C6DB6C76E58AA8047A9EA474E7F1 -AD08E1481AD9AF26F2BCA276DB073B067F8B69CE4FA565DD6ABA94F746236488 -8CC010EE19238C1196719C32E3B0E783EB4D372DF51B5648AD697AD2B38F2678 -2F154BBCAF19D839C704F0720E463DEAE1827B0444467F2D98B3127E61EFF4E9 -F4AB37115CB8934FD39545D15320BB51F239C0DCBC1CF427F2AE562597C39149 -1DFC2D35886334B781B734593C294E588CE00C0E3BD2E5BBB216C7411491CE05 -A9678D9D71230C0DC47B7A726AB90DE679D6B7125D4F0028279146DC371C31FF -003D6A586EAD2F6C9A5B7659E1237E5C15DBEA08E0814DD3E733401770306599 -58119C8E08FE79A1B6B742B264F6F24723DE4B129D2EE82084A13B96E071F329 -C9CF7CE3A629D73AD8B130E9AB3874950816FB4860C07CBB7FBC39E738FE1EBC -E23B59A4B63E6ACDCE70C85739C8E3F1C66A2867B38E4B7BA2D2492C4BB2340D -90CA71B9791C741F89AD554D751496A5EFB3DD0D7EE2CE7C133C2BE55B4F831E -401CB39FE2EB8009078A48EC25D1EC105F8E657CACCBBB6850795CF518C76E95 -16A519B4B65FB0247147E76C2CDB5635C8C9C1E08EBC8CD55D175992C2FA29EC -675B568CB86821CA2A8E46E5527EF1CF07A63AD6B1937A2339AB33725B98FC4E -C351B6960BDB5D3E6063849DAE841CE587527E5FBA7AFA5453AC925C1BB48879 -4E370322B248FEE07E07F2ACFB6B69B53B437D7935CCD776F23882277DDF2123 -8723A86C0FCBD0D2AE9B7F31B785C456776ADE722C61958FAA9627B8ED9AD94E -FA91CA5F6B0D46E6CD44E6167E2550CE54AF238240C83F9E2B5F44F16CF68F15 -BDF46E10155564032AC38E3D73E86B98B698DD2DD4B2F956F2EE134B1C8E4B31 -E00C3038EFC7EB4B776DA9022E2DE6021745CF98E41500727208CF5FC4E6B553 -76DC8E4B3D8F51D3B548351BDB7904B223C7F2AABA956383C0C8F7F7AEA743F1 -FCDA3DE3AEA8D706197E786558C1D9DBE6C76C82323B9AF06D3B59D630B6ADA7 -DB5CDB925926662AD81C9272D5E89A7F88592D12C99942CA432C72E383B41E0F -F2FD6BA69E21D37A7FC025D3BEE7D05E1EF17477F6D0BC4EC55D559723A83D3F -FD55D6DBDF09541562B9EC6BE5AD175A3A24D2CF080970D840A4B18A4407AF1F -81EC6BD37C3BE3CFB42A46E850F3C3E7F1C1EF5ED51C546A6FA1CB3A763D9165 -F30019FC738FF3FD29DB4B7396FCC7F9FF003EB5CC69BE2386E557E655E9C1E0 -D6D5BEA31BA8C329C81D01AF46351A39DC0B450F6273E9B8537057AE71D396C5 -39250FD40FC4669E060654E0FF00BA3F4FE95D51AA9EE66D3470145145711415 -F3F7C50BB9E2F8977AB069F6979B618CB89A005C8F2C7F1751D7AD7D035F3C7C -65D47678F6E6D218678259E2484DD29DAA18A82A720E4E3B823B66BC4CDFF80B -D7F4676E17E338DF32DDA288DCD8431DB7594DA1DCE0F71C8E0F27B7F3A84BFD -BF535B596C9A488C7E642E631865E7A21186030493DF9AD2BAD0351D12D2DA5B -DB78AF5675F2A4BBB19F1F37AB0603835422BB13DDC0904F88B7948E395177C5 -185C9058004E7247B66BE4ACD23D6ED716C2EB7DE324513FDAE270C25B721523 -F47D8060803E9E953BC4607102DEB5D96B82EF72B235BAB0EA76904818F4ED55 -676B58AF1E045B9F32462032011E57B8C8391F8376CD46D1F87731EDB6B96920 -7D8CC6F24208FA1FC39E49C1A14798362DC13C379AC5BBF97677F6637B186EE4 -2C9092A70A5F2777383CF527DE9F7421B8B8694DC5BDBC919F9275B957F2C923 -0B83D00EC7159963A62EBB7A2CFC3CB652C03007997322A46473B5B9DC4FBF6C -D5D8B4EF0CE9DE73EBFE1F8667B2902F930DCDC4334EFF00EC0C9573FEF902B4 -E4BB481376B93DBA4F35F4D04D1C975108C31B92FB95D86325463DCF03EB49A7 -DC3406D2E4334B72E088E36CA903193C7A724E00E6B4DB4AD12F60373A358EA9 -A24A5D5946A57248CE38180C4638FC7151268B69A4DDA32DC2DDDCA4C5D4095D -BCA66014AFCD9C70070300678EF4A5071DC49A7AA29C6F0933B10BBE5E105D4F -88C499E4061C0CE7BE7D2A1136A305B88ACEF6E6CA00C1EEADA0B866B761FDDD -9F708E739C678AB51E9DFBC90491130BB1710CAA010C4F249C9CFD2A178EE2DD -DF4F81D137379CEBD7803039EE79F4ACEED6C2924D6A589EE75D6BC4B9D3FC63 -7F6F0A5BA99EDC6D92075248D8F1B821B3CF3F9562F8B92E6F3C39A95D46CF19 -82C241F61B519372A54EEC01C018E9C11CF435AD16A06DEDE755710C522A8791 -D491819C74E807B74E78A6594B26A5662EAC1A1B665EB3B92159463000EA3241 -AB73D9761455F73C06193C352F82F4D7D3F58BBB7BE79479BA55C9170C880365 -5E16030376DE08E322B5B4279F4BB9B3D134DB81E1537B3FEEEEEC6E0C7A7371 -C0BAB52C54290A3E6523E9C62BD2B5DF09786BC40A25D7F4902796408D2D9968 -9C13F36ECA9C9048073DF8AE22FF00C0373E1D9BFB2AD0CDE2077805C412EC55 -651FC40BF19E00EA3E86BB63554B6FC4871E5DFF0002EE91AA5B2DAEADE1DD7A -0B04D7D0B3695A87DAC59C3A8B8CE44732FCB2B719190739C1C66B7748F136A9 -A5CBA769974CDAC6A723883EC573886E9778322F94CA3320000E31DCFA570FE1 -E9344D3F52B5D1FC73A6C09A5DDDD2959599A39ED54E01C05E23607E6DC9C9C7 -39C57AEE8DF063525F152F8961D423F1DF85CDB18F49D2FCC306A284150AEB72 -00F33688DD41628DB580DD80724A306B5124DEC4D77636FAE431CF7B15EDB5E5 -BBF96D35D06B5990E790CB9E33F967152EA463B5B9B541757032BB0C8063CF3C -7DEE71DF19EFCD705F0EBE2ADA5B78C657F8C567ABEBAF717CC4789B4A984563 -6CA40CA496C1F2429E8C0657771EDDCF882F348D2BC43796F6B71049A6DC4C1A -C67491998C4C7283E6C9FC78E9D322B9E743915EF734E752DF42F5B4164FA94B -7B2931384109782520AA61480572378E075E98A9E1B8B6D4ACE4D22F892933BB -09011BD4F504B1C918C0E09E6A95BC16ED7225F221090212AD13E0BB120824E3 -E62338E47AF6156C477CA06AD25DD8791147868E48B033DF76173F8F38FCEB9D -25D0D536EC4F77A72F886CF52D39AD85FDB960B1DCC2DE64C01F972C083B5D46 -086CE41E954EF7CFD274216D16936FAFC101C2C976AB0DCC7EBBB62FCD8E473F -5CD6A5AEC16D21B480DB6A325B8B959239D951A4E4AE067900F6C7D4554D2A49 -F4882C89796FAE665905C5C08D7058B9F976F031DB2464E39CF772E65AB1AB58 -E4F49D7B4FBA67B6B9B28F4DBB79B315C4E57663D8600C7F3CD6C4DA4A1796E6 -EAFDEDE482DA4780C56CAD1CB85F903608E0FF007C0E33D0D5BF10C5A3EB96D1 -5DEA961A6436DA7C91A2D9EA0F3C4F215CE5FCD830FC1C6136E3D78A647A243A -63968F584BC8EFDDE50982DE583D20F9970AAB9E719C83C735BF3A4AF1FB8C9C -5ADCC8D52DA6D434E22DAF24B2B7257FD32DC6C9E33B73C273FBB278DDBBAF6A -668F6D9D0DEE8EAA6EEFBCEDA6C648D33228E188E47AE71DF1C002AF5BE992DB -22B8C5B856646676DF1952C4FCB919FC73D72318AC0D7BC39717722C5A5DF58E -9D79146C21FB5401EDC6E704B901739C02338E33D2852BFA3FC02D6B5C75D786 -EDF57D41EEE7B86D2A3B79E20B344E112E9013C3631C37A648C1C53259E2B3D5 -3EC6B340D62A0B1BF9A511DB21EBB430CF3CF4CD6CDD8D02CF5396092CAE9E46 -815265B6998DBBF0D8F95CF0796FB814639E3159D34690E88B6BA532429E660B -496CB319179200C9E0EE3D7BE066B4BC7444493D45FB7C77D6EF756732CCA4E3 -28E3000EA4E0F19CF7EB498896C531186765232A03EEE9C86C74F7A97C29F0FA -2BA49B465B88AD357BC9FCF8B5795FC9855F1929244A704750719E48A9B55B56 -F0F17D3753B3BA86EACD7CABABE8547D919FA318C643632A4818E84739ACA54E -DAC75293777721122242166F2CC846591BE78CE3A0EDCFF2AAD6B13E8FA9FDBE -DED6192429B1ED8403120C7DE2CA01FC0F5C5496D1F9D3C8D0B89213F37944E0 -A9F53C73C7A9A51318A468D0B2657E65C0E39E9EDF874ACD3B6837B5C4D33509 -92F2D7CED424B4F3279279A3919440412A4C6189F72001F956B6873A6A7AB5D5 -A8B768A28D18A2C8005620673B80C9EBC64D655CE9EB22F933C513B2482E1524 -5C9073907907A6334ED45AEAFE591D2668AEA45F25DA35F2F298C606C2BD7A12 -3AD6D19ADD9366476DAB6A1A8695716D77671E9DA879998AE61BD29B9320E590 -00186011CE79C5497139BFD3EC1D26BA4B88E52803DC9C48B91B98A1E31C707B -838E2AC6A2B179315B4B6914F64631B650E78931800B0008503AFA1AAA635D1D -CDB496D753EA06D512E3EC65268447B70044CFC820120E48CF04F35AA9DB721A -D4B175711C5324515D43703386D982A17BED3DF9278ED534F7524AECBE646B20 -20239E38E0F38EDDAA1B3BAB81752431D84725B5AC6C7C87450EAB8E76B2AE49 -FAFF004AAA752B0D7AF23BCD31256B19610A8B36436F07E6DDD3000FCB1D6B45 -B8BCCDCB6F175EE9B1DB44D68DA8C9BF0FB1C9112E4642F0777603A671EF5D55 -8EBB208A1B9961963128C7913E4797EC3A1CF19C7BD79EA4B2C2A87CD07E6223 -2A31820F41EE2AC5E78E66B7B64B59F689036639E78F7A1CF6C820D5A9B44B8D -CF60D0BC537FA1D9CF1F9926A6DC329B897615C91F286039E9DC135DCF843E20 -CBA88F2AEE24B1B8DA1943DD0657EC70D81CE48C71EB5E1716B71BC6B3444C90 -050731B06F9FB81D0E318C935B1A76BD15F58C724570931724BC718C3C441018 -1F940073E84F4EB5DF4B1738E9D0C654D5CFA7AC35B0CA7716C8E8AFC107D39F -F3D6B6A0BB59106581FC7A5788786FE285BDA69CB6BAAC371750A9C4771160CA -076DC09191D7926BB9D375569E212D9DC25FA1E7646C030E33C83D3F3E315EE5 -2AF0A8AE99CB28342D14515D273057C85F1EA1F0EDEFC5CD71751BD6B6B98A3B -70EF6D26254431213C37CBE9EB5F5ED7CA5F15BE1BEB7AA7C76D5FC43A1EA761 -E6C296E5EDB50B64B88E32218C0CA161D793EF9AF331EAF4D7AFF99D141B52B9 -E5F65ADA4DE75CF86FC4EBABDA12C614BE80A71DD58F4273E95D2D8699E3CD42 -F3FB56C7C2B62F229559DEE3508635DBD46D05C312327F4AABE295F8A9159FD9 -22F04E85E2C68099CB7862C05ACA38CE444AA48C1207247393DF158BE14D17C3 -DAD78BEC2E2E3C67E27F8477F769E6C963E338268ED59B0C08DAEC8801E9D464 -F35E0AA0A5676B27FD6E77F3B575D4E9E7D53C63E1776B39B484BFB3BFDD26C8 -53CCD99393820E782715CF1F1359794CFA925C585DC4ED1C89731B45B867B060 -7D057A768179AD1BFBFB3D2ACF4EF8B363A7AECFED0F0C6A91C06D8648DEF1FC -C4F4E39C718CD6EEADE20B3D0EDF4B8F5DF0CD85A45393E5C7ACBC6A653D76EF -70013DF19F7ED58BA0A1F169E66919B7B1E50BE23F06EA72DB5C7F68C3751A01 -13596A96F3451ABF3FF2D9063BE7AE38A9A1F08785F53962D56FF5ABDF0BDFAB -E6D459B0B9B1723EEED62A4F5C756CF3ED5DEF8C3E157837583677DA469971A6 -3C89E6C96FA5C62EE05C9206F8900F4FD2A4D6741BB83C2C9A65969DA5DC5DAC -45E08FE4B77F9475546EAC7EBEDDE9726AF95DCAE6B2D5191ADEB5E20D46D6D2 -C9AC74FF0016CB18F9E7BA536ED24407621C004703A739E2A1D27469342D3565 -D3EC6EACDA172A925D4B1CCAE0A81F361BAF3DF15CDDF595B43E0C8A1D5F5CBA -F0BF89679CF9569A9699358C6982D80973F7181E0E01E3F0AE7F51D47C4FF0B3 -C64FA778C7586834A909115ADCBED055B216557C956191D41E76D44A9C9A6373 -B3F23D161BD5B4B891EFDE3B74908306C567576C8CE4F6F6E7F4AC7D67C31FDA -BA8BDE6977820BC98796548C05C63904918276FBF5E2A89D4F53D2D679622DAE -786AE5D592D84C0B6C2BCBC4FC8CE0E73C74C52E969A9CB7715A582DCEA36CED -986E18169AD864E5244EE0678391800572F27665BB4B4923AAD385CAD9CA93C6 -B26CC004B00FC81CE7383EDC562E93E1ED3BC3BADEABAC58DFDFACDA8AECB8B4 -B9FF0050CDF776AE50151CF63F8D58D43C510F85F4865BF4597554B853047825 -668C9009620128C304FCC3D39AEAA692DAEF4EB7945C4721750ED108FCE4E403 -9C818032705BA75E9551A7277B3B7EA2E651B27D0C6B1B2B8B9B79BC9B391443 -FBC75858057E8005663CF5E704F4E3A1ACD86E75EB3D3CE9FA3B84BBB974936B -2172C030214E38C1AE8B481753330569F2227924821240501940C1206060F1C7 -19F7AA0B7D3E9EF6F33A88EF62E7A11DBBFF00877ACEC94532ECD4AC412453F8 -BB433A26B5E16B4B6B88DCE6FF004E8647F2578C9647278E32541CF5C115C9FC -31B1D57C19F10B50B8B682CF503721ED92C84B2269AE3E5FDE107E68A6C2F42D -8F99F8E98E8E4F10BD8FDB0C5E1ABB9F57949759EC35916EF27FB48A5465BD00 -273D2974353AA787552E751B9B7BB6BA0B25BDCCCB1CECB87C8747219883B7E6 -19C0E7A1E3AA2E5CB7BE866D27248778C6FB51F863AF68D6BA058E97710CBBE5 -7D22E62620B0C6727CC19E0023048ACDF0DE8DA4DDE9A3ED90691E1FD56E5CDC -5B5A39913258E76F9AC081F367071DFBD7337BE24D57FE139BAF05DBDADCF8E6 -7B599A38E555DCF903EE46EC4E46067AF3FA54FA8EB1A7BEABE1EF0C5AE9567E -3AD616E36CB9B9FB1CF67202A56DA63221DAE0F42C40278EF576BE962AFE67A5 -69515FE87A9C4DAEE81AB697E1DD2A16495ECED5268EEDE421C391BF7360311B -86076DBDC51D3DECB55BC71A5389B12154BBB7764555E3925D7827D3FC8CCF0C -6B3E2197C617D7777ABEB3A36B1FF1E6DE0BD5E621520501418559B64CA42A30 -D9FDFCFAD743A5F87E1B2BF8967D30E90F3C9895A06280923A95C0D8DEA2B9EA -C52F504DD976649736DFDA3646DEE3C9724B4324B12B295E9821C1C64649DDEB -8A96DEC5D7508A437325D5C140935C48DBCC81576A80A8A1480AA3273DBEB562 -6B4B8D32DD04B218125C4CA6761224C80FA7738EF8EF8AADAD88F57BD796D5A4 -D3E184A9486CC6C40760C956046016CE47B9AE7BC8D7D0D3D411ECE780168965 -9A21283B95B7FB8209C1FE59ACED5D23BEB682EA4B4B5D425B625638EE723785 -C10E4020961D4018E7B55ABDBECDAC76F3C167A7338548D653FBD04F646C64EE -C741D79AA17114D04E88F7A6145C10933EF6419FF59BBF84639C1FEEF5A7AA60 -ACD0CBA8AE268A23205B100FEEE78D3703DCED1CFB8FA035425D3A3B19991A23 -149265DC42A5D1CF0410DC824F5C64638C8AD2F18DD3C76F688AD25C2B364298 -CAB43804EE4278607AFCA4E37563685756B7D792B5B9D412D8B979229589833C -F257F8739E87F5AA4A4909B8DEDB99DE30D6AE2DEC74FD4E568A7B5B08D92327 -7459002E09E1BE5F5CE295AFEDD2382DC492C7712856B72E418D95B965DE3EEF -5230DD70315766685E3BB4BC8E57947CB0C683117391903A303C7D700557D2F4 -66B58DDAF3ED57BE5AB04B666F2F6BB670C54824AAF18E38E2AE3CBB48C6EEFA -13DE59C775692E9DA8C4DB0C8B23B40467628E83239FCEADE97797504B2986E6 -7D5ED118C76D617454BA440F255460938C71C9E0570B776FE27F055E46D2ACDE -2EB69A12649A08D93ECC7939318DC48E3A0EB9078AD5F0BF88ED75BD26CA5B37 -78B582D2A470CC4C52A3FCBCA160373138F94739006326B451974D83993DF736 -5349D3DF518AEDDA6B2B59DF0A0AF19EE42019DD9E3EF638E954EDE281D9EDDA -FED5E49267318120DCA8093C9FEF5491C264952FA55B896E2389E1CCB71E6C67 -93FC0338607FAD42B63A6EB8F6F3A48B14CA488EE63DAA8A7BE46403DF9EB59B -76DF62F4B596E2DA2C77501942C9985F97D87E4DA79CE7B1A99628B2D244497E -410A32BE950DD34AB19877FDAEDE6568E4746CB60E327AF20FB75A86FAE92CC9 -FB1DBB5F6E946EB58AF4F9A06C006DCAE01C8FBA093F9D251BE9B3139345B581 -4B1925010123298CA8C526C87EC53DBBBBAA4AD2C8C919DA26DCC0A823D3D0F1 -D6B3343D7ECF54D56EB4F8A67FED04C1362E0874F973823B9C75FA569AACC5A3 -9368E146F0D270A075CFEBFCA959AD0346AE8A76F6F757BAA4D68E375A794332 -41381229079C71D3D6AE26B37B6DA6BDC5B489A8C191E4FDA54A640E0B6001CE -338FE54D9249721E02BB65063002E303BE4FBF3538568E28D65024B740503C8A -1B19FF0063386FF26B5535ADC8E56F63393C402F34E16D2DDDC4368C4C854445 -14B31055549524F7071ED5A02D25613BDC594E205258C939431A0C024B7CC189 -C7FB22AA99CDC4C54A27CB022C3031059768C0704E026460F1EB4DBD96FF0059 -2238F5116F1CE861282C99962C8C1F981C337D3915A4677EA2E5D4A93787D74B -1E7D8ACA92F0CA338C8E31FD715AFA56B9712BC82E42595C188223282377AE7D -39C7E355B469607315B9B7BCB35543105BA2C0E064F071DCFA75CD4D32A4AA8B -023CAEA42825C124F7ED5A39A2546FA9B91EBED05B42B720BDBFDD336D2CFB8F -5E9D7BF35D2DB6A4822135ABA4B6CAC3CC9149C818C0E3AF7E2B8085EE2D8BC7 -26E96D4138566F9948F6EC2ACB5CB6E32C0CF6FF003659620549E9E9D7EB4E33 -E5D86E373EBCA28A2BEE0F0C2BE78F8B9FB366A7E33F1DDFF8D3C2BE29FB06AC -AF11BDD3E76C464471204C601C642938230735F43D7CE5F19344D635EF1FDD7D -9BC2B3DED8DA18E537D692795248DE5C7C13BBE603078C13C579D8E94A14AF1E -FF00A33A6846329DA4735A1DDFC5CD33C7DFD8B79E2AD1A39264DD15B42144FE -59DBD1BCB19FCF9CFB55BBAD5FC609E208E1F1A0D4E3B71198A59E6B08DAD366 -188C315E1B24FD38C57570DEFF0064586957B710C3A65F4AC5156F232E5179E5 -483C74191583E29F889F0EBC2D74965A9FC5F16BA95ACA1FEC31893CB958E320 -AAAE0F18C62BE5E35677B28B47AF2A50B6B24705A1F873C01A7DC6BDA8F80FC4 -2DE1CD4A56315DDDDB045690EE27254923A93DBDE9D2F877E38E97E1B867935D -F0C7C4DF055CCAD1DA41ADAA452C4E7F89A44887390C3193D7D857A14BF177C2 -1E3DD0E1D2AE749B3BFD0AE51A18E79A268BED4188CB0DDC83C7E75869A47C16 -F8592B5E68905EF87AEB056E593569181CE09C2636E49009E326B7F68F572DFD -3732E48E893D3D4C6F01EBBA2E87E35BAD12F7E1778AEC3C47340638AFBC2372 -D3DBDB280C493998027EF7F09E08A6F8D3E27DF78722D3A187C54F25A5BCEE92 -41E37D3041281DD15A34233DB248EC7AD7B5CB3F88FC6932D969D2EB1E19D3EF -A3578EF6D278D2661B895209538CE304EDE99AE5F44D06FE3D4E5D3FC41E36BB -D45F4B948FB0DD40B238EAB96955003DB9CE7A562AAADED6B16E9B5A5CE37C39 -F1075EF177876E1F45D6BC1FE24D2A5076E95637224B9B66C7DE0AC9C0E18673 -CE47D2AD78D35EF14D9D959DB6B925ACFA75D42B30D7B4F78DDF61620A4B0381 -0B7DDE78C80FC76AB1AA4165E2AD2AE3C3D676DA65D192F59BEDD716B8BA89B0 -DF765E3A026B96D17E17E8FE149351D7FC01E27D5BC3BE233210B61AD0FB5E93 -7CD81BCCD1951B895254166FEEE738E2A352327CD7B7A92E2D2B5AE50D234AF0 -C59DCEAB6B65A8AF84FC431B19AD24B52562D5774790DF669BF7648CF2225C72 -71DAA76BCFECE874B9EEC4179725B65D7D9E409F69E78CA023676E401C8A4D39 -F59D3751BBD53C49E1D97494043B5DF873565FEC977C8DECB6259F60EBC2818E -6A3D7BE214A7524934CD020BBB50372B3121EE138DC38E460E3D38A89F2C9AD6 -EC8BDA3A9B0FAC69FA942B2DDA42B231DAA9B0BEE9319E48FE11C7D2B67EC71D -AC11C9651BC123202C0B6514E38C0EE3DABCCDBC4DE1AF11EA9E5693A88F35A5 -569D2F2D1A392039E5321572463DFDEB6E2D6ADB4F7B7D335091AC8EE2B0CD3A -3289109C0DB8E3AFF4ACA549ED15635854B3F78ECE5F11EA16EAB7043AB14311 -BA58C3AB8F4CF61C0FCAA0B9F2AFE59EE2442C2472F2F9200E063EEFD7F4C554 -8FC1ADAD4D0A47772C5B89F2C99F057B123B67F0EF5A620D4747B28DE43F688B -77FCB760651C0C60FA0F7F5A8F6751AB74FC0BBC2F7B989A8E9A35711C51EA6F -FD9F021611BED63137B9C64118E99C556B883525B5B8B89D61F131B3843DBD99 -665924518E70B806A5D62EF58B0D26E5B4EB8B68EEFCC127973C40A4C7702549 -EDC7A11D6B5BC35E22F07DC6AF71FF000906AB26902C201737770A8156DA52A9 -80176962487ED9A88A72D2227257D4F2ED33E366AF05FEA1AEE8FA2DFE9DA65D -62DEFB48BDB162B21279DB22EE2ACB9EC4720573569A3F87E0D79EE64F15CFA4 -DF6A170268AEFC90D243212082E2404707033C818E6BD97C5B77A2687A959D96 -A1AEEB1E14B1D5825D4106A30B38BD5393B8CCABB548C746E6BAA167A9FC405F -0FDEEAD71141616B1BDB6CD055196EED4800673BCABE09F43D0D765F97C88579 -799C6FF64CFA6784EFF46D4D1355B4332DC41A998F31DE4EC84ABA3602E42332 -FCBDD4D721F0DF5ED73C2FADA781F5259F54B8BB8DF518DF4A7FB425A2A8F9FC -C663B91B233B7A0C1C575562DF0A7E157C47BAD16CAF6FECFC417503A0875296 -5992DC3B2480A0202A9C019C7763C7355AF359B7D63C7B69E16689AE6FCBADC5 -AEA36F3AC57376C992D1ADC63F76FE87853C820E72327AFBBD06B7BDF53B69F5 -492E34A5921886E11A18D8E4305FE204FAE3AFE355C58DADD4D292F336E0AE4D -D10AA0ED1D39C9079EB58366D79ABEAB7BFF00087D95EC52F87A730F883C39A8 -8C4AB11C6C923930B1C8C0ACA7E507271CD74D7BA7258A8B9533476B7037F96E -ACFE59C005719E32549E9EE38AE79425156669BA7636EEB5BB4BBB7B73736BE6 -3469B1267E3CB23182BCF07A8F6AC89AE1C2939436E70999A3DB215CF207EBD3 -EB55E58DAD8C73C9134C90E43DAC31853CF39E463238C76A6595D69D730477B6 -B2DE431CABE646B33105DB39036E063F118CF6AC5DDAF234BDDEA6BDD6EBCD3D -A54333D92AAA98DCEF90B7F7F8EDEF9F4A9EC354D6A186E6CAD6ED09793CC749 -234F34A28C70A172C3A739E3A77AA5636172D1A25A4D1AC8A19D9AE17CC65E7E -604FF876AC0F1AF8892F3C549A3DA59C57E65B512491CB3F9322A2903721E158 -723B640C735D1494AFA6C44DA4AE6E6A5A78B3B5B9D46E192EA3C34A645CEE87 -1CB7CB8E719E33E95CCC7AD4ED319F4AB1988DB992592D8B93CF6CE4608C7EB5 -D63E9874ED3BEC12432A8783C805DD64015860383E9DFDEB9BD0BC216A353D2E -DF4CB9D2EE23D3E2926368B01B7BA790B38691A5188DB01BBAE7A60F19A20A1C -EE32D099465CA9C4AEFAB5B45F6496CAF24B3BB6933119BE4473D197D7039E7B -6292EBC2D1DCC2D7891C4AC9319091F33C873B8EE1D39C77F5AEB7C55A7EBFAC -DB5ED96A9A0D8EB3A4C56F1CF0EA072986185D87E6DCC79EA3AD79FC7E57870D -B5BAD8AC125AC66799269190B2E067CA3E802F20EE3CAFAF3A7B357F7192DB57 -72445A6C5A7F872616F716B3FF0066C56EE67B678F64714CCC4A32608C8E41E3 -A9CD6F69923DE684B7FA75DDB7D991CA48F13008791903B8FE9CD3349D51BC6F -75B6DA282EA0F2CB2BB4804991C633C023B1C7A715CAE83E0BB2F0D6A565A63E -A13F876FAE6F5DEDA403CD0B290C48014775DC3E624727BE2869B566ACC1FAE8 -751324462BA0F6691DB3C25525B794BC26461D727AEDE0E0F1CD165FD9852DE0 -5B1B72D07DFBB3236653C9CA81C7E3E958365E3163E31BFF000E6A6F258DCC5E -6476D75E5BA477C41C60281F29E99248E5BB015D169CB6D05C99AF5FC981A391 -2095879BCE3071D413BB3CE31C542F77DD9EC55B4BC4CB88E95AAEB92CC55F4B -D5ED5FCC9645011D46CDA5B713FDD2473EF4D8E5B5B48750BC9B3A8697243B6C -E4B1532BAB0C9F9B9C1DDC6073F74D5FD16F6F225FB6DBB2CBACD9B9852DA152 -85C118DCCF903EE93C647A6335AB7F16970DB58C56771A9AEB325B4F25E24917 -9B6A8DFBBD91B7CBB8AE4B05F9B819CF6AD52D3965D09F3302CDA0BE86CD9079 -72C90B4860CA8962EC03AFF09E3DF352C911891F791021238738C71C9FF3D2B2 -9FC271DBBCB75A8FFA07F6967CE9ECF3BF7281871C9618007CBEDC56B4D308A4 -446B77BD866016DEFAD5DB690BCB0657CB83B431C93B7F1ACDD36D7BA1CCBA8E -17462589647F3630300141F38031C7A8EF8FC6A35F2EDF4C3A7C61E2B4129922 -8E1660158FA91CF5A8B4ED4F44F1325C5BE897335EDBC527933E548782539182 -59471907F115695E2859A096448DD06C0CCB9DDF9743593BA1FC5B0E8A272E4B -B81B7E5C83D081D49FC6AB5B8DB2E7708F9DE36823DC9FD73535A3F92BB616C2 -3B8DE1738FAF3566DE428B303B6354076FC8C72A3A13EDD3F1A7B8EC50F31E4B -BDCACB2DBA82768CEEE7A11EBDFEB52B13E670A0AA0CE33919E9FE1C54D04715 -C7CC18C85412CDD07D7150E1C32395313A71B391C7AE33EF9FC29DDEE85BE87D -91451457E887CF8578AFC5FF008AB61A66A379A4693ABDBD878A34C659248A4B -A68432BC6ACA1C8FBA0E47383C57B557CD5F17BE05EADE21F18F8CBC49A1EABA -699EFADE149F4DBA8D8C8E2381142AB638CF5EB9AF2F318C6549293B6BFE675E -19CA336E2AFA1475DF8E52D8783ADB51F147FC21513AC9E52C2758591D492486 -259092081F867AF35E75E0CF1AE853BEAF79ADFC10D2FC55E513B6E74CD262BA -9E4242E5A3C444FB920720562DEFECF274EF0A69D73E35F03DC6A7633C844371 -A6DCB3CB131E81D19B078CF39CF1F5A747F0DB57F0278967BAF879E34D43C1DA -D4EA31F6F87CEB745C72087DCA1B682381C715E22A504AF196FE6763AB26FDE5 -F81D4F8AFE3169BA9DEF86A2F14FC2DD6FC07A2D849BAD6E5F482D0CA9C7DF2C -8AA800C1E0F7C576DE2CF8CFF05AE120D2B42F0D781B5DD56E557CB97518A16D -E7A65D3048E70339AF3CB8F12FED25AD6952D96BBE24F0A78E3C3896E45C5B5D -58C714E62390C2365854EE65F43DBB62BE7FD3FC19E1FF0013F8CC5BB7C3FBBF -08416C3799ADAE1994B0C2F52D9C1E4E3DB9ADAA5170D55CCE3554BB1F6D6BF6 -1F69D064B7F146AF7E93C3067ED5A56A2D696368A3955575CE467771DF3EF557 -C213477DE0E492C757B83A543098AEA760C64938F9584B9FDE020FDEEF5F3F7C -3FF09E96BF0F755D37C41F122F7599D6E1634D3EDFE7F29008F1E6162A5883BB -3C9C0AF59974CF8BD77E14B293E1C6BBA26AFA26936A91DCE957960B1CB2A000 -AA862B8C9031ED8CF35E7CE0E5EEA91DB19A56958DAB3F0BF9F0C973A7EA925A -DB39F29C2B0037823EF75C6704FEB5CAEB5AE6B3A7D9CCB797FBE3B750AF6EAE -C125FA1CE0B038EDCF14FB8F16DC5B7876C60F127836F74FBD79F7B3DBDC06B7 -27E6E9B0FF003A921BBB4D6B598961D36678E33BEE119C636E38EA4F39EBE98A -E369A7AEC549F36CCA3A05E69DAC409772C1616C410B3CF72DE53E4F4DA70371 -C71939AB571E15B0D5CBC1637F369815CC8B7766C1E651DD53E6F539F6C54716 -85FDAFA84D6D6F670244641BBED9BB017763B608383FC39FE94496B1685A9449 -692C70849CC3BAD6269371C9200DFC763C9C55295B533717CA95BC87DD4BA25F -437897DA2BEA17116D55BDBD5FB3CAE4F72CA39FAFD2B36DB4DF11CF247ACDC6 -A1278DF48B24315A685E2148E58E3DBD161994640E31B8E48DA3E95D55D78C2C -6CAE23D4AE2DC5C3D9B14983A060E4E06597EEF19E7D3F0AE72FF53B4D4753B6 -B9BFD1E4B0D322632A4B6F74F1A3BB73BF6AB6318C7CA78EBC575D3C428EEAE6 -5382EF6339FE2C49757915E6A1E1FD5BC112DAEFB710D9E9C2F34E94EEF95FCD -2AA5582AFE1935D82F8F6DCE9D6EFA7DC691E2A564292C3A56A0B0DD2CA3B089 -C36E6E4679E6AAF8335881CEA1687C4173736D70FBEDAC26B089D22E391E6921 -B27248EBC123D2A59BC369ABADAD9F86FC3DE1A8EC5AE337375A92CF03E0E012 -1A352547039EDDA9BA906D34B51A84ECCAFA3DEDA6AF2CF1BE8F716CC57794D4 -43615F9C2E54904FB8DB5F3FF8974BD435DF8CCBA50B44D55E4B98C3D84D348B -6E22F2870703D769F6AF7B92C6D7C01A478856075B6B908CB2C6B712DCC2B260 -ED68F7B12C327B019006715E0A74BBABB9A3D5EDFC4D6C7C62D3E6592E4BDBDB -18B6B6D3F265C60796BC020E1BD064A097B49496C2ABAC527B9F4DEA9E0ED3DF -4CD36DA1926F89DA2584BF65BBD2ECEEFF00B5EDD243B7666DEE3CC20A9E480E -BC638AB5A5FC3AD0BC3D646CB49B8D57C0E2601849A4DEFD870E4F02483698C9 -19E33F4AC3D5FC75F19FC116169E26B2F0F785FC53E1477DF7F17860ECB99093 -8C8FDCC441E473CD7436BFB43783B5464B5D7B4BD67C0DA85C855897C536A248 -E462782B2C65B1B49E840C8C7A71728B4B9932E2E2DD9983F17BE0C69FA97855 -24BFBDB2F186AE07C97F7F690ADFC03B6264E9C631F28EC7D2B8DF877F06B41D -57E10DD3F8925D5B4B9B4FD50243AF6AC9BE3814631E7CAA63D91313F7BEF647 -5E4D7B9EA3AFE8011ACE596096D82890DE47FBCB79410082B22E49EB8F980E41 -1D81AF3BF8D5E1FD6C6837373F0EB5F8F4BD44A2B4FA5DE05B8B6BE50DC82AE1 -97A7A8C8C76E2B184ACECF6FEBEE1B8AD5C4C48FE25EA5E1382EB40F19C8F67A -369ED05B59788ED6FE58E5D4212E55705C34774878FBE08C1C1FBDCEADDFC40B -CD56E2E10F864EBB15D346A3528AF1F4BBA970ABB0EF8C3236106D0194700569 -6B5E20D47C4DF0D63F0AF8A34AF0ED86AA74F8E3B4BEBE0FF66865914A4672A8 -DE58DC06783B40CE08E2B9ED23E086B9F0F2EEDE6D575DB2D62FB51B6CC2F0DC -39B65030BB50F084FCB904A83D467D495926D32E2CF40B55B5D56CEF2F25D43C -43E1DBDB394AC70F89EDBCA8262C78896504F031C11D7D2A85FE972A5DDBB3BC -77F26D03618892BD3F788E386F5C11CF4EF5E5DA7788FC4FE02D2A6B3B9BE1AC -431CCF3FF67C84CF230C81B94C83040E3F88633C03C55CD5FC750C1369623975 -3D256F6DD2E2D0DC5BC8F0C9BFEE80F8254038E08E01CD652875487CEAF667A3 -4B6AB319ED6CEF64D365DA30F0A08C678272A720FE5F88AD5B88EEAFE0D3B56F -115868B35B46E2D25D6653BAFD23C11BD6DF6B6F5DD8FF00968BD49C71CF3DE1 -1BE4F1C69525FDB5DC335C4128B7B8911BEEB750A7A75001071CE7AD6A3EA126 -9EB72DE424B0A01BD4B920671C63A03CD650A8E0ECFA16E316AE5B9667D7ADAE -A08A3B24B0D3D635FEDBD16E7CC7B98CE72CF1636960013B4919DC471585E1C9 -2C6DB508AEE2D4E3BC171BE38A796D63F342F39DC8AC197A1EEC075C67A1E18B -3D27C3035CBCD0AE27D16EB5D8145E5A122F6DEE08DE412921DD17321FF57DBB -702AD5B59E96350DF78B37D94425E2974DC2CA640BD0175270D8239C53A8D5D5 -BEF142F6BB436F3E25EB3E10D5AC74DB5F05DD6ADA7DBC65DA7D2669E5D3DD5B -92EC1480D20E061813CF5ED5CFDAF8D2C7E28E9DA935FD85E68DAB5BCB322D86 -A1009CCAB805995DB6B28C60640FAE702B7B46F145EC034DD4F42B678BC3AF26 -CBA649D1DE190A9DD1B0E49049241070BFA558D2AF53469751B98E44D4F4BBE6 -FF004712DBAC72DB47CEF42CDF3B6030FE219C74AD172B8DA5A79932BDF4FB8E -5CDBD85B69EE8B8D2A03098E24B67F28BB7719041E4E71CF1D715525B2B7D73C -36DA35CC7AADA6A076B41737172DF6A5756072BF30DA3AF38391D3AD7457965A -76A7306B5811EEA10662B2EE7871FCF3F9D6598E0BEB95D563B85731811BB346 -44873C63D8038E7B54F3CA3A49DD0B953B38AD4E8BE17E91AF78BBC3FAED8789 -7561E20BB81A5D3849710891CA3EE42ED3C6548660A0EE60C4E09E704D735AB7 -C37D6FC32EB6BFDA33C5670826D84FBA4B48F196DA0B12C8C73EBC7D0D50BBD2 -355D32F239749BA96D6DD079D7BF63BA689A64C646414209037727D4F22BA34F -8951E8F60B65AB7F6D1D365CC91DDC5E4DDC4A4AF0AE8CAB2673919079AD3994 -D6FA917B68D1CCE8FE239355D1E7B6D6E33676CB70A329707C93C8218BAEDE0B -803AF24815A53EAD73721A0B4D464D32F0C92809E60904EDB8720B12383D7FDE -E7356352B2D3C5819AFECE1B9B70143084B2A491B30EB1E43639EB9E0FD2A48B -C396D6B25ABE97E1F034F9A36821617E5D6DC2800B61BE7208C13C93C0249358 -DD25A9A24E4518B56BBBB69E2D62CED34F963949023B832A31C0DACAFB506EEF -D063156B47F106A16FA8C77735C45736237AC9A45C15912EB28C031936E55812 -3A672147D6AB5CAA592452CC81A27263F2D5430503F8B918AA9AA5AC16971134 -4B3CB1EDE4851B493919E0020F4FD2AA4E49DD07BAF7352C2EAD4DA6A9F64D2D -229E45F3BC837053E7392537819754248DC463DB9AA977A5C5A259DB5C5C43A7 -4A4A6E93ECF7DB99339C0DC54E7F218A9AE62BDD3FC979667D93C7F3BF96AAE1 -081C01820718FAFB556D4A3B18AC6CE3BC33BC49266462809941E392BCD437A8 -2EB62296E62B09842F716CCCCAB224570E2391D490B9084F3824F4EB835348CE -AEA37B6ED842B79847191C91DC532E3487B9893FB41209A793E6826954028ABC -819C7CB861903D4E3BD52D46E75FBF3A6DC0BB8EF12CDDDA4516E89BC1209538 -03FBA68514D6FA92E56762F0459AE5D5A68A30C76AA42D83C53ADA7629B66DF1 -487032EC4E57FAD6168FE24D2B5BB5595A5F2252EF1EC9A2F2C8604720938C7E -233E95AB3BB42C88241B86718195391EB8F7C7B1A4E3283D46A49AD0FB368A28 -AFD14F9F0AF02F89DAD787E6F893369DA8DF58DBEA3105FB3A4B23C7264C719E -A060F51DFB8AF7DAF13F1DDD7876F7C7BA8DA6A7696B757B6FE5EC9260A043BA -38C8DC48EFFCABC4CD927422BCD7E4CEFC14B96A37E464DC5E48DE04BEB6BEF1 -449A56912644577631B5D3C479CB7C8AD9E3D057CDDA5FC5FF0087DA6E95AAE8 -1E2DF1D5EF8DAD243B8477B613412CC38DBB3310CF2BC7D2BE9B9A6BA6927B4B -096C61B28BA5BC45044463FBDF7719EC7A135E7FA9784BFB426B3B9D424D035E -313129A7C56709B81C71B4024B73CF03B66BE5A94E2AF197F5F81ECD4BBB4A27 -312EB9A6DCD9786A5F04E91E23B7823850C310830AC9C62362C01C63A6706BBA -D3BE2C35EEBCBA66BFE0FBCB19ACC29B74D4408599F0091BC120839AC1BCB6D7 -DE51AC5A78B1B468ACE5C8D145B18D65519C2B618638EF8EE6AF689E22D77C43 -AC45F6FBD89ED9B2B11BA88850F9E80B77EBFAD774AB5EDADD1C31A76E9666C6 -A1E10F85BE26F13DE5EEBFE16920D799BCB5BDB68BE5E790378DDEA7BF714EFF -00844DF4069A1F097886E618EDD70B6976C042FDF070A0E3A8FC6A9A5AC96974 -D05BEA125D35D82F25BB9DCD1363A30CFB0E71556C7C412687218EEECCCBF696 -291297DC739E79FEBDA9CAAC1C7965AA05192775A331EE3519BC3DABC93EB005 -AEA3A91114BE6826CDF81F7319607001FC0D4BA769169E1D912E2D668AE8C310 -4125B672E4E7804F181B81E7D4D75B7DA8D8EBF631E9D2ADB3CD092C5E7954B2 -FB0C8E00CFE15C8EB9A449A759D849A758B0D32DF3BA18C8C48EDC1DCD9E4E30 -7F018AE39C39754CD54B9B56B62ADCEB106B71E9FA74564BA979AEEF74B32BC6 -6D475251BEE91C7E62AD5ADD6AF158AA6917B9B0B1691BE4752304E72C4F3C67 -155B4DD59355B6874EB0B78EC92D8979E592450D7449C04F6EB8CF3FAD6AEB92 -DCE8D24B35B69B66B19B0312D9870C0365082C40E7A1EBD335167D0A4CB3E16B -CB4BCD5A5896CFEDF6B1B79B03469B11D31F74EEEB9C7F2AE27458FC1FA2F883 -C47ACEABE1BB872975E65AAC713491EDCF2980091861D3FA56F95BCB0D3ECE03 -6EF28BC2CF09866123938FE10392BD0E075E7158D65A04A6DEF6E6CB54D4B4C9 -924F31E3789CEF703F8871B7A632735719F2DEEF413F43534FB8F873E308750B -9D41260662DE569EA1A2FB393D37161D31E87B8ADD92FAFF0058D08289F56D14 -5B20862D2F4E086D6E13B195DBBF271823DEB0FF00B22EFC4BE195179691A6A4 -49325F2C21995012006FFC7719F51EB54ADF514BBD06EEDEDBED11CDBFC89AC4 -E5667718E83AE7F9E2ADCDB568F7334AD66D1A7AB6B26C74FB993537B6B71E5F -9703C00B3EE600723DB20FB9F6AD4F83FE18D5FC257B7DE2BBFD4F478E6D4905 -B98F56B6679648BE5007CA06D388D3AF15C7F88743BAB8B2B3985B0B87B5C4EB -6F73200620A01C1CF5C91C9C53ED3F6C8688CBA0EB3F0E2E4FD8A308F368F279 -AE170A77AC6B1F4E7D783F5AD69E91F73FAFC824F5F78F72D2AD7C436535F9D4 -ACB4CB72251B2F74ACA79831F2EE52C79EBCF1D79ADDBEF194B18FB3DCC72346 -C36BB4D68F22151D39553B57EB83F857927827E3D783F5CBCB6819353F0F2AA3 -17D6BC5D0C96B67C0E43CD22AAF3D304E6BB9D27C5169E32FB44DE1FF14E95E2 -18E22C1A3D17528E75E3B796ADC8E0F6F5157CAF791575B4594358D0FC152DD4 -5AB695A7456978D1B2DCCBA3498214B73B94E4919DBDBD2B23C4FA469F6F0437 -362C97B79B15B6B0D8C476CF38E9935DADCDA43A6229D42CA1B10C7E4BB936C7 -E6023254B74539FE1EDD7B5624905AEBDA3CE628C452A48557E6FBC32300F03D -EB9E6F7572ADD6C717751D9EA96779637333CB677B68D6B3DAB60C2C8EA54823 -AF73CFE558FA82F853C0BE08874B0B2D86896F2F9512907646EC59B03E5E1724 -9FC6BAFB9F0A8BB11CC19EDE48633BC2AEFC8C726B2F55B3B4934F922B95927B -23F24A98CAC83D36F4EDF81AE6E77B5F435946E9B68AFAFDDAD8269FAB5A410D -D30895EDA4BB4792DA46038590C60B0183C103EB50F846CFC4FA56A1A6EB1696 -DA0E9169E229ADE1B38EF750F353CC6700F9280EEDABE62F072DD01156E7B5D2 -EDF4A49BFB4AF6D342B56093AC172C92429EF8EC78C1ADBF0D7803C3F7369A8C -F14F1F8BFC3B2C526A1630798932D9BB2E400493B08C2F231F7718E2B6A4D3DC -5252B5F6F4391BFF00045F9D62F753D7747D67C19ACC572647D57C3712EA5A45 -D2AA8199521F32653B460E546369AEA6DFC55A0788AFD16CF55B6BB86441B163 -71B8E79DC11B0718C63D3BD52F0AFC22F04F8B7C47E23C41E37F065FFD87CD57 -B3BABBB7B14C6C4DD03A0589D8F24A29DC096CF426B17C31A66B765E154D1F58 -F1158F8AA2932A5F52B3FB16AC0020280D21DC4639C83CE0E00CD69521171BDC -CA0DA76B1B56DAE7FC22735D416AA446E8D1B5B185A5F30E085DD8E83938C7A9 -F6AB66F175CD49EE57625B7CA4C61086DC02E72A79078239FC29CB6B1D9B1818 -35D416E8A81A17F3258C9C8059BAE411C9EF54748B269753681BED93DBED32C5 -37D85A5446F42DD3D47B572A69C6C6DAA7A9C05C786350F0F6AE917832CA2BCD -267BB79A480C861BF8267C962BBCAAE0E4B64AF4CF39AEEAFE192382E24FF4CB -E74288B33C27EFF3BC16008E30327BF18E2A5874D6BFD41E1626D2FD93CC5963 -9FCA2A3AE08CFCC08EFE955B58B630DA4D0E9CD7514D12249303210231CE3648 -78919B9E14E463BE6A9CD4B4911C9A69B32392D2DE7B6C22B5C2B1DB224D1B9C -773CF1ED9FD2A46D134EBCB94D4628226D46388425955F11267A6718C7351246 -915B0B8BAD6A49A791B192A649149180AE41E9EFDA89EDEE227DADF690400ADE -413B707BFCBC566F4BF62F47AD88E38649A6BB8A092CD6F124448925621670CC -7E5C9C631B47DE23AFA5666B3A95AE816F15EDED9B5A5C4D318D8CD03AC6A3A7 -E273E9915A92D8D9DE5ABC570B0C8439C4323879320FAB73F8D471DB4B2DB737 -4265450B1DA6E0C080725BAF5EDED5575D857D08E39F4C406082FB51BED42E24 -01216B6D80700E37918E80E39FAD3F55B586DEDE3697930C79490A33BC678F90 -AAE4B0E0640049C5695CDF5B6B96A3CE8069C0A85468A256916407A9C609040F -D7359171A85D59EA9656CD67234734D1249AC4B3A841231E1029E4E79F9BA0C7 -BD3BDDB496A0D5927728E9463866B88152154C036F1C1B915B27E650AF823A93 -CF526ADEA76915FC6FB2116FA7472260DB86478E4E33BC1CE7AFA62AFDD2BDC4 -D3CC60297918DA630B8908EEC4750075F6A99956F2D3ED763B4DBBE22778D86E -DDC67E51D47BF7A2EDEA2D3E1390D135293C2BAADC68B6DFE9C750926B8FB56A -172AA8E85B385242FCA3772A32DC8AB365E28D0D2E5965BB7B6BC562635FF568 -ADD87CDC8CF71EF573CD325E35BFD93171E598E0B9425CA1C0064CE3E4238248 -EB546EBC33A74D6D6B61756F6EB776BE61FED64015A563F759B1D47B1624115B -734669299834D6B1366DE29E189E4B8B68ACAE1242E006DC02151827FDADDFA6 -2A95CC57F7F7B6D710DCA82C3731D8DFBC008E3007CBD4F26B95D1EDFC41A6E9 -9369BA8C1369EAF2A98B53B86FB524CC08F9372FDD181D188073EF5D2DBDF078 -459CEAD1DC994C50DD09D55657538642BDB078FCF14B95EFBA2F99751FE224D3 -6FAD6E74E6923B924EF49A05656C639E5876EFFA5537D72E2D6E62BB8DE1D7B4 -3BB8C3CD386CDC5A380461541F993E55E8A4FCCD93E9B234E9641331FB345761 -1BCF4854397C631B8F5FC31C563E9164574993475D46DE0B8B874682E674DF71 -07CC0B2E49CED20118046771AA8A8CD3EC26DC763EDBA28A2BEFCF042BE70F8C -F05AAF8FAE24B9D1D5ED649A14B8BA69194CA3CA4E0608E838FC2BE8FAF98FE2 -FC76EBF11BC42EE423B7D9C48D70098C28863E9CF5AF173657A0BD7F4676617E -36BCBF54737ACBDC4BADDC691E1E4B6834D9F12FD92E1772B2639C49C9279F5A -B161243A4DEA5FE9563A769BABDB4BE585DE59950800E339C7048F6A8DF50924 -B2B88E29AD2C92420477982D95C7202F63D335159E809E1FD082C7742E754C92 -D2448061303073EBD71FAD7CA6B767ADAAD511EAADAB7F6B5F9D4C5E03727CF0 -96F1079707A003A0C03FD6AE4F613EA56D670DBCB772E9F1A64452A8DC92740E -48E7A13EDCFB560DBAC90DD5AC724F7696D772EE669D0BB3AF53B011D327F952 -3ED8F53BD31B4B696F96984692E259C771B40007FF00AA9EC27DD9A72EA4D7CB -1C7657330D68467CE9388E6070785DB8CF1FCEAA5FDD4CFA69DF37DAA7857837 -E3E7B6931C9CAF3CFA1CFAD68594D62BA7CD7925EBBDB33E6530868DA2231CE0 -E4FE5528B2BA45B6D62DD069B65785A39EEE60B32491740769E57B7279E6A41A -6B47FD798BA659DADAF87A2BD97ECFF6FBA52669626DE93460F1807EE8E07231 -EF583ABF88DF45D36F2DF57BAB489A26578ECA241E5CA091F3063CE78E9D3815 -6E5D1EF1673041FBAB4B90638AE43066964ED81D002327A76156754B79EF64FB -2DD4D6F661D8608532018C1E181C06FE5C534EC16DDADCCFB1D7744D753CB2A7 -4BF2A1133244A13CC638C1439E0E79C7B1AD2D56FA6D2624BEBCBD9374F0AAAB -CF8E46005238E4FF003AE03C7DA878834E9F468F4F45D4AC6693ECD2431425F7 -2EE1CB7A75183C7BD7A35C4B1DBD95AB5EC525BADBDBEF655970606E0739073C -1ED4DAB6A9EE24F9AF7E865EB1AAE9BA1C1A64D77A82D95FB802294C877E4F18 -4CF0BEE3B76A9ECE28AF66BD9F4B3243E6796D7CF72DC9E72CCA79C823279C54 -A1E4B9B5B492E6D61D42C5995A2BC4C803A75427D718E3BF3D292F26B07FB587 -2F11B983052284890A0249D99C9E8052D98F4DC975EB186D2392FACEF05CE9EF -062436F292E5415054FF000F5EE3D2B035BB7D51B2A62B49EF2691A4B4B800AC -C9FDE07B1231D7A8A9AE43DE69D15B5B42350D336ED648B7C33AB718DC49C30C -673C771E95B1A935A5CE9AD7F01DC2050A6225833FA632783EF549F2BD16A4F2 -F32D7A1E6FAA6A77675DB591AC5DF5ED2B9796521046C4004E4119071D0838C6 -6BADD22E2FE5D1EEE7B6B8D30F88EE18185AF200D1C81B911BF07E5E841033F2 -FA5685FEB1AEEB26C4D84FA6C16F25B112AED0678C8E8724F3DF8AA4E963AA18 -F4FBC31FDA53F7F29231192A00FC0FCC2ADCE5A589E5B5C4D5BE3C43E1EF1145 -A1F8FF0049B092CD222F74D657721B09509383E5BB08C9041CE57818AE87C39E -1EF81FE35BB86FFC37A7D9E97AC5A8060BCD0256B5BBB6DC492488D9431CE4FC -D9C726B9ABF82CBC437B67A81B7FB5DDD83858AE6EE3678B078C30E33D783EF5 -C5786346F177C3CD6759F13E83E14B7B2B8F9D56EA3944D6EF82486F2A462547 -392073D3AE2BAA1513567A1128B5AEE7B4F897E1B78DE6B57D374CF8B7A9B697 -BFCC5B4F115ADBDD46CA79F96431348482DD7774C8E82B0FC3B7FF0012745D46 -5D16FD3C3D7B68ACD25BC96C5E2775030318503B0C93D335A96FE3AD77C61E08 -D22EF57BFB0B8D6C962FFD9D626DF77DE046371031C7E5C55ED1BC49793F86A6 -82FA259992710C3306E001D8E3927F4F5ACA724EEB765A5AA7AD8B7E19F167F6 -9DEDDE997DA7CDA66A301F29964394973919439C9FEBC553D5E6124AD12CC7EC -C4ED6523186EA00EF9E3D79ACFD7ED2CF54F0ADE4B38579EDB32ACB0B9565039 -20FB71F9D65E817E757D3A03E7C4431DA8A613D73FC5EFEFD30462B964947546 -CA4FE1675B69ACE9D65A7324B6C56EEF18C715D2200B0E38CC99E3B71C1AC5D3 -F50F1D69CD611DEADBC6975AAFF62DB6A9A5C7124B282E89E63A3263243A95C0 -EB9E2B6AD35286CA4B2D3A2B890CCCDE6C4AE824CB0EC571C8EB8A9B4D9AE2E6 -FA3B7D3B45D3D6F6C124D6B4E796EF0B35D01B80680FCDB7746806C231CF3D2A -63CBB345DDD958F37F887E33F8C1F092CEFF00508BE2E78624D323BD5B297498 -B4C85AF06F1BB32011001F6E48C7043679EDE81AE782B56F08789607F0D78AEF -1BC257D6297D2417052E3CCB871966512230553C1C2918E38AC8F89FE248B43D -10A5FE852F88B4FD42F85D5E5AAB98BECD3797B582B6DE40FF00681FAD6E5DEB -77D7D71A2241797371A6790AF0C4B3416ED82BF75BCC0C0FB11815D1ED14A095 -8CDC5C64DDCA5318E2B1963569E759F6ACB2B206258F6E38C67F9D54B9B4921F -0F59EFB2B0BD685CAC065859C46496EE0F2304F3EA71598F3B69BAD3CE9AFBDA -4B6921967B30B15C092DC1F9B76CE77001B95C75E95A722DB5ECF3ECF3A581F0 -F1B4731193C1EA41E2B05CD02AF19EACCC94BDABEED75524B98A32B05C5B0222 -5527FD5F27939FC80AE8115348B25B7D42136A648637210E7271959067A63938 -1557519A4B39ADE1B9D222D53499143CD33B224F1760067A8C91DA9F6AB6464C -C363FD956D0C8644206F674278271C638E98EB4A5252D7A94935A58C9FEC4D3E -CF51B9BA89D52EA552D1C82300BB0032483D4606326BA3D17C1D7F7FA4B6A36D -0CB716B18CBCB12FC9B80E791D08CE7DAB9A93C1F691F8825D563B8B8865B843 -13B5BCACB1E00041118C80D91D571DE9DAEF84B49D4ECD2EB5BF14DD79D6B307 -7FB6E90D25F151F7717368D0B6D39E8D9EB83C1C55D38464F5661B3D8B775A7C -693413A88A075447672A0CAEE79C938E4B7F773C638EF51EA11D95FD9E750B7B -85B7770D05D40E53E7E806410739E7078356F46F14DE5F585A691632E95756D3 -4A0DAC31878E668F8DAC4484365B39C331391517D82DD751BC8F4E5369AACC09 -29780B29C28272B9DAC78EA0D29C1C6CD15CFAD9A22FB48D3E3F2A34222C00C2 -553BDF8EA7F2EDD2AFD9E8DAB49A4B4DE5496B6F729BE3132A80C07393C7A303 -8AA3F6479AD0DBDE5A2B24980640D865C60E304E7A8F5C73CD6634179676CF05 -B416CF1B9313FDADCBC2911232A369046474C104639A22968987E46A5B423FB4 -A6B8BABE79E707639523E604000F1D4741D2B3163B6814DDDB5E4FA55CEEC79D -6EDF28C75E1B2AB9E41E38ED557C4BAA3A5DD8DB1D244EF6F2227DB34DBBFB39 -8C6412595D5F78E7BE7A75AE805DC5AC42C16E249A504A84950C6580EF800027 -1D0F1D2A5C5C4A6934615F5E40CF770A01637E8A6E3ED4A4B1CB12738248209E -A318F4A669B15E5DC53DA5C5D4371A95B46267013E4D8E48CA9C673D88C5696A -52EA371269D6E16CCDADB84791AE2DDDA78D3823CA2AEBB7DF39E40AA3AB6933 -3F8CF56D7EC5A06BDB8B44B49279A5918854190C407519F9B9F5C0ADA0A2F464 -4EF25A166DA7B8974F03252E07CC9B17744A00E30C7A1FE5C0EF546F7C3D2DDE -9EB3C9321D56DB75DC69731293E69F99F00838CB0CE3DE9B6845E5B2693E7DB4 -9AB3A09159E07D991F377383C29EAD55F4FB3B9F11C77113EA9047ACE9FB6E16 -CADE06B70ECB9C649C8C0C609CF3C1EE2A9425B225D96E3F47D7EF2F67905EE8 -9712491DAE25FB232069067AF38CAE08E7A9AD4B46D3A7813CE8BED10B1CB08D -DD0C6D80429208E470715475CB0B0F124718F11C05750004B2A46CC02B8CF465 -E0F1E9C75AA7AFC7A8691E25F0FDAF859ED25BC9ADD905A5D2344B760AC9BFF7 -99550EB1876E724ED5C64F05ABC9DD68C345A1F70D14515F7C78215F2B7C75F8 -99E15D33E24EABA36B5E20D0AD1EDBC9692D2EEEE38A500C28C0302C0E483907 -D0D7D535C77883E0BFC3EF166AF3EABAE7813C35ACEA971B7CEBED4348B79E79 -36A855DCEE858E15540C9E0003B57162B0FF0059A7C97B6A6B4E7ECDDCF91E5F -18FC34D5ED92F4F8FF004486284168F4D5D4A053F423703FA77AA5A8FC5AF048 -5B4923F18E9305BCA77CD6706A9117C8E819B7E0741C63B1AFAD3FE19D7E14FF -00D131F06FFE082D3FF8DD2FFC33B7C29C63FE159783B1E9FD8169FF00C6EBCB -FEC95FCC757D69F63E5FF12FC5EF065DB585FA7C41D2DA58E1530C035784F97C -01B3EF71C7F2AC35F8B3E0737505FDD788F4659429198B55B79378C8E0824153 -C57D77FF000CEBF0A3FE898F837FF04169FF00C6E8FF008675F851FF0044C7C1 -BFF820B4FF00E374BFB217F307D6DF63E4ABCF8A9E016B7BF36FE24D21DE4556 -135C6B10B30C9C103E7E7BE477C9ABB71F163C0A9A50962F1768179B6D9626D3 -AE35685509DA39DBBB04FB815F54FF00C33BFC29C63FE159783B1E9FD8169FFC -6E93FE19D7E14E3FE498F837FF0004169FFC6E9FF64AE920FADBEC7CDDA37C5C -F015E6836D67278DBC37A64EF1EE07FB4A195616CF4C6E0475EBDAB1AC7E27F8 -192CED847E34F0FC36D0023C86D4A13BCF73F33FD3EB8AFAABFE19D7E147FD13 -1F06FF00E082D3FF008DD1FF000CEBF0A3FE898F837FF04169FF00C6E9BCA93B -7BC258A6BA1F2F45F187C1FA5F9DF66F17F87618253C8B6D4EDD19C03FC44373 -ED5553E2D7842FEECADD789FC34D62F805A4D6A12E063A95DD8FD7BD7D57FF00 -0CEBF0A3FE898F837FF04169FF00C6E83FB3AFC2927FE498F837FF0004169FFC -6EA7FB215FE22BEB6FB1F275C7C57F001805BDB78BF498FCC94EE946A70AAC78 -C107193C1C76EB52DD7C52F045915953C61A0DFAA911899F5685E48D78C904B6 -41EBC8F5AFAB07ECEBF0A41FF9263E0DFF00C105A7FF001BA3FE19D7E147FD13 -1F06FF00E082D3FF008DD1FD90BF9C5F5AFEE9F2945F16BC1536AED143E36D16 -2B7587CC595B558C479C81B319FBC724FE14E5F88FE00B3D3A0847C40D0B5271 -80FE75F448C4F7E4B9E3EB8EB5F55FFC33AFC28FFA263E0DFF00C105A7FF001B -A3FE19D7E147FD131F06FF00E082D3FF008DD3794A7BC83EB72EC7C89AAFC48F -87812DAEED7C47A25A5C3AEC97ECBAADBA4B8FEF160793F5C7F5A6FF00C265E0 -93A6208FC7FE1B9E0B9995645B9BD87CE51824EE3BC71C0AFAF7FE19D7E147FD -131F06FF00E082D3FF008DD1FF000CEBF0A3FE898F837FF04169FF00C6E8FEC9 -5FCC1F5B9763E3DBDF89FE08B5B99236F881642CD9B0F6D637F134781DD4EF07 -D3A75AD48FC71E15D134F7974DF8C7A3EBF0B4A66FECCD46F12265040F9436F6 -5E830722BEAFFF008676F853C7FC5B2F0771D3FE24169FFC6E93FE19D7E147FD -131F06FF00E082D3FF008DD3FECA4BED07D6DF63E4C83E32F8335781B4A6F13E -89E1DBA465B912C1A9C26DC8C60AAC808193BF38F635624F8B7E04D29A4FB078 -CB47B98634F39616D52040EE7A8FBFD7A7D6BEABFF008675F851FF0044C7C1BF -F820B4FF00E3747FC33AFC28FF00A263E0DFFC105A7FF1BA5FD90BF983EB6FF9 -4F9574EF8D5E0B8AD1E1B9F136867CDF9DD4EAD01183DBEF727B7E74CB0F895E -06D2EDE41178E743904A0BEC8F55B78CAAE785CEFC67A6071C57D5DFF0CEDF0A -739FF8565E0ECFAFF605A7FF001BA4FF008675F851FF0044C7C1BFF820B4FF00 -E3743CA54B798D62ECB489F337867E30781449A75ECFE35D02DE612E0B0D5201 -2C200ED961C1EFCF35CCF8DB54F06F8D3C5561716BF143C3DA46A569334FA778 -82D3558A19ED15994AA37CFCED2A0919C1C91C6735F5FF00FC33AFC28FFA263E -0DFF00C105A7FF001BA5FF008676F852011FF0ACBC1D83FF00500B4FFE374472 -9E47CD198FEB7756713E45F0D7ED7F6BE14BCB8F0778FB5DD33C486DE70E3C4F -A6B5B5E43A846E32164024E00DD83F31C14E9CF1D669FF00123E1BEA967A84BA -FF0088FC0A67B4B92B6E2DB54818C9067E550AEE01E3AE0FE55F46FF00C33AFC -28FF00A263E0DFFC105A7FF1BA5FF8676F853C7FC5B2F0771D3FE24169FF00C6 -E9BCA937752B0BEB92B59A3E59B5F893F047433E20F16E9B71E17B1D56C2DD91 -74BB592D449AA7CADC2B0230CD8C1FBC3E603B557B3F8EBE00D4EDEDAE6DB56D -2742DD977B69357858293FC246FC81F4E95F56FF00C33AFC29C7FC931F06FF00 -E082D3FF008DD07F675F8524FF00C931F06FFE082D3FF8DD54B2B525AC84B14D -3D11F35D9FC5BF87C2EE17B8F19F876E6250775A5C6A704B13E7D7731CE33D31 -501F8B5E0959E6493C6DE1F9E28CFEE17FB62040BCF4EBCAE303D8715F4DFF00 -C33AFC28FF00A263E0DFFC105A7FF1BA07ECEBF0A41FF9263E0DFF00C105A7FF -001BAC7FB1E3FCC57D765D8F9B2CFE33782D41B9FF0084CBC3F6B26EFF00549A -B4242B6319186F4E73EA4D71BE29F895A6DAF8A61D43C31F107C3F0E95B3FD2B -4F7D5A1613C8782C0EF0028CE4AE7922BEC5FF008675F851FF0044C7C1BFF820 -B4FF00E374A3F676F8520E47C32F0703FF00600B4FFE375A47295177E625E2DB -D2C7C9F77E36F03789E2D221BEF1B78574DBBD395E79AFE5BCB6BA59A4013615 -5DCACA72A7804E33C1EF5C97883E2EF87F48BD8AD2C755D1B5F9ED89793518BC -5421597232BB4BAB7CA0E06DC022BEDCFF008675F853FF0044C7C1BFF820B4FF -00E374A7F677F852C79F865E0E3F5D02D3FF008DD5472B51D39B413C4BE88F8E -3C3FF1A7C2420B763E28B0B4B49A5FDFC37DAAC53BC5919240C82C3381C13FA5 -6E0F8ABE0482D353963F1AE872DB4174CA96A97F046644CB6D914799F36E0B9E -995C807AD7D57FF0CEDF0A718FF8565E0EC7A7F605A7FF001BA4FF008675F853 -8FF9263E0DFF00C105A7FF001BA9794C5FDA058A6B647CC4DF18BC1DF6849078 -BFC3651941DBFDA76FB8F0382DB87E54DB9F8C7E0B6B3FB449E2EF0F24A187FA -2C7AA41D3239186E4FF3C57D3FFF000CEBF0A3FE898F837FF04169FF00C6E8FF -008675F8523FE698F837FF0004169FFC6EB3593A5F6CA78C93E87CC0FF00183C -1577233378E343384DABE6EA902B443B0CEE249A8C7C55F055BC0B145E2FF0F1 -700B4930D5614675FEE93BB9FA76AFA8FF00E19D7E147FD131F06FFE082D3FF8 -DD07F675F8524FFC931F06FF00E082D3FF008DD57F642BFC6258B92E87CAB07C -59F0A58DDFFA278DBC30D111961717B03C41BA70BBD71C60F5ACC7F89FE16BA1 -216F1E68116A02478C5EDB5FDBC2593776E4FCB8EC73DBD335F5EFFC33AFC28F -FA263E0DFF00C105A7FF001BA0FECEBF0A49FF009263E0DFFC105A7FF1BAA595 -72AB298BEB4FAA3E65B2F88FF0B9344612F8D34F17280A155D5A162EA78382F2 -607D31EB58377E3FF0A5AE9B69A41F1FE8377045379D6F7571AB42F243C0390E -242474C638CFE35F5C7FC33AFC29C7FC931F06FF00E082D3FF008DD1FF000CEB -F0A3FE898F837FF04169FF00C6EAD658D6BCE2789BFD93D0A8A28AF74E20A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2803FFD9 -> -%%EOF diff --git a/Docs/InstallGuide/SOURCE/takeoff.tex b/Docs/InstallGuide/SOURCE/takeoff.tex deleted file mode 100644 index f9d355575..000000000 --- a/Docs/InstallGuide/SOURCE/takeoff.tex +++ /dev/null @@ -1,267 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Chapter file -%% -%% Written by Bernhard Buckel, starting September 1998. -%% -%% Copyright (C) 1999 Bernhard Buckel (buckel@wmad95.mathematik.uni-wuerzburg.de) -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Takeoff: How to start the program\label{takeoff}} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\markboth{\thechapter.\hspace*{1mm} -TAKEOFF}{\thesection\hspace*{1mm} Command line parameters} - -\section{Starting under Linux} -Under Linux, \FlightGear is invoked by - - \texttt{fgfs -$\!$-option1 -$\!$-option2\dots}, - -\noindent - where the options are described in Section \ref{options} below. - -\section{Starting under \Index{Windows 98/NT}} - -In Windows explorer, change to the \texttt{$\backslash$FlightGear$\backslash$} directory. -Call \texttt{runfgfs.bat} by double-clicking if you want to invoke the hardware -accelerated version of \FlightGear \texttt{fgfs.exe}, or \texttt{runfgfs-sgi.bat} if you -installed SGI's software \Index{OpenGL} support. - -Alternatively, if for one or the other reason the batch does not work, you can open an -MS-DOS shell, change to the directory where your binary resides (typically something like -\texttt{d:$\backslash$FlightGear$\backslash$bin} where you might have to substitute -\texttt{d:} in favor of your \FlightGear directory), set the environment variable with - -\texttt{SET FG\_ROOT=d:$\backslash$FlightGear$\backslash$bin} - -\noindent - and invoke \FlightGear (within the same shell -- Windows environment - settings are only valid locally within the same shell) via - -\texttt{fgfs -$\!$-option1 -$\!$-option2\dots}. - -For getting maximum performance it is highly recommended to -minimize (iconize) the non-graphics window while running -{\FlightGear}$\!$. - \medskip - - \centerline{ -\includegraphics[clip,width=12.5cm]{arizona.eps} -} - -\smallskip - \noindent -Fig.\,2: \textit{Ready for takeoff. We are at the default startup -position in Arizona.} -\medskip - -\section{Command line parameters\label{options}} -\index{command line options} - -Following is a list and short description of the command line options available. In case -of Windows 98/NT it is recommended to include these in \texttt{runfgfs.bat}. - -\subsection{General Options} - -\begin{itemize} - -\item{\texttt{-$\!$-help}}: gives a small help text, kind of a short version of this Section. - -\item{\texttt{-$\!$-fg-root={\it path}}}: tells \FlightGear where to look for its data - files if you didn't compile it with the default settings. - -\item{\texttt{-$\!$-disable-game-mode}}: Disables \Index{fullscreen display}. - - -\item{\texttt{-$\!$-enable-game-mode}}: Enables fullscreen rendering. - - -\item{\texttt{-$\!$-disable-splash-screen}}: Turns off the rotating \Index{3DFX -logo} when the accelerator board gets initialized. - -\item{\texttt{-$\!$-enable-splash-screen}}: If you like advertising, set this! - -\item{\texttt{-$\!$-disable-intro-music}}: No MP3-sample is being played when - \FlightGear starts up. - -\item{\texttt{-$\!$-enable-intro-music}}: If your machine is powerful enough, enjoy - this setting. - -\item{\texttt{-$\!$-disable-mouse-pointer}}: In the future, \FlightGear will - feature a mouse interface so that options can be set at runtime. As - this feature is not implemented yet it seems wise to disable the - mouse interface. - -\item{\texttt{-$\!$-enable-mouse-pointer}}: Enables another mouse pointer in the - \FlightGear window. This is useful when running \FlightGear in full - screen mode and will allow access to the - yet to be implemented - - mouse interface of \FlightGear\hspace{-2mm}. - -\item{\texttt{-$\!$-disable-pause}}: This will put you into \FlightGear with the - engine running, ready for Take-Off. - -\item{\texttt{-$\!$-enable-pause}}: Starts \FlightGear in pause mode. - -\end{itemize} - -\subsection{Features} - -\begin{itemize} - -\item{\texttt{-$\!$-disable-hud}}: Switches off the \Index{HUD} (\textbf{H}ead \textbf{U}p - \textbf{D}isplay). - -\item{\texttt{-$\!$-enable-hud}}: Turns the \Index{HUD} on. This is the default. - -\item{\texttt{-$\!$-disable-panel}}: Turns off the \Index{instrument panel}. This is the - default, as the instrument panel is not yet complete -- but in our opinion - should be given at least a try. - -\item{\texttt{-$\!$-enable-panel}}: This will give you the look of a real \Index{cockpit}. - -\item{\texttt{-$\!$-disable-sound}}: Pretty self explaining, isn't it? - -\item{\texttt{-$\!$-enable-sound}}: - -\end{itemize} - - -\subsection{Flight model\index{flight model}} - -\begin{itemize} - -\item{\texttt{-$\!$-fdm=abcd}} There are four allowed values for abcd: \texttt{slew, jsb, larcsim, -external}, which you might want to try. Default value is \texttt{larcsim}. - -\end{itemize} - -\subsection{Initial Position and Orientation\index{orientation}} - -\begin{itemize} - -\item{\texttt{-$\!$-airport-id=ABCD}}: If you want to start directly at an airport, - enter its international code, i.e. KJFK for JFK airport in New York. - A long/short list of the IDs of the airports being implemented can - be found in \texttt{/Flight Gear/Airports}. You only have to unpack - one of the files with gnuzip. Keep in mind, you need the - terrain data for the relevant region!\index{airport code} - -\item{\texttt{-$\!$-lon=degrees}}: This is the starting longitude in degrees (west = -) - -\item{\texttt{-$\!$-lat=degrees}}: This is the starting latitude in degrees (south = -) - -\item{\texttt{-$\!$-altitude=meters}}: You may start in free flight at the given - altitude. Watch for the next options to insert the plane with a - given heading etc. - -\item{\texttt{-$\!$-heading=degrees}}: Sets the \Index{initial heading}. - -\item{\texttt{-$\!$-roll=degrees}}: Initial roll angle.\index{initial roll angle} - -\item{\texttt{-$\!$-pitch=degrees}}: Initial pitch angle.\index{initial pitch angle} - -\end{itemize} - -\subsection{Rendering Options\index{rendering options}} - -\begin{itemize} - -\item{\texttt{-$\!$-fog-disable}}: To cut down the rendering efforts, distant - regions are vanishing in \Index{fog} by default. If you disable fogging, - you'll see farther but your frame rates will drop. - -\item{\texttt{-$\!$-fog-fastest}}: The scenery will not look very nice but - frame rates will increase. - -\item{\texttt{-$\!$-fog-nicest}}: This option will give you a fairly realistic - view of flying on a hazy day. - -\item{\texttt{-$\!$-fov=xx.x}}: Sets the \Index{field of view} in degrees. -The value is displayed on the HUD. Default is 55.0. - -\item{\texttt{-$\!$-disable-fullscreen}}: Self explaining, isn't it? - -\item{\texttt{-$\!$-enable-fullscreen}}: - -\item{\texttt{-$\!$-shading-flat}}: This is the fastest mode but the terrain will look ugly! This option might help if your video accelerator is really slow. - -\item{\texttt{-$\!$-shading-smooth}}: This is the recommended (and default) setting - things will look really nice. - -\item{\texttt{-$\!$-disable-skyblend}}: No fogging or \Index{haze}, sky will be displayed - using just one color. Fast but ugly! - -\item{\texttt{-$\!$-enable-skyblend}}: Fogging/haze is enabled, sky and \Index{terrain} look realistic. This is the default and recommended setting. - -\item{\texttt{-$\!$-disable-textures}}: Terrain details will be disabled. Looks ugly, but might help if your video board is slow. - -\item{\texttt{-$\!$-enable-textures}}: Default and recommended. - -\item{\texttt{-$\!$-enable-wireframe}}: If you want to know how the world of \FlightGear internally looks like, try this! - -\item{\texttt{-$\!$-geometry=WWWxHHH}}: Defines the size of the window used, i.e. -\texttt{WWWxHHH} can be \texttt{640x480}, \texttt{800x600}, or \texttt{1024x768}. - -\end{itemize} - -\subsection{Scenery Options Options\index{scenery options}} - -\begin{itemize} - -\item{\texttt{-$\!$-tile-radius=n}}: Specifies the tiles radius; allowed values for -\texttt{n} are 1 -- 4. - -\end{itemize} - -\subsection{HUD Options\index{HUD}} - -\begin{itemize} - -\item{\texttt{-$\!$-units-feed}}: HUD displays units in feet. - -\item{\texttt{-$\!$-units-meters}}: HUD displays units in meters. - -\item{\texttt{-$\!$-hud-tris}}: HUD displays the number of triangles rendered. - -\item{\texttt{-$\!$-hud-culled}}: HUD displays percentage of triangles culled. - -\end{itemize} - -\subsection{Time options\index{time options}} - -\begin{itemize} - -\item{\texttt{-$\!$-time-offset=[+-]hh:mm:ss}}: Offset local time by this amount. - -\item{\texttt{-$\!$-start-date-gmt=yyyy:mm:dd:hh:mm:ss}}: Specify a starting time and -date. Time is Greenwich Mean Time. - -\item{\texttt{-$\!$-start-date-lst=yyyy:mm:dd:hh:mm:ss}}: Specify a starting time and -date. Uses local sidereal time. - -\end{itemize} - -%% Revision 0.02 1998/09/29 bernhard -%% revision 0.10 1998/10/01 michael -%% final proofreading for release -%% revision 0.11 1998/11/01 michael -%% Added pic from Arizona takeoff -%% revision 0.20 1999/06/04 michael -%% added new options diff --git a/Docs/InstallGuide/SOURCE/title.tex b/Docs/InstallGuide/SOURCE/title.tex deleted file mode 100644 index 578bf5948..000000000 --- a/Docs/InstallGuide/SOURCE/title.tex +++ /dev/null @@ -1,53 +0,0 @@ -%% -%% getstart.tex -- Flight Gear documentation: Installation and Getting Started -%% Title file -%% -%% Written by Michael Basler, started September 1998. -%% -%% Copyright (C) 1999 Michael Basler (pmb@knUUt.de) -%% -%% -%% This program is free software; you can redistribute it and/or -%% modify it under the terms of the GNU General Public License as -%% published by the Free Software Foundation; either version 2 of the -%% License, or (at your option) any later version. -%% -%% This program is distributed in the hope that it will be useful, but -%% WITHOUT ANY WARRANTY; without even the implied warranty of -%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%% General Public License for more details. -%% -%% You should have received a copy of the GNU General Public License -%% along with this program; if not, write to the Free Software -%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%% -%% $Id: getstart.tex,v 0.20 1999/06/04 michael -%% (Log is kept at end of this file) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\title{FlightGear Flight Simulator -- Installation and Getting Started} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\author{ - Michael Basler (\mail{pmb@knUUt.de})\\ - Bernhard Buckel - (\mail{buckel@wmad95.mathematik.uni-wuerzburg.de})\\ -{ \setlength{\fboxsep}{12mm}\setlength{\fboxrule}{0pt} - \fbox{ -\includegraphics[clip,width=10.0cm]{start.eps} - }}} - -\date{June 30, 1999} - -\maketitle - - -\tableofcontents - - -%% Revision 0.00 1998/09/08 michael -%% Initial revision for version 0.53. -%% revision 0.10 1998/10/01 michael -%% final proofreading for release -%% revision 0.11 1998/11/01 michael -%% added title pic diff --git a/Docs/Misc/Features b/Docs/Misc/Features deleted file mode 100644 index 8bd493fa6..000000000 --- a/Docs/Misc/Features +++ /dev/null @@ -1,14 +0,0 @@ -Sky - stars - correct placement for time, date, and viewer position - correct magnitude - sun - correct position - lights the scene correctly - sky - blends into haze at horizon - sunset/sunrise effects - planets - correct position - correct magnitude - diff --git a/Docs/Portability/fgfs-portability-guide.lyx b/Docs/Portability/fgfs-portability-guide.lyx deleted file mode 100644 index f0999b520..000000000 --- a/Docs/Portability/fgfs-portability-guide.lyx +++ /dev/null @@ -1,308 +0,0 @@ -#This file was created by Sat Dec 5 17:56:22 1998 -#LyX 0.12 (C) 1995-1998 Matthias Ettrich and the LyX Team -\lyxformat 2.15 -\textclass article -\language default -\inputencoding default -\fontscheme default -\graphics default -\paperfontsize default -\spacing single -\papersize Default -\paperpackage a4 -\use_geometry 0 -\use_amsmath 0 -\paperorientation portrait -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\defskip medskip -\quotes_language english -\quotes_times 2 -\papercolumns 1 -\papersides 1 -\paperpagestyle default - -\layout Title -\added_space_top vfill \added_space_bottom vfill - -\emph on -FlightGear -\emph default - Flight Simulator -\newline -Portability Guide -\layout Author - -Bernie Bright (bbright@c031.aone.net.au) -\layout Date - -28 November 1998 -\layout Standard - -FlightGear is a multi-platform general aviation flight simulator\SpecialChar \@. - It is an - open development project in which anyone with network access and a C++ - compiler can contribute patches or new features. -\newline - -\layout Section - -Introduction -\layout Standard - -The file -\emph on -Include/compiler.h -\emph default - attempts to capture the differences between C++ compiler and STL implementation -s through the use of -\begin_inset Quotes eld -\end_inset - -feature test macros -\begin_inset Quotes erd -\end_inset - -\SpecialChar \@. - The file is divided into two parts. - The first part contains a section for each compiler, consisting of manifest - constants specifying the features supported or absent from the particular - compiler/STL combination\SpecialChar \@. - The second part uses the feature test macros to - supply any missing features\SpecialChar \@. - -\layout Subsection - -Supported compilers (more to come) -\layout Standard - -gcc 2.7.x -\newline -gcc 2.8.x -\newline -egcs 1.x -\newline -Inprise (Borland) C++ 5.02 -\newline -Inprise (Borland) C++Builder 1 (5.20) -\layout Subsection - -Features Tests -\layout Subsubsection - -STL -\layout Description - -FG_NEED_AUTO_PTR Some STL implementations don't supply an -\family typewriter -auto_ptr<> -\family default - class template. - Define this to provide one. -\layout Description - -FG_NO_DEFAULT_TEMPLATE_ARGS Define this if the compiler doesn't support - default arguments in template declarations. - -\emph on -(example) -\layout Description - -FG_INCOMPLETE_FUNCTIONAL Some STL implementations don't have -\family typewriter -mem_fun_ref() -\family default -. - Define this to provide one. - -\layout Description - -FG_NO_ARROW_OPERATOR Define this if iterators don't support -\family typewriter -operator->() -\family default -. - -\emph on -(example) -\layout Description - -FG_EXPLICIT_FUNCTION_TMPL_ARGS -\layout Description - -FG_MEMBER_TEMPLATES -\layout Subsubsection - -Compiler -\layout Description - -FG_NAMESPACES Define if compiler supports namespaces. -\layout Description - -FG_HAVE_STD Define if std:: namespace supported. -\layout Description - -FG_HAVE_STD_INCLUDES Define if headers should be included as -\family typewriter - -\family default - instead of -\family typewriter -. - Also implies that all ISO C++ standard include files are present. -\layout Description - -FG_HAVE_STREAMBUF Define if -\family typewriter - -\family default - or -\family typewriter - are present. -\layout Description - -FG_CLASS_PARTIAL_SPECIALIZATION -\layout Description - -FG_NEED_EXPLICIT Define if the compiler doesn't support the -\family typewriter -\series bold -explicit -\family default -\series default - keyword. -\layout Description - -FG_NEED_TYPENAME Define if the compiler doesn't support the -\family typewriter -\series bold -typename -\family default -\series default - keyword. -\layout Description - -FG_NEED_MUTABLE Define if the compiler doesn't support the -\family typewriter -\series bold -mutable -\family default -\series default - keyword. -\layout Description - -FG_NEED_BOOL Define if the compiler doesn't have the -\family typewriter -\series bold -bool -\family default -\series default - type. - -\layout Subsubsection - -Include Files -\layout Standard - -This section deals with header file naming conventions. - Some systems truncate filenames, 8.3 being common, other systems use old - or non-standard names for some header files. - We deal with the simple cases by defining macros that expand to the appropriate - filename. -\layout Description - -STD_ALGORITHM => , -\begin_inset Quotes eld -\end_inset - -algorithm -\begin_inset Quotes erd -\end_inset - - -\layout Description - -STD_FUNCTIONAL => , -\begin_inset Quotes eld -\end_inset - -functional -\begin_inset Quotes erd -\end_inset - - -\layout Description - -STD_IOMANIP => , -\layout Description - -STD_IOSTREAM => , , -\layout Description - -STD_STDEXCEPT => (ignore this, FlightGear doesn't use exceptions) -\layout Description - -STD_STRING => -\layout Description - -STD_STRSTREAM => , -\layout Standard - -In use, instead of writing #include you write #include STD_IOSTREAM. -\newline - -\newline -The situation becomes complicated with missing header files. - is a good example. - In this case we must rely on FG_HAVE_STD_INCLUDES and FG_HAVE_STREAMBUF. -\newline - -\emph on - -\newline -TODO -\layout Subsection - -and the rest -\layout Subsubsection - -Namespace Issues -\layout Description - -FG_USING_STD(X) -\layout Description - -FG_NAMESPACE(X) -\layout Description - -FG_NAMESPACE_END -\layout Description - -FG_USING_NAMESPACE(X) -\layout Subsubsection - -Templates -\layout Description - -FG_NULL_TMPL_ARGS -\layout Description - -FG_TEMPLATE_NULL -\layout Bibliography -\bibitem {1} - -Stroustrup, Bjarne, -\emph on -The C++ Programming Programming Language -\emph default -, 3rd edition, June 1997, ISBN 0-201-88954-4 -\layout Bibliography -\bibitem {2} - -SGI Standard Template Library (STL) release 3.11 -\the_end diff --git a/Docs/Portability/fgfs-portability-guide.tex b/Docs/Portability/fgfs-portability-guide.tex deleted file mode 100644 index 99d826aed..000000000 --- a/Docs/Portability/fgfs-portability-guide.tex +++ /dev/null @@ -1,142 +0,0 @@ -%% This LaTeX-file was created by Sat Dec 5 17:56:02 1998 -%% LyX 0.12 (C) 1995-1998 by Matthias Ettrich and the LyX Team - -%% Do not edit this file unless you know what you are doing. -\documentclass{article} -\usepackage[T1]{fontenc} - -\makeatletter - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands. -\newcommand{\LyX}{L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX\spacefactor1000} - -\makeatother - -\begin{document} - - -\vfill{} -\title{\emph{FlightGear} Flight Simulator\\ -Portability Guide} -\vfill{} - - -\author{Bernie Bright (bbright@c031.aone.net.au)} - - -\date{28 November 1998} - -\maketitle -FlightGear is a multi-platform general aviation flight simulator\@. It is an -open development project in which anyone with network access and a C++ compiler -can contribute patches or new features.\\ - - - -\section{Introduction} - -The file \emph{Include/compiler.h} attempts to capture the differences between -C++ compiler and STL implementations through the use of ``feature test macros''\@. -The file is divided into two parts. The first part contains a section for each -compiler, consisting of manifest constants specifying the features supported -or absent from the particular compiler/STL combination\@. The second part uses -the feature test macros to supply any missing features\@. - - -\subsection{Supported compilers (more to come)} - -gcc 2.7.x\\ -gcc 2.8.x\\ -egcs 1.x\\ -Inprise (Borland) C++ 5.02\\ -Inprise (Borland) C++Builder 1 (5.20) - - -\subsection{Features Tests} - - -\subsubsection{STL} - -\begin{description} -\item [FG\_NEED\_AUTO\_PTR]Some STL implementations don't supply an \texttt{auto\_ptr<>} -class template. Define this to provide one. -\item [FG\_NO\_DEFAULT\_TEMPLATE\_ARGS]Define this if the compiler doesn't support -default arguments in template declarations. \emph{(example)} -\item [FG\_INCOMPLETE\_FUNCTIONAL]Some STL implementations don't have \texttt{mem\_fun\_ref()}. -Define this to provide one. -\item [FG\_NO\_ARROW\_OPERATOR]Define this if iterators don't support \texttt{operator->()}. -\emph{(example)} -\item [FG\_EXPLICIT\_FUNCTION\_TMPL\_ARGS]~ -\item [FG\_MEMBER\_TEMPLATES]~ -\end{description} - -\subsubsection{Compiler} - -\begin{description} -\item [FG\_NAMESPACES]Define if compiler supports namespaces. -\item [FG\_HAVE\_STD]Define if std:: namespace supported. -\item [FG\_HAVE\_STD\_INCLUDES]Define if headers should be included as \texttt{} -instead of \texttt{. Also implies that all ISO C++ standard include -files are present. -\item [FG\_HAVE\_STREAMBUF]Define if \texttt{} or \texttt{ -are present. -\item [FG\_CLASS\_PARTIAL\_SPECIALIZATION]~ -\item [FG\_NEED\_EXPLICIT]Define if the compiler doesn't support the \texttt{\textbf{explicit}} -keyword. -\item [FG\_NEED\_TYPENAME]Define if the compiler doesn't support the \texttt{\textbf{typename}} -keyword. -\item [FG\_NEED\_MUTABLE]Define if the compiler doesn't support the \texttt{\textbf{mutable}} -keyword. -\item [FG\_NEED\_BOOL]Define if the compiler doesn't have the \texttt{\textbf{bool}} -type. -\end{description} - -\subsubsection{Include Files} - -This section deals with header file naming conventions. Some systems truncate -filenames, 8.3 being common, other systems use old or non-standard names for -some header files. We deal with the simple cases by defining macros that expand -to the appropriate filename. - -\begin{description} -\item [STD\_ALGORITHM]=> , ``algorithm'' -\item [STD\_FUNCTIONAL]=> , ``functional'' -\item [STD\_IOMANIP]=> , -\item [STD\_IOSTREAM]=> , , -\item [STD\_STDEXCEPT]=> (ignore this, FlightGear doesn't use exceptions) -\item [STD\_STRING]=> -\item [STD\_STRSTREAM]=> , -\end{description} -In use, instead of writing \#include you write \#include STD\_IOSTREAM.\\ - \\ -The situation becomes complicated with missing header files. is -a good example. In this case we must rely on FG\_HAVE\_STD\_INCLUDES and FG\_HAVE\_STREAMBUF.\\ - \emph{}\\ -\emph{TODO} - - -\subsection{and the rest} - - -\subsubsection{Namespace Issues} - -\begin{description} -\item [FG\_USING\_STD(X)]~ -\item [FG\_NAMESPACE(X)]~ -\item [FG\_NAMESPACE\_END]~ -\item [FG\_USING\_NAMESPACE(X)]~ -\end{description} - -\subsubsection{Templates} - -\begin{description} -\item [FG\_NULL\_TMPL\_ARGS]~ -\item [FG\_TEMPLATE\_NULL]~ -\end{description} -\begin{thebibliography}{} -\bibitem{1}Stroustrup, Bjarne, \emph{The C++ Programming Programming Language}, 3rd edition, -June 1997, ISBN 0-201-88954-4 -\bibitem{2}SGI Standard Template Library (STL) release 3.11 -\end{thebibliography} -\end{document} diff --git a/Docs/Scenery/Astro/Stars.info b/Docs/Scenery/Astro/Stars.info deleted file mode 100644 index 9ab48f5ba..000000000 --- a/Docs/Scenery/Astro/Stars.info +++ /dev/null @@ -1,140 +0,0 @@ -============================================================================= - - -A basic set of bright stars -- taken from the xephem program. - -Based on the 5th Revised edition of the Yale Bright Star Catalog, 1991, from -ftp://adc.gsfc.nasa.gov/pub/adc/archives/catalogs/5/5050. - -Only those entries with a Bayer and/or Flamsteed number are retained -here. - -Format: Constellation BayerN-Flamsteed, as available. Bayer is - truncated as requried to enforce a maximum total length of 13 - imposed within xephem. - -Common names were then overlayed by closest position match from -hand-edited a list supplied by Robert Tidd (inp@violet.berkeley.edu) -and Alan Paeth (awpaeth@watcgl.waterloo.edu) - - -============================================================================= - - -Data file format: - -name , right assention (radians) , declination (radians) , magnitude (0.0 - 1.0) - - -============================================================================= - - -The following information is taken from: - - http://www.lclark.edu/~wstone/skytour/celest.html - -Please visit the above site, it contains much more complete information. - -CELESTIAL MEASUREMENTS - -RIGHT ASCENSION AND DECLINATION - -Although we know that the objects we see in the sky are of different -sizes and at different distances from us, it is convenient to -visualize all the objects as being attached to an imaginary sphere -surrounding the Earth. From our vantage point, the sky certainly looks -like a dome (the half of the celestial sphere above our local -horizon). The celestial sphere is mapped in Right Ascension (RA) and -Declination (Dec). Declination is the celestial equivalent of -latitude, and is simply the Earth's latitude lines projected onto the -celestial sphere. A star that can be directly overhead as seen from -the Earth's Equator (0 degrees latitude) is said to be on the -Celestial Equator, and has a declination of 0 degrees . The North -Star, Polaris, is very nearly overhead as seen from the North Pole (90 -degrees North latitude). The point directly over the North Pole on the -celestial sphere is called the North Celestial Pole, and has a -declination of +90 degrees . Northern declinations are given positive -signs, and southern declinations are given negative signs. So, the -South Celestial Pole has a declination of -90 degrees . - -Right Ascension is the equivalent of longitude, but since the Earth -rotates with respect to the celestial sphere we cannot simply use the -Greenwich Meridian as 0 degrees RA. Instead, we set the zero point as -the place on the celestial sphere where the Sun crosses the Celestial -Equator (0 degrees Dec) at the vernal (spring) equinox. The arc of -the celestial sphere from the North Celestial Pole through this point -to the South Celestial Pole is designated as Zero hours RA. Right -Ascension increases eastward, and the sky is divided up into 24 -hours. This designation is convenient because it represents the -sidereal day, the time it takes for the Earth to make one rotation -relative to the celestial sphere. If you pointed a telescope (with no -motor drive) at the coordinates (RA=0h, Dec=0 degrees ), and came back -one hour later, the telescope would then be pointing at (RA=1h, Dec=0 -degrees ). Because the Earth's revolution around the Sun also -contributes to the apparent motion of the stars, the day we keep time -by (the solar day) is about four minutes longer than the sidereal -day. So, if you pointed a telescope at (RA=0h, Dec=0 degrees ) and -came back 24 hours later, the telescope would now be pointing at -(RA=0h 4m, Dec=0 degrees). A consequence is that the fixed stars -appear to rise about four minutes earlier each day. - - -============================================================================= - - -From: steve@mred.bgm.link.com (Steve Baker) -Subject: Re: FG: Fun in the sun ... -Date: Tue, 5 Aug 97 15:37:27 -0500 - -You probably ought to get the stars right too - there is a database -of the 300 brightest stars in the 'Yale Bright Star Catalog' - which -I enclose below. I'd guess that you could navigate by the stars - -so this might not be a completely useless feature - right? - -Anyway, if all else fails - and the flight sim never gets going - we -could at least sell this as a planetarium :-) - -The format of the star data is: - -Name Right-Ascension Declination Magnitude - -(Ascension and Declination are in radians) - -We took the magnitude value, scaled it by 0.8 and added 0.2 to make -a 0->1 brightness value. Using the raw data created too many very -dark stars. - -Originally, there were constellation names as sub-headings - but I -think I deleted them to make the file easier to parse :-) That makes -the 'name' field pretty pointless. - -if you are still talking about the geocentric coordinate system -where the terrain is modelled with Z pointing towards the North -pole, X out of the 0 degree meridian at the equator and Y out at the -Indian ocean at the equator - then you can position the stars using: - - star[ X ] = fsin ( ra ) * fcos( decl ) ; - star[ Y ] = fcos ( ra ) * fcos( decl ) ; - star[ Z ] = fsin ( decl ) ; - -(which you can precompute at startup) - -...and then rotate them about the Z axis using GMT*two_pi/24.0 -# -Put them all in a display list - use GL_POINTS as the primitive... - - glNewList ( ...whatever... ) - glBegin ( GL_POINTS ) ; - - for ( int i = 0 ; i < num_stars ; i++ ) { - glColor3f ( star_brightness[i], star_brightness[i], star_brightness[i] ) ; - glVertex3f ( star_x[i], star_y[i], star_z[i] ) ; - } - - glEnd () ; - glEndList () ; - -You need to draw them out by the far clip plane so they don't occult -anything. Then you need to translate them using the same x/y/z as -the eyepoint so that you can never fly any closer to them. - diff --git a/Docs/Scenery/Astro/Stars.tex b/Docs/Scenery/Astro/Stars.tex deleted file mode 100644 index 4f97cd410..000000000 --- a/Docs/Scenery/Astro/Stars.tex +++ /dev/null @@ -1,203 +0,0 @@ -% -% `Stars.tex' -- describes our procedure for drawing stars -% -% Written by Curtis Olson. Started December, 1997. -% -% $Id$ -%------------------------------------------------------------------------ - - -\documentclass[12pt]{article} - -\usepackage{anysize} -\papersize{11in}{8.5in} -\marginsize{1in}{1in}{1in}{1in} - -\usepackage{amsmath} - -\usepackage{epsfig} - -\usepackage{setspace} -\onehalfspacing - -\usepackage{url} - - -\begin{document} - - -\title{ - Flight Gear Stars Representation and Rendering. -} - - -\author{ - Curtis L. Olson\\ - (\texttt{curt@me.umn.edu}) -} - - -\maketitle - - -\section{Introduction} - -Flight Gear attempts to render the top several hundred stars in the -correct position in the sky for the current time and position as will -as rendering these stars with the correct ``magnitude''. - -This document will give a quick overview of our approach. - -\section{Resources} - -\subsubsection{XEphem} - -The set of bright stars was extracted from the xephem program. For a -full list of features and the latest news, please see the xephem home -page at \url{http://iraf.noao.edu/~ecdowney/xephem.html}. The XEphem -star list was itself taken from the Yale Bright Star Catalog. - -\begin{quote} - Based on the 5th Revised edition of the Yale Bright Star Catalog, - 1991, from ftp://adc.gsfc.nasa.gov/pub/adc/archives/catalogs/5/5050. - - Only those entries with a Bayer and/or Flamsteed number are retained - here. - - Format: Constellation BayerN-Flamsteed, as available. Bayer is - truncated as required to enforce a maximum total length of 13 - imposed within xephem. - - Common names were then overlayed by closest position match from - hand-edited a list supplied by Robert Tidd (inp@violet.berkeley.edu) - and Alan Paeth (awpaeth@watcgl.waterloo.edu) -\end{quote} - -The author of XEphem, Elwood Downey (ecdowney@noao.edu), was very -instrumental in helping me understand sidereal time, accurate star -placement, and even contributed some really hairy sections of code. -Thanks Elwood! - - -\section{Terminology and Definitions} - -The following information is repeated verbatim from -\url{http://www.lclark.edu/~wstone/skytour/celest.html}: If you are -interested in these sorts of things I urge you to visit this site. It -contains much more complete information. - -\subsection{Celestial Measurements} - -Although we know that the objects we see in the sky are of different -sizes and at different distances from us, it is convenient to -visualize all the objects as being attached to an imaginary sphere -surrounding the Earth. From our vantage point, the sky certainly -looks like a dome (the half of the celestial sphere above our local -horizon). The celestial sphere is mapped in Right Ascension (RA) and -Declination (Dec). - -\subsubsection{Declination} - -Declination is the celestial equivalent of latitude, and is simply the -Earth's latitude lines projected onto the celestial sphere. A star -that can be directly overhead as seen from the Earth's Equator (0 -degrees latitude) is said to be on the Celestial Equator, and has a -declination of 0 degrees . The North Star, Polaris, is very nearly -overhead as seen from the North Pole (90 degrees North latitude). The -point directly over the North Pole on the celestial sphere is called -the North Celestial Pole, and has a declination of +90 degrees . -Northern declinations are given positive signs, and southern -declinations are given negative signs. So, the South Celestial Pole -has a declination of -90 degrees . - -\subsubsection{Right Ascension \& Sidereal Time} - -Right Ascension is the equivalent of longitude, but since the Earth -rotates with respect to the celestial sphere we cannot simply use the -Greenwich Meridian as 0 degrees RA. Instead, we set the zero point as -the place on the celestial sphere where the Sun crosses the Celestial -Equator (0 degrees Dec) at the vernal (spring) equinox. The arc of -the celestial sphere from the North Celestial Pole through this point -to the South Celestial Pole is designated as Zero hours RA. Right -Ascension increases eastward, and the sky is divided up into 24 -hours. This designation is convenient because it represents the -sidereal day, the time it takes for the Earth to make one rotation -relative to the celestial sphere. If you pointed a telescope (with no -motor drive) at the coordinates (RA=0h, Dec=0 degrees ), and came back -one hour later, the telescope would then be pointing at (RA=1h, Dec=0 -degrees ). Because the Earth's revolution around the Sun also -contributes to the apparent motion of the stars, the day we keep time -by (the solar day) is about four minutes longer than the sidereal -day. So, if you pointed a telescope at (RA=0h, Dec=0 degrees ) and -came back 24 hours later, the telescope would now be pointing at -(RA=0h 4m, Dec=0 degrees). A consequence is that the fixed stars -appear to rise about four minutes earlier each day. - - -\subsection{Implementation} - -Here is a brief overview of how stars were implemented in Flight Gear. -The right ascension and declination of each star is used to build a -structure of point objects to represent the stars. The magnitude is -mapped into a color on the gray/white continuum. The points are -positioned just inside the far clip plane. When rendering the stars, -this structure (display list) is rotated about the $Z$ axis by the -current sidereal time and translated to the current view point. - -\subsubsection{Data file format} - -The star information is stored in a simple data file called -``Stars.dat'' with the following comma delimited format: name, right -ascension(radians), declination(radians), magnitude(smaller is -brighter). Here is an extract of the data file: - -\begin{verbatim} -Sirius,1.767793,-0.266754,-1.460000 -Canopus,1.675305,-0.895427,-0.720000 -Arcturus,3.733528,0.334798,-0.040000 -Rigil Kentaurus,3.837972,-1.032619,-0.010000 -Vega,4.873563,0.676902,0.030000 -Capella,1.381821,0.802818,0.080000 -Rigel,1.372432,-0.136107,0.120000 -Procyon,2.004082,0.091193,0.380000 -Achernar,0.426362,-0.990707,0.460000 -\end{verbatim} - -\subsubsection{Building the display list} - -The display list is built up from a collection of point objects as the -star data file is loaded. For each star, the magnitude is mapped into -a brightness value from 0.0 to 1.0 with 1.0 being the brightest. Our -coordinate system is described in the coordinate system document: Z -points towards the North pole, X out of the 0 degree meridian at the -equator, and Y out at the Indian ocean at the equator. Given this -coordinate system, the position of each star at 0:00H sidereal time is -calculated as follows: - -\begin{align} -x &= \mathrm{distance} * \cos(\mathrm{rightascension}) * - \cos(\mathrm{declination}) \\ -y &= \mathrm{distance} * \sin(\mathrm{rightascension}) * - \cos(\mathrm{declination}) \\ -z &= \mathrm{distance} * \sin(\mathrm{declination}) -\end{align} - -\subsubsection{Transformations and Rendering} - -The tricky part about rendering the stars is calculating sidereal time -correctly. Here's where Elwood Downey saved my butt. 0:00H sidereal -time aligns with 12:00 noon GMT time on March 21 of every year. After -that they diverge by about 4 minutes per day. The solar day is -approximately 4 minutes longer than the side real day. Once you know -the proper sidereal time, you simply translate the center of the star -structure to the current view point, then rotate this structure about -the Z axis by the current sidereal time. - -The stars are drawn out by the far clip plane so they don't occult -anything. They are translated using the same x/y/z as the eye point -so that you can never fly any closer to them. - -\end{document} - - -%------------------------------------------------------------------------ diff --git a/Docs/Scenery/CoordinateSystem/CoordinateSystem.tex b/Docs/Scenery/CoordinateSystem/CoordinateSystem.tex deleted file mode 100644 index 385152437..000000000 --- a/Docs/Scenery/CoordinateSystem/CoordinateSystem.tex +++ /dev/null @@ -1,173 +0,0 @@ -% -% `coord.tex' -- describes the coordinate systems and transforms used -% by the FG scenery management subsystem -% -% Written by Curtis Olson. Started July, 1997. -% -% $Id$ - - -\documentclass[12pt]{article} -% \usepackage{times} -% \usepackage{mathptm} - -\usepackage{anysize} -\papersize{11in}{8.5in} -\marginsize{1in}{1in}{1in}{1in} - -\usepackage{epsfig} - -\usepackage{setspace} -\onehalfspacing - -\usepackage{url} - - -\begin{document} - - -\title{ - Flight Gear Internal Scenery Coordinate Systems and - Representations. -} - -\author{ - Curtis L. Olson\\ - (\texttt{curt@me.umn.edu}) -} - -\maketitle - -\section{Coordinate Systems} - -\subsection{Geocentric Coordinates} - -Geocentric coordinates are the polar coordinates centered at the -center of the earth. Points are defined by the geocentric longitude, -geocentric latitude, and distance from the \textit{center} of the -earth. Note, due to the non-spherical nature of the earth, the -geocentric latitude is not exactly the same as the traditional -latitude you would see on a map. - -\subsection{Geodetic Coordinates} - -Geodetic coordinates are represented by longitude, latitude, and -elevation above sea level. These are the coordinates you would read -off a map, or see on your GPS. However, the geodetic latitude does -not precisely correspond to the angle (in polar coordinates) from the -center of the earth which the geocentric coordinate system reports. - -\subsection{Geocentric vs. Geodetic coordinates} - -The difference between geodetic and geocentric coordinates is subtle -and must be understood. The problem arose because people started -mapping the earth using latitude and longitude back when they thought -the Earth was round (or a perfect sphere.) It's not though. It is -more of an ellipse. - -Early map makers defined the standard \textit{geodetic} latitude as -the angle between the local up vector and the equator. This is shown -in figure \ref{fig:geodesy}. The point $\mathbf{B}$ marks our current -position. The line $\mathbf{ABC}$ is tangent to the ellipse at point -$\mathbf{B}$ and represents the local ``horizontal.'' The line -$\mathbf{BF}$ represents the local ``up'' vector. Thus, in -traditional map maker terms, the current latitude is the angle defined -by $\angle \mathbf{DBF}$. - -However, as you can see from the figure, the line $\mathbf{BF}$ does -not extend through the center of the earth. Instead, the line -$\mathbf{BE}$ extends through the center of the earth. So in -\textit{geocentric} coordinates, our latitude would be reported as the -angle $\angle \mathbf{DBE}$. - -\begin{figure}[hbt] - \centerline{ - \psfig{file=geodesy.eps} - } - \caption{Geocentric vs. Geodetic coordinates} - \label{fig:geodesy} -\end{figure} - -The LaRCsim flight model operates in geocentric coordinates -internally, but reports the current position in both coordinate -systems. - -\subsection{World Geodetic System 1984 (WGS 84)} - -The world is not a perfect sphere. WGS-84 defines a standard model -for dealing with this. The LaRCsim flight model code already uses the -WGS-84 standard in its calculations. - -For those that are interested here are a couple of URLS for more -information: - -\noindent -\url{http://acro.harvard.edu/SSA/BGA/wg84figs.html} \\ -\url{http://www.afmc.wpafb.af.mil/organizations/HQ-AFMC/IN/mist/dma/wgs1984.htm} -\\ -\url{http://www.nima.mil/publications/guides/dtf/datums.html} - -To maintain simulation accuracy, the WGS-84 model should be used when -translating geodetic coordinates (via geocentric coordinates) into the -FG Cartesian coordinate system. The code to do this can probably be -borrowed from the LaRCsim code. It is located in -\texttt{ls\_geodesy.c}. - -\subsection{Cartesian Coordinates} - -Internally, all flight gear scenery is represented using a Cartesian -coordinate system. The origin of this coordinate system is the center -of the earth. The X axis runs along a line from the center of the -earth out to the equator at the zero meridian. The Z axis runs along -a line between the north and south poles with north being positive. -The Y axis is parallel to a line running through the center of the -earth out through the equator somewhere in the Indian Ocean. Figure -\ref{fig:coords} shows the orientation of the X, Y, and Z axes in -relationship to the earth. - -\begin{figure}[hbt] - \centerline{ - \psfig{file=coord.eps} - } - \caption{Flight Gear Coordinate System} - \label{fig:coords} -\end{figure} - -\newpage - -\subsection{Converting between coordinate systems} - -Different aspects of the simulation will need to deal with positions -represented in the various coordinate systems. Typically map data is -presented in the geodetic coordinate system. The LaRCsim code uses -the geocentric coordinate system. FG will use a Cartesian coordinate -system for representing scenery internally. Potential add on items -such as GPS's will need to know positions in the geodetic coordinate -system, etc. - -FG will need to be able to convert positions between any of these -coordinate systems. LaRCsim comes with code to convert back and forth -between geodetic and geocentric coordinates. So, we only need to -convert between geocentric and cartesian coordinates to complete the -picture. Converting from geocentric to cartesian coordinates is done -by using the following formula: - -\noindent -\[ x = cos(lon_\mathit{geocentric}) * cos(lat_\mathit{geocentric}) * -radius_\mathit{geocentric} \] -\[ y = sin(lon_\mathit{geocentric}) * cos(lat_\mathit{geocentric}) * -radius_\mathit{geocentric} \] -\[ z = sin(lat_\mathit{geocentric}) * radius_\mathit{geocentric} \] - -Here is the formula to convert from cartesian coordinates back into -geocentric coordinates: - -\noindent -\[ lon = atan2( y, x ) \] -\[ lat = \frac{\pi}{2} - atan2( \sqrt{x*x + y*y}, z ) \] -\[ radius = \sqrt{x*x + y*y + z*z} \] - - - -\end{document} - diff --git a/Docs/Scenery/CoordinateSystem/coord.fig b/Docs/Scenery/CoordinateSystem/coord.fig deleted file mode 100644 index 7c33baab4..000000000 --- a/Docs/Scenery/CoordinateSystem/coord.fig +++ /dev/null @@ -1,25 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -100.00 -Single -0 -1200 2 -5 1 0 1 0 7 0 0 -1 0.000 0 1 0 0 6000.000 2700.000 4200 5100 6000 5700 7800 5100 -5 1 1 1 0 7 0 0 -1 4.000 0 0 0 0 6000.000 7500.000 4200 5100 6000 4500 7800 5100 -1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 6000 5100 1814 1814 6000 5100 7575 6000 -2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 1 0 2 - 2 1 2.00 120.00 240.00 - 6000 5100 8400 5100 -2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 1 0 2 - 2 1 2.00 120.00 240.00 - 6000 5100 6000 2700 -2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 1 0 2 - 2 1 2.00 120.00 240.00 - 6000 5100 6900 4200 -4 0 0 0 0 0 14 0.0000 4 195 1245 5925 2550 Z (North Pole)\001 -4 0 0 0 0 0 14 0.0000 4 195 1485 6975 4125 Y (Indian Ocean)\001 -4 0 0 0 0 0 14 0.0000 4 150 150 8550 5175 X\001 -4 0 0 0 0 0 14 0.0000 4 195 2025 6750 5475 (Zero Meridian, Africa)\001 diff --git a/Docs/Scenery/CoordinateSystem/geodesy.fig b/Docs/Scenery/CoordinateSystem/geodesy.fig deleted file mode 100644 index d70a5cb51..000000000 --- a/Docs/Scenery/CoordinateSystem/geodesy.fig +++ /dev/null @@ -1,43 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -100.00 -Single -0 -1200 2 -1 3 2 1 0 7 0 0 -1 3.000 1 0.0000 6300 4800 1800 1800 6300 4800 8100 4800 -1 1 0 2 0 7 0 0 -1 0.000 1 0.0000 6300 4800 2025 1500 6300 4800 8325 3300 -1 3 0 1 0 0 0 0 20 0.000 1 0.0000 6300 4800 44 44 6300 4800 6344 4795 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 120.00 - 7500 3600 8400 2700 -2 1 1 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 - 6300 4800 7500 3600 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 120.00 - 7500 3600 8700 3600 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 120.00 - 7500 3600 8100 2400 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 1 2 - 2 1 1.00 60.00 120.00 - 2 1 1.00 60.00 120.00 - 8700 4200 6000 2850 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 120.00 - 5625 4125 5400 3225 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 120.00 - 6000 5475 6300 6300 -2 1 1 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 - 7500 3600 6750 5100 -4 0 0 0 0 0 14 0.0000 4 150 165 8550 4425 A\001 -4 0 0 0 0 0 14 0.0000 4 150 150 5775 2925 C\001 -4 0 0 0 0 0 14 0.0000 4 150 150 8550 3825 D\001 -4 0 0 0 0 0 14 0.0000 4 150 135 8325 3075 E\001 -4 0 0 0 0 0 14 0.0000 4 150 120 7800 2625 F\001 -4 0 0 0 0 0 12 0.0000 4 180 1125 5100 4350 Perfect Sphere\001 -4 0 0 0 0 0 12 0.0000 4 180 1980 5100 5400 True Earth ellipsoid shape\001 -4 0 0 0 0 0 14 0.0000 4 150 135 7500 3900 B\001 diff --git a/Docs/Scenery/DEM.info b/Docs/Scenery/DEM.info deleted file mode 100644 index 001074413..000000000 --- a/Docs/Scenery/DEM.info +++ /dev/null @@ -1,3 +0,0 @@ -An online guide for interpreting the DEM data file format is available at: - - http://edcwww.cr.usgs.gov/glis/hyper/guide/1_dgr_dem diff --git a/Docs/Scenery/DLG/dlg3sdts.wp.gz b/Docs/Scenery/DLG/dlg3sdts.wp.gz deleted file mode 100644 index 2624e74c887cfd7d40dc2009e7538aa4c213cb2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30962 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

?hiK(u|pGh
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

diff --git a/Docs/Scenery/OBJ.format.txt b/Docs/Scenery/OBJ.format.txt
deleted file mode 100644
index 09b6e7205..000000000
--- a/Docs/Scenery/OBJ.format.txt
+++ /dev/null
@@ -1,3013 +0,0 @@
-B1. Object Files (.obj)
-
-Object files define the geometry and other properties for objects in
-Wavefront's Advanced Visualizer. Object files can also be used to
-transfer geometric data back and forth between the Advanced Visualizer
-and other applications.
-
-Object files can be in ASCII format (.obj) or binary format (.mod).
-This appendix describes the ASCII format for object files. These files
-must have the extension .obj.
-
-In this release, the .obj file format supports both polygonal objects
-and free-form objects. Polygonal geometry uses points, lines, and faces
-to define objects while free-form geometry uses curves and surfaces.
-
-About this section
-
-The .obj appendix is for those who want to use the .obj format to
-translate geometric data from other software applications to Wavefront
-products. It also provides information for Advanced Visualizer users
-who want detailed information on the Wavefront .obj file format.
-
-If you are a 2.11 user and want to understand the significance of the
-3.0 release and how it affects your existing files, you may be
-especially interested in the section called "Superseded statements" at
-the end of the appendix. The section, "Patches and free-form surfaces,"
-gives examples of how 2.11 patches look in 3.0.
-
-How this section is organized
-
-Most of this appendix describes the different parts of an .obj file and
-how those parts are arranged in the file. The three sections at the end
-of the appendix provide background information on the 3.0 release of
-the .obj format.
-
-The .obj appendix includes the following sections:
-
-o       File structure
-
-o       General statement
-
-o       Vertex data
-
-o       Specifying free-form curves/surfaces
-
-o       Free-form curve/surface attributes
-
-o       Elements
-
-o       Free-form curve/surface body statements
-
-o       Connectivity between free-form surfaces
-
-o       Grouping
-
-o       Display/render attributes
-
-o       Comments
-
-o       Mathematics for free-form curves/surfaces
-
-o       Superseded statements
-
-o       Patches and free-form surfaces
-
----------------
-
-    The curve and surface extensions to the .obj file format were
-    developed in conjunction with mental images GmbH&Co.KG, Berlin,
-    Germany, as part of a joint development project to incorporate
-    free-form surfaces into Wavefront's Advanced Visualizer.
-
-File structure
-
-The following types of data may be included in an .obj file. In this
-list, the keyword (in parentheses) follows the data type.
-
-Vertex data
-
-o       geometric vertices (v)
-
-o       texture vertices (vt)
-
-o       vertex normals (vn)
-
-o       parameter space vertices (vp)
-	Free-form curve/surface attributes
-
-o       rational or non-rational forms of curve or surface type:
-	basis matrix, Bezier, B-spline, Cardinal, Taylor (cstype)
-
-o       degree (deg)
-
-o       basis matrix (bmat)
-
-o       step size (step)
-
-Elements
-
-o       point (p)
-
-o       line (l)
-
-o       face (f)
-
-o       curve (curv)
-
-o       2D curve (curv2)
-
-o       surface (surf)
-
-Free-form curve/surface body statements
-
-o       parameter values (parm)
-
-o       outer trimming loop (trim)
-
-o       inner trimming loop (hole)
-
-o       special curve (scrv)
-
-o       special point (sp)
-
-o       end statement (end)
-
-Connectivity between free-form surfaces
-
-
-o       connect (con)
-
-Grouping
-
-o       group name (g)
-
-o       smoothing group (s)
-
-o       merging group (mg)
-
-o       object name (o)
-
-Display/render attributes
-
-o       bevel interpolation (bevel)
-
-o       color interpolation (c_interp)
-
-o       dissolve interpolation (d_interp)
-
-o       level of detail (lod)
-
-o       material name (usemtl)
-
-o       material library (mtllib)
-
-o       shadow casting (shadow_obj)
-
-o       ray tracing (trace_obj)
-
-o       curve approximation technique (ctech)
-
-o       surface approximation technique (stech)
-
-
-The following diagram shows how these parts fit together in a typical
-.obj file.
-
-Figure  B1-1.   Typical .obj file structure
-
-General statement
-
-call  filename.ext arg1 arg2 . . .
-
-    Reads the contents of the specified .obj or .mod file at this
-    location.  The call statement can be inserted into .obj files using
-    a text editor.
-
-    filename.ext is the name of the .obj or .mod file to be read. You
-    must include the extension with the filename.
-
-    arg1  arg2 . . .  specifies a series of optional integer arguments
-    that are passed to the called file. There is no limit to the number
-    of nested calls that can be made.
-
-    Arguments passed to the called file are substituted in the same way
-    as in UNIX scripts; for example, $1 in the called file is replaced
-    by arg1,  $2 in the called file is replaced by arg2, and so on.
-
-    If the frame number is needed in the called file for variable
-    substitution, "$1" must be used as the first argument in the call
-    statement. For example:
-
-	call filename.obj $1
-
-    Then the statement in the called file,
-
-	scmp filename.pv $1
-
-    will work as expected. For more information on the scmp statement,
-    see appendix C, Variable Substitution for more information.
-
-    Another method to do the same thing is:
-
-	scmp filename.pv $1
-
-	call filename.obj
-
-    Using this method, the scmp statement provides the .pv file for all
-    subsequently called .obj or .mod files.
-
-csh command
-
-csh -command
-
-    Executes the requested UNIX command. If the UNIX command returns an
-    error, the parser flags an error during parsing.
-
-    If a dash (-) precedes the UNIX command, the error is ignored.
-
-    command is the UNIX command.
-
-Vertex data
-
-Vertex data provides coordinates for:
-
-o        geometric vertices
-
-o        texture vertices
-
-o        vertex normals
-
-For free-form objects, the vertex data also provides:
-
-o        parameter space vertices
-
-The vertex data is represented by four vertex lists; one for each type
-of vertex coordinate. A right-hand coordinate system is used to specify
-the coordinate locations.
-
-The following sample is a portion of an .obj file that contains the
-four types of vertex information.
-
-    v      -5.000000       5.000000       0.000000
-    v      -5.000000      -5.000000       0.000000
-    v       5.000000      -5.000000       0.000000
-    v       5.000000       5.000000       0.000000
-    vt     -5.000000       5.000000       0.000000
-    vt     -5.000000      -5.000000       0.000000
-    vt      5.000000      -5.000000       0.000000
-    vt      5.000000       5.000000       0.000000
-    vn      0.000000       0.000000       1.000000
-    vn      0.000000       0.000000       1.000000
-    vn      0.000000       0.000000       1.000000
-    vn      0.000000       0.000000       1.000000
-    vp      0.210000       3.590000
-    vp      0.000000       0.000000
-    vp      1.000000       0.000000
-    vp      0.500000       0.500000
-
-
-
-When vertices are loaded into the Advanced Visualizer, they are
-sequentially numbered, starting with 1. These reference numbers are
-used in element statements.
-
-Syntax
-
-The following syntax statements are listed in order of complexity.
-
-v x y z w
-
-    Polygonal and free-form geometry statement.
-
-    Specifies a geometric vertex and its x y z coordinates. Rational
-    curves and surfaces require a fourth homogeneous coordinate, also
-    called the weight.
-
-    x y z are the x, y, and z coordinates for the vertex. These are
-    floating point numbers that define the position of the vertex in
-    three dimensions.
-
-    w is the weight required for rational curves and surfaces. It is
-    not required for non-rational curves and surfaces. If you do not
-    specify a value for w, the default is 1.0.
-
-    NOTE: A positive weight value is recommended. Using zero or
-    negative values may result in an undefined point in a curve or
-    surface.
-
-vp u v w
-
-    Free-form geometry statement.
-
-    Specifies a point in the parameter space of a curve or surface.
-
-    The usage determines how many coordinates are required. Special
-    points for curves require a 1D control point (u only) in the
-    parameter space of the curve. Special points for surfaces require a
-    2D point (u and v) in the parameter space of the surface. Control
-    points for non-rational trimming curves require u and v
-    coordinates. Control points for rational trimming curves require u,
-    v, and w (weight) coordinates.
-
-    u is the point in the parameter space of a curve or the first
-    coordinate in the parameter space of a surface.
-
-    v is the second coordinate in the parameter space of a surface.
-
-    w is the weight required for rational trimming curves. If you do
-    not specify a value for w, it defaults to 1.0.
-
-    NOTE: For additional information on parameter vertices, see the
-    curv2 and sp statements
-
-vn i j k
-
-    Polygonal and free-form geometry statement.
-
-    Specifies a normal vector with components i, j, and k.
-
-    Vertex normals affect the smooth-shading and rendering of geometry.
-    For polygons, vertex normals are used in place of the actual facet
-    normals.  For surfaces, vertex normals are interpolated over the
-    entire surface and replace the actual analytic surface normal.
-
-    When vertex normals are present, they supersede smoothing groups.
-
-    i j k are the i, j, and k coordinates for the vertex normal. They
-    are floating point numbers.
-
-vt u v w
-
-    Vertex statement for both polygonal and free-form geometry.
-
-    Specifies a texture vertex and its coordinates. A 1D texture
-    requires only u texture coordinates, a 2D texture requires both u
-    and v texture coordinates, and a 3D texture requires all three
-    coordinates.
-
-    u is the value for the horizontal direction of the texture.
-
-    v is an optional argument.
-
-    v is the value for the vertical direction of the texture. The
-    default is 0.
-
-    w is an optional argument.
-
-    w is a value for the depth of the texture. The default is 0.
-
-Specifying free-form curves/surfaces
-
-There are three steps involved in specifying a free-form curve or
-surface element.
-
-o       Specify the type of curve or surface (basis matrix, Bezier,
-	B-spline, Cardinal, or Taylor) using free-form curve/surface
-	attributes.
-
-o       Describe the curve or surface with element statements.
-
-o       Supply additional information, using free-form curve/surface
-	body statements
-
-The next three sections of this appendix provide detailed information
-on each of these steps.
-
-Data requirements for curves and surfaces
-
-All curves and surfaces require a certain set of data. This consists of
-the following:
-
-Free-form curve/surface attributes
-
-o       All curves and surfaces require type data, which is given with
-	the cstype statement.
-
-o       All curves and surfaces require degree data, which is given
-	with the deg statement.
-
-o       Basis matrix curves or surfaces require a bmat statement.
-
-o       Basis matrix curves or surfaces also require a step size, which
-	is given with the step statement.
-
-Elements
-
-o       All curves and surfaces require control points, which are
-	referenced in the curv, curv2, or surf statements.
-
-o       3D curves and surfaces require a parameter range, which is
-	given in the curv and surf statements, respectively.
-
-Free-form curve/surface body statements
-
-o       All curves and surfaces require a set of global parameters or a
-	knot vector, both of which are given with the parm statement.
-
-o       All curves and surfaces body statements require an explicit end
-	statement.
-
-Error checks
-
-The above set of data starts out empty with no default values when
-reading of an .obj file begins. While the file is being read,
-statements are encountered, information is accumulated, and some errors
-may be reported.
-
-When the end statement is encountered, the following error checks,
-which involve consistency between various statements, are performed:
-
-o       All required information is present.
-
-o       The number of control points, number of parameter values
-	(knots), and degree are consistent with the curve or surface
-	type. If the type is bmatrix, the step size is also consistent.
-	(For more information, refer to the parameter vector equations
-	in the section, "Mathematics of free-form curves/ surfaces" at
-	the end of appendix B1.)
-
-o       If the type is bmatrix and the degree is n, the size of the
-	basis matrix is (n + 1) x (n + 1).
-
-Note that any information given by the state-setting statements remains
-in effect from one curve or surface to the next. Information given
-within a curve or surface body is only effective for the curve or
-surface it is given with.
-
-
-
-Free-form curve/surface attributes
-
-Five types of free-form geometry are available in the .obj file
-format:
-
-o       Bezier
-
-o       basis matrix
-
-o       B-spline
-
-o       Cardinal
-
-o       Taylor
-
-You can apply these types only to curves and surfaces. Each of these
-five types can be rational or non-rational.
-
-In addition to specifying the type, you must define the degree for the
-curve or surface. For basis matrix curve and surface elements, you must
-also specify the basis matrix and step size.
-
-All free-form curve and surface attribute statements are state-setting.
-This means that once an attribute statement is set, it applies to all
-elements that follow until it is reset to a different value.
-
-Syntax
-
-The following syntax statements are listed in order of use.
-
-cstype rat type
-
-    Free-form geometry statement.
-
-    Specifies the type of curve or surface and indicates a rational or
-    non-rational form.
-
-    rat is an optional argument.
-
-    rat specifies a rational form for the curve or surface type. If rat
-    is not included, the curve or surface is non-rational
-
-    type specifies the curve or surface type. Allowed types are:
-
-	bmatrix		basis matrix
-
-	bezier		Bezier
-
-	bspline		B-spline
-
-	cardinal        Cardinal
-
-	taylor		Taylor
-
-    There is no default. A value must be supplied.
-
-deg degu degv
-
-    Free-form geometry statement.
-
-    Sets the polynomial degree for curves and surfaces.
-
-    degu is the degree in the u direction. It is required for both
-    curves and surfaces.
-
-    degv is the degree in the v direction. It is required only for
-    surfaces. For Bezier, B-spline, Taylor, and basis matrix, there is
-    no default; a value must be supplied. For Cardinal, the degree is
-    always 3. If some other value is given for Cardinal, it will be
-    ignored.
-
-bmat u matrix
-
-bmat v matrix
-
-    Free-form geometry statement.
-
-    Sets the basis matrices used for basis matrix curves and surfaces.
-    The u and v values must be specified in separate bmat statements.
-
-    NOTE: The deg statement must be given before the bmat statements
-    and the size of the matrix must be appropriate for the degree.
-
-    u specifies that the basis matrix is applied in the u direction.
-
-    v specifies that the basis matrix is applied in the v direction.
-
-    matrix lists the contents of the basis matrix with column subscript
-    j varying the fastest. If n is the degree in the given u or v
-    direction, the matrix (i,j) should be of size (n + 1) x (n + 1).
-
-    There is no default. A value must be supplied.
-
-    NOTE: The arrangement of the matrix is different from that commonly
-    found in other references. For more information, see the examples
-    at the end of this section and also the section, "Mathematics for
-    free-form curves and surfaces."
-
-step stepu stepv
-
-    Free-form geometry statement.
-
-    Sets the step size for curves and surfaces that use a basis
-    matrix.
-
-    stepu is the step size in the u direction. It is required for both
-    curves and surfaces that use a basis matrix.
-
-    stepv is the step size in the v direction. It is required only for
-    surfaces that use a basis matrix. There is no default. A value must
-    be supplied.
-
-    When a curve or surface is being evaluated and a transition from
-    one segment or patch to the next occurs, the set of control points
-    used is incremented by the step size. The appropriate step size
-    depends on the representation type, which is expressed through the
-    basis matrix, and on the degree.
-
-    That is, suppose we are given a curve with k control points:
-			{v , ... v }
-			  1       k
-
-    If the curve is of degree n, then n + 1 control points are needed
-    for each polynomial segment. If the step size is given as s, then
-    the ith polynomial segment, where i = 0 is the first segment, will
-    use the control points:
-			{v    ,...,v      }
-			  is+1      is+n+1
-
-    For example, for Bezier curves, s = n .
-
-    For surfaces, the above description applies independently to each
-    parametric direction.
-
-    When you create a file which uses the basis matrix type, be sure to
-    specify a step size appropriate for the current curve or surface
-    representation.
-
-Examples
-
-1.      Cubic Bezier surface made with a basis matrix
-
-    To create a cubic Bezier surface:
-
-	cstype bmatrix
-	deg 3 3
-	step 3 3
-	bmat u  1       -3      3       -1      \
-		0       3       -6      3       \
-		0       0       3       -3      \
-		0       0       0       1
-	bmat v  1       -3      3       -1      \
-		0       3       -6      3       \
-		0       0       3       -3      \
-		0       0       0       1
-
-2.      Hermite curve made with a basis matrix
-
-    To create a Hermite curve:
-
-	cstype bmatrix
-	deg 3
-	step 2
-	bmat u  1     0     -3      2      0       0       3      -2 \
-		0     1     -2      1      0       0      -1       1
-
-3.      Bezier in u direction with B-spline in v direction;
-	made with a basis matrix
-
-    To create a surface with a cubic Bezier in the u direction and
-    cubic uniform B-spline in the v direction:
-
-	cstype bmatrix
-	deg 3 3
-	step 3 1
-	bmat u  1      -3       3      -1 \
-		0       3      -6       3 \
-		0       0       3      -3 \
-		0       0       0       1
-	bmat v  0.16666 -0.50000  0.50000 -0.16666 \
-		0.66666  0.00000 -1.00000  0.50000 \
-		0.16666  0.50000  0.50000 -0.50000 \
-		0.00000  0.00000  0.00000  0.16666
-
-
-
-Elements
-
-For polygonal geometry, the element types available in the .obj file
-are:
-
-o       points
-
-o       lines
-
-o       faces
-
-For free-form geometry, the element types available in the .obj file
-are:
-
-o       curve
-
-o       2D curve on a surface
-
-o       surface
-
-All elements can be freely intermixed in the file.
-
-Referencing vertex data
-
-For all elements, reference numbers are used to identify geometric
-vertices, texture vertices, vertex normals, and parameter space
-vertices.
-
-Each of these types of vertices is numbered separately, starting with
-1. This means that the first geometric vertex in the file is 1, the
-second is 2, and so on. The first texture vertex in the file is 1, the
-second is 2, and so on. The numbering continues sequentially throughout
-the entire file. Frequently, files have multiple lists of vertex data.
-This numbering sequence continues even when vertex data is separated by
-other data.
-
-In addition to counting vertices down from the top of the first list in
-the file, you can also count vertices back up the list from an
-element's position in the file. When you count up the list from an
-element, the reference numbers are negative. A reference number of -1
-indicates the vertex immediately above the element. A reference number
-of -2 indicates two references above and so on.
-
-Referencing groups of vertices
-
-Some elements, such as faces and surfaces, may have a triplet of
-numbers that reference vertex data.These numbers are the reference
-numbers for a geometric vertex, a texture vertex, and a vertex normal.
-
-Each triplet of numbers specifies a geometric vertex, texture vertex,
-and vertex normal. The reference numbers must be in order and must
-separated by slashes (/).
-
-o       The first reference number is the geometric vertex.
-
-o       The second reference number is the texture vertex. It follows
-	the first slash.
-
-o       The third reference number is the vertex normal. It follows the
-	second slash.
-
-There is no space between numbers and the slashes. There may be more
-than one series of geometric vertex/texture vertex/vertex normal
-numbers on a line.
-
-The following is a portion of a sample file for a four-sided face
-element:
-
-    f 1/1/1 2/2/2 3/3/3 4/4/4
-
-Using v, vt, and vn to represent geometric vertices, texture vertices,
-and vertex normals, the statement would read:
-
-    f v/vt/vn v/vt/vn v/vt/vn v/vt/vn
-
-If there are only vertices and vertex normals for a face element (no
-texture vertices), you would enter two slashes (//). For example, to
-specify only the vertex and vertex normal reference numbers, you would
-enter:
-
-    f 1//1 2//2 3//3 4//4
-
-When you are using a series of triplets, you must be consistent in the
-way you reference the vertex data. For example, it is illegal to give
-vertex normals for some vertices, but not all.
-
-The following is an example of an illegal statement.
-
-    f 1/1/1 2/2/2 3//3 4//4
-
-Syntax
-
-The following syntax statements are listed in order of complexity of
-geometry.
-
-p  v1 v2 v3 . . .
-
-    Polygonal geometry statement.
-
-    Specifies a point element and its vertex. You can specify multiple
-    points with this statement. Although points cannot be shaded or
-    rendered, they are used by other Advanced Visualizer programs.
-
-    v is the vertex reference number for a point element. Each point
-    element requires one vertex. Positive values indicate absolute
-    vertex numbers. Negative values indicate relative vertex numbers.
-
-l  v1/vt1   v2/vt2   v3/vt3 . . .
-
-    Polygonal geometry statement.
-
-    Specifies a line and its vertex reference numbers. You can
-    optionally include the texture vertex reference numbers. Although
-    lines cannot be shaded or rendered, they are used by other Advanced
-    Visualizer programs.
-
-    The reference numbers for the vertices and texture vertices must be
-    separated by a slash (/). There is no space between the number and
-    the slash.
-
-    v is a reference number for a vertex on the line. A minimum of two
-    vertex numbers are required. There is no limit on the maximum.
-    Positive values indicate absolute vertex numbers. Negative values
-    indicate relative vertex numbers.
-
-    vt is an optional argument.
-
-    vt is the reference number for a texture vertex in the line
-    element. It must always follow the first slash.
-
-f  v1/vt1/vn1   v2/vt2/vn2   v3/vt3/vn3 . . .
-
-    Polygonal geometry statement.
-
-    Specifies a face element and its vertex reference number. You can
-    optionally include the texture vertex and vertex normal reference
-    numbers.
-
-    The reference numbers for the vertices, texture vertices, and
-    vertex normals must be separated by slashes (/). There is no space
-    between the number and the slash.
-
-    v is the reference number for a vertex in the face element. A
-    minimum of three vertices are required.
-
-    vt is an optional argument.
-
-    vt is the reference number for a texture vertex in the face
-    element. It always follows the first slash.
-
-    vn is an optional argument.
-
-    vn is the reference number for a vertex normal in the face element.
-    It must always follow the second slash.
-
-    Face elements use surface normals to indicate their orientation. If
-    vertices are ordered counterclockwise around the face, both the
-    face and the normal will point toward the viewer. If the vertex
-    ordering is clockwise, both will point away from the viewer. If
-    vertex normals are assigned, they should point in the general
-    direction of the surface normal, otherwise unpredictable results
-    may occur.
-
-    If a face has a texture map assigned to it and no texture vertices
-    are assigned in the f statement, the texture map is ignored when
-    the element is rendered.
-
-    NOTE: Any references to fo (face outline) are no longer valid as of
-    version 2.11. You can use f (face) to get the same results.
-    References to fo in existing .obj files will still be read,
-    however, they will be written out as f when the file is saved.
-
-curv u0 u1 v1 v2 . . .
-
-    Element statement for free-form geometry.
-
-    Specifies a curve, its parameter range, and its control vertices.
-    Although curves cannot be shaded or rendered, they are used by
-    other Advanced Visualizer programs.
-
-    u0 is the starting parameter value for the curve. This is a
-    floating point number.
-
-    u1 is the ending parameter value for the curve. This is a floating
-    point number.
-
-    v is the vertex reference number for a control point. You can
-    specify multiple control points. A minimum of two control points
-    are required for a curve.
-
-    For a non-rational curve, the control points must be 3D. For a
-    rational curve, the control points are 3D or 4D. The fourth
-    coordinate (weight) defaults to 1.0 if omitted.
-
-curv2  vp1  vp2   vp3. . .
-
-    Free-form geometry statement.
-
-    Specifies a 2D curve on a surface and its control points. A 2D
-    curve is used as an outer or inner trimming curve, as a special
-    curve, or for connectivity.
-
-    vp is the parameter vertex reference number for the control point.
-    You can specify multiple control points. A minimum of two control
-    points is required for a 2D curve.
-
-    The control points are parameter vertices because the curve must
-    lie in the parameter space of some surface. For a non-rational
-    curve, the control vertices can be 2D. For a rational curve, the
-    control vertices can be 2D or 3D. The third coordinate (weight)
-    defaults to 1.0 if omitted.
-
-surf  s0  s1  t0  t1  v1/vt1/vn1   v2/vt2/vn2 . . .
-
-    Element statement for free-form geometry.
-
-    Specifies a surface, its parameter range, and its control vertices.
-    The surface is evaluated within the global parameter range from s0
-    to s1 in the u direction and t0 to t1 in the v direction.
-
-    s0 is the starting parameter value for the surface in the u
-    direction.
-
-    s1 is the ending parameter value for the surface in the u
-    direction.
-
-    t0 is the starting parameter value for the surface in the v
-    direction.
-
-    t1 is the ending parameter value for the surface in the v
-    direction.
-
-    v is the reference number for a control vertex in the surface.
-
-    vt is an optional argument.
-
-    vt is the reference number for a texture vertex in the surface.  It
-    must always follow the first slash.
-
-    vn is an optional argument.
-
-    vn is the reference number for a vertex normal in the surface.  It
-    must always follow the second slash.
-
-    For a non-rational surface, the control vertices are 3D.  For a
-    rational surface the control vertices can be 3D or 4D.  The fourth
-    coordinate (weight) defaults to 1.0 if ommitted.
-
-    NOTE: For more information on the ordering of control points for
-    survaces, refer to the section on surfaces and control points in
-    "mathematics of free-form curves/surfaces" at the end of this
-    appendix.
-
-
-
-
-Examples
-
-These are examples for polygonal geometry.
-
-For examples using free-form geometry, see the examples at the end of
-the next section, "Free-form curve/surface body statements."
-
-1.	Square
-
-This example shows a square that measures two units on each side and
-faces in the positive direction (toward the camera).  Note that the
-ordering of the vertices is counterclockwise. This ordering determines
-that the square is facing forward.
-
-    v 0.000000 2.000000 0.000000
-    v 0.000000 0.000000 0.000000
-    v 2.000000 0.000000 0.000000
-    v 2.000000 2.000000 0.000000
-    f 1 2 3 4
-
-2.      Cube
-
-This is a cube that measures two units on each side. Each vertex is
-shared by three different faces.
-
-    v 0.000000 2.000000 2.000000
-    v 0.000000 0.000000 2.000000
-    v 2.000000 0.000000 2.000000
-    v 2.000000 2.000000 2.000000
-    v 0.000000 2.000000 0.000000
-    v 0.000000 0.000000 0.000000
-    v 2.000000 0.000000 0.000000
-    v 2.000000 2.000000 0.000000
-    f 1 2 3 4
-    f 8 7 6 5
-    f 4 3 7 8
-    f 5 1 4 8
-    f 5 6 2 1
-    f 2 6 7 3
-
-3.      Cube with negative reference numbers
-
-This is a cube with negative vertex reference numbers. Each element
-references the vertices stored immediately above it in the file. Note
-that vertices are not shared.
-
-v 0.000000 2.000000 2.000000
-v 0.000000 0.000000 2.000000
-v 2.000000 0.000000 2.000000
-v 2.000000 2.000000 2.000000
-f -4 -3 -2 -1
-
-v 2.000000 2.000000 0.000000
-v 2.000000 0.000000 0.000000
-v 0.000000 0.000000 0.000000
-v 0.000000 2.000000 0.000000
-f -4 -3 -2 -1
-
-v 2.000000 2.000000 2.000000
-v 2.000000 0.000000 2.000000
-v 2.000000 0.000000 0.000000
-v 2.000000 2.000000 0.000000
-f -4 -3 -2 -1
-
-v 0.000000 2.000000 0.000000
-v 0.000000 2.000000 2.000000
-v 2.000000 2.000000 2.000000
-v 2.000000 2.000000 0.000000
-f -4 -3 -2 -1
-
-v 0.000000 2.000000 0.000000
-v 0.000000 0.000000 0.000000
-v 0.000000 0.000000 2.000000
-v 0.000000 2.000000 2.000000
-f -4 -3 -2 -1
-
-v 0.000000 0.000000 2.000000
-v 0.000000 0.000000 0.000000
-v 2.000000 0.000000 0.000000
-v 2.000000 0.000000 2.000000
-f -4 -3 -2 -1
-
-
-
-Free-form curve/surface body statements
-
-You can specify additional information for free-form curve and surface
-elements using a series of statements called body statements. The
-series is concluded by an end statement.
-
-Body statements are valid only when they appear between the free-form
-element statement (curv, curv2, surf) and the end statement. If they
-are anywhere else in the .obj file, they do not have any effect.
-
-You can use body statements to specify the following values:
-
-o       parameter
-
-o       knot vector
-
-o       trimming loop
-
-o       hole
-
-o       special curve
-
-o       special point
-
-You cannot use any other statements between the free-form curve or
-surface statement and the end statement. Using any other of type of
-statement may cause unpredictable results.
-
-This portion of a sample file shows the knot vector values for a
-rational B-spline surface with a trimming loop. Notice the end
-statement to conclude the body statements.
-
-    cstype rat bspline
-    deg 2 2
-    surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1
-    parm u -1.00 -1.00 -1.00 2.50 2.50 2.50
-    parm v -2.00 -2.00 -2.00 -2.00 -2.00 -2.00
-    trim 0.0 2.0 1
-    end
-
-Parameter values and knot vectors
-
-All curve and surface elements require a set of parameter values.
-
-For polynomial curves and surfaces, this specifies global parameter
-values. For B-spline curves and surfaces, this specifies the knot
-vectors.
-
-For surfaces, the parameter values must be specified for both the u and
-v directions. For curves, the parameter values must be specified for
-only the u direction.
-
-If multiple parameter value statements for the same parametric
-direction are used inside a single curve or surface body, the last
-statement is used.
-
-Trimming loops and holes
-
-The trimming loop statement builds a single outer trimming loop as a
-sequence of curves which lie on a given surface.
-
-The hole statement builds a single inner trimming loop as a sequence of
-curves which lie on a given surface. The inner loop creates a hole.
-
-The curves are referenced by number in the same way vertices are
-referenced by face elements.
-
-The individual curves must lie end-to-end to form a closed loop which
-does not intersect itself and which lies within the parameter range
-specified for the surface. The loop as a whole may be oriented in
-either direction (clockwise or counterclockwise).
-
-To cut one or more holes in a region, use a trim statement followed by
-one or more hole statements. To introduce another trimmed region in the
-same surface, use another trim statement followed by one or more hole
-statements. The ordering that associates holes and the regions they cut
-is important and must be maintained.
-
-If the first trim statement in the sequence is omitted, the enclosing
-outer trimming loop is taken to be the parameter range of the surface.
-If no trim or hole statements are specified, then the surface is
-trimmed at its parameter range.
-
-This portion of a sample file shows a non-rational Bezier surface with
-two regions, each with a single hole:
-
-    cstype bezier
-    deg 1 1
-    surf 0.0 2.0 0.0 2.0 1 2 3 4
-    parm u 0.00 2.00
-    parm v 0.00 2.00
-    trim 0.0 4.0 1
-    hole 0.0 4.0 2
-    trim 0.0 4.0 3
-    hole 0.0 4.0 4
-    end
-
-Special curve
-
-A special curve statement builds a single special curve as a sequence
-of curves which lie on a given surface.
-
-The curves are referenced by number in the same way vertices are
-referenced by face elements.
-
-A special curve is guaranteed to be included in any triangulation of
-the surface. This means that the line formed by approximating the
-special curve with a sequence of straight line segments will actually
-appear as a sequence of triangle edges in the final triangulation.
-
-Special point
-
-A special point statement specifies that special geometric points are
-to be associated with a curve or surface. For space curves and trimming
-curves, the parameter vertices must be 1D. For surfaces, the parameter
-vertices must be 2D.
-
-These special points will be included in any linear approximation of
-the curve or surface.
-
-For space curves, this means that the point corresponding to the given
-curve parameter is included as one of the vertices in an approximation
-consisting of a sequence of line segments.
-
-For surfaces, this means that the point corresponding to the given
-surface parameters is included as a triangle vertex in the
-triangulation.
-
-For trimming curves, the treatment is slightly different: a special
-point on a trimming curve is essentially the same as a special point on
-the surface it trims.
-
-The following portion of a sample files shows special points for a
-rational Bezier 2D curve on a surface.
-
-    vp -0.675  1.850  3.000
-    vp  0.915  1.930
-    vp  2.485  0.470  2.000
-    vp  2.485 -1.030
-    vp  1.605 -1.890 10.700
-    vp -0.745 -0.654  0.500
-    cstype rat bezier
-    curv2 -6 -5 -4 -3 -2 -1 -6
-    parm u 0.00 1.00 2.00
-    sp 2 3
-    end
-
-Syntax
-
-The following syntax statement are listed in order of normal use.
-
-parm u p1 p2 p3. . .
-
-parm v p1 p2 p3 . . .
-
-    Body statement for free-form geometry.
-
-    Specifies global parameter values. For B-spline curves and
-    surfaces, this specifies the knot vectors.
-
-    u is the u direction for the parameter values.
-
-    v is the v direction for the parameter values.
-
-    To set u and v values, use separate command lines.
-
-    p is the global parameter or knot value. You can specify multiple
-    values. A minimum of two parameter values are required. Parameter
-    values must increase monotonically. The type of surface and the
-    degree dictate the number of values required.
-
-trim  u0  u1  curv2d  u0  u1  curv2d . . .
-
-    Body statement for free-form geometry.
-
-    Specifies a sequence of curves to build a single outer trimming
-    loop.
-
-    u0 is the starting parameter value for the trimming curve curv2d.
-
-    u1 is the ending parameter value for the trimming curve curv2d.
-
-    curv2d is the index of the trimming curve lying in the parameter
-    space of the surface. This curve must have been previously defined
-    with the curv2 statement.
-
-hole  u0  u1  curv2d  u0  u1  curv2d . . .
-
-    Body statement for free-form geometry.
-
-    Specifies a sequence of curves to build a single inner trimming
-    loop (hole).
-
-    u0 is the starting parameter value for the trimming curve curv2d.
-
-    u1 is the ending parameter value for the trimming curve curv2d.
-
-    curv2d is the index of the trimming curve lying in the parameter
-    space of the surface. This curve must have been previously defined
-    with the curv2 statement.
-
-scrv u0 u1 curv2d u0 u1 curv2d . . .
-
-    Body statement for free-form geometry.
-
-    Specifies a sequence of curves which lie on the given surface to
-    build a single special curve.
-
-    u0 is the starting parameter value for the special curve curv2d.
-
-    u1 is the ending parameter value for the special curve curv2d.
-
-    curv2d is the index of the special curve lying in the parameter
-    space of the surface. This curve must have been previously defined
-    with the curv2 statement.
-
-sp vp1  vp. . .
-
-    Body statement for free-form geometry.
-
-    Specifies special geometric points to be associated with a curve or
-    surface. For space curves and trimming curves, the parameter
-    vertices must be 1D. For surfaces, the parameter vertices must be
-    2D.
-
-    vp is the reference number for the parameter vertex of a special
-    point to be associated with the parameter space point of the curve
-    or surface.
-
-end
-
-    Body statement for free-form geometry.
-
-    Specifies the end of a curve or surface body begun by a curv,
-    curv2, or surf statement.
-
-Examples
-
-1.      Taylor curve
-
-    For creating a single-segment Taylor polynomial curve of the form:
-
-                                   2         3         4
-	x =  3.00 +  2.30t +  7.98t  +  8.30t  +  6.34t 
-
-                                   2         3         4
-	y =  1.00 - 10.10t +  5.40t  -  4.70t  +  2.03t 
-
-                                   2         3         4
-	z = -2.50 +  0.50t -  7.00t  + 18.10t  +  0.08t 
-
-
-and evaluated between the global parameters 0.5 and 1.6:
-
-	v       3.000    1.000   -2.500
-	v       2.300  -10.100    0.500
-	v       7.980    5.400   -7.000
-	v       8.300   -4.700   18.100
-	v       6.340    2.030    0.080
-	cstype taylor
-	deg 4
-	curv 0.500 1.600 1 2 3 4 5
-	parm u 0.000 2.000
-	end
-
-2.      Bezier curve
-
-This example shows a non-rational Bezier curve with 13 control points.
-
-    v -2.300000 1.950000 0.000000
-    v -2.200000 0.790000 0.000000
-    v -2.340000 -1.510000 0.000000
-    v -1.530000 -1.490000 0.000000
-    v -0.720000 -1.470000 0.000000
-    v -0.780000 0.230000 0.000000
-    v 0.070000 0.250000 0.000000
-    v 0.920000 0.270000 0.000000
-    v 0.800000 -1.610000 0.000000
-    v 1.620000 -1.590000 0.000000
-    v 2.440000 -1.570000 0.000000
-    v 2.690000 0.670000 0.000000
-    v 2.900000 1.980000 0.000000
-    # 13 vertices
-
-    cstype bezier
-    ctech cparm 1.000000
-    deg 3
-    curv 0.000000 4.000000 1 2 3 4 5 6 7 8 9 10 \
-    11 12 13
-    parm u 0.000000 1.000000 2.000000 3.000000  \
-    4.000000
-    end
-    # 1 element
-
-
-
-3.      B-spline surface
-
-This is an example of a cubic B-spline surface.
-
-    g bspatch
-    v -5.000000 -5.000000 -7.808327
-    v -5.000000 -1.666667 -7.808327
-    v -5.000000 1.666667 -7.808327
-    v -5.000000 5.000000 -7.808327
-    v -1.666667 -5.000000 -7.808327
-    v -1.666667 -1.666667 11.977780
-    v -1.666667 1.666667 11.977780
-    v -1.666667 5.000000 -7.808327
-    v 1.666667 -5.000000 -7.808327
-    v 1.666667 -1.666667 11.977780
-    v 1.666667 1.666667 11.977780
-    v 1.666667 5.000000 -7.808327
-    v 5.000000 -5.000000 -7.808327
-    v 5.000000 -1.666667 -7.808327
-    v 5.000000 1.666667 -7.808327
-    v 5.000000 5.000000 -7.808327
-    # 16 vertices
-
-    cstype bspline
-    stech curv 0.5 10.000000
-    deg 3 3
-    8surf 0.000000 1.000000 0.000000 1.000000 13 14 \ 15 16 9 10 11 12 5 6
-    7 8 1 2 3 4
-    parm u -3.000000 -2.000000 -1.000000 0.000000  \
-    1.000000 2.000000 3.000000 4.000000
-    parm v -3.000000 -2.000000 -1.000000 0.000000  \
-    1.000000 2.000000 3.000000 4.000000
-    end
-    # 1 element
-
-
-4.      Cardinal surface
-
-This example shows a Cardinal surface.
-
-    v -5.000000 -5.000000 0.000000
-    v -5.000000 -1.666667 0.000000
-    v -5.000000 1.666667 0.000000
-    v -5.000000 5.000000 0.000000
-    v -1.666667 -5.000000 0.000000
-    v -1.666667 -1.666667 0.000000
-    v -1.666667 1.666667 0.000000
-    v -1.666667 5.000000 0.000000
-    v 1.666667 -5.000000 0.000000
-    v 1.666667 -1.666667 0.000000
-    v 1.666667 1.666667 0.000000
-    v 1.666667 5.000000 0.000000
-    v 5.000000 -5.000000 0.000000
-    v 5.000000 -1.666667 0.000000
-    v 5.000000 1.666667 0.000000
-    v 5.000000 5.000000 0.000000
-    # 16 vertices
-
-    cstype cardinal
-    stech cparma 1.000000 1.000000
-    deg 3 3
-    surf 0.000000 1.000000 0.000000 1.000000 13 14 \
-    15 16 9 10 11 12 5 6 7 8 1 2 3 4
-    parm u 0.000000 1.000000
-    parm v 0.000000 1.000000
-    end
-    # 1 element
-
-
-5.      Rational B-spline surface
-
-This example creates a second-degree, rational B-spline surface using
-open, uniform knot vectors. A texture map is applied to the surface.
-
-    v -1.3 -1.0  0.0
-    v  0.1 -1.0  0.4  7.6
-    v  1.4 -1.0  0.0  2.3
-    v -1.4  0.0  0.2
-    v  0.1  0.0  0.9  0.5
-    v  1.3  0.0  0.4  1.5
-    v -1.4  1.0  0.0  2.3
-    v  0.1  1.0  0.3  6.1
-    v  1.1  1.0  0.0  3.3
-    vt 0.0  0.0
-    vt 0.5  0.0
-    vt 1.0  0.0
-    vt 0.0  0.5
-    vt 0.5  0.5
-    vt 1.0  0.5
-    vt 0.0  1.0
-    vt 0.5  1.0
-    vt 1.0  1.0
-    cstype rat bspline
-    deg 2 2
-    surf 0.0 1.0 0.0 1.0 1/1 2/2 3/3 4/4 5/5 6/6 \
-    7/7 8/8 9/9
-    parm u 0.0 0.0 0.0 1.0 1.0 1.0
-    parm v 0.0 0.0 0.0 1.0 1.0 1.0
-    end
-
-
-6.      Trimmed NURB surface
-
-This is a complete example of a file containing a trimmed NURB surface
-with negative reference numbers for vertices.
-
-    # trimming curve
-    vp -0.675  1.850  3.000
-    vp  0.915  1.930
-    vp  2.485  0.470  2.000
-    vp  2.485 -1.030
-    vp  1.605 -1.890 10.700
-    vp -0.745 -0.654  0.500
-    cstype rat bezier
-    deg 3
-    curv2 -6 -5 -4 -3 -2 -1 -6
-    parm u 0.00 1.00 2.00
-    end
-    # surface
-    v -1.350 -1.030 0.000
-    v  0.130 -1.030 0.432 7.600
-    v  1.480 -1.030 0.000 2.300
-    v -1.460  0.060 0.201
-    v  0.120  0.060 0.915 0.500
-    v  1.380  0.060 0.454 1.500
-    v -1.480  1.030 0.000 2.300
-    v  0.120  1.030 0.394 6.100
-    v  1.170  1.030 0.000 3.300
-    cstype rat bspline
-    deg 2 2
-    surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1
-    parm u -1.00 -1.00 -1.00 2.50 2.50 2.50
-    parm v -2.00 -2.00 -2.00 -2.00 -2.00 -2.00
-    trim 0.0 2.0 1
-    end
-
-
-7.      Two trimming regions with a hole
-
-This example shows a Bezier surface with two trimming regions, each
-with a hole in them.
-
-    # outer loop of first region
-    deg 1
-    cstype bezier
-    vp 0.100 0.100
-    vp 0.900 0.100
-    vp 0.900 0.900
-    vp 0.100 0.900
-    curv2 1 2 3 4 1
-    parm u 0.00 1.00 2.00 3.00 4.00
-    end
-    # hole in first region
-    vp 0.300 0.300
-    vp 0.700 0.300
-    vp 0.700 0.700
-    vp 0.300 0.700
-    curv2 5 6 7 8 5
-    parm u 0.00 1.00 2.00 3.00 4.00
-    end
-    # outer loop of second region
-    vp 1.100 1.100
-    vp 1.900 1.100
-    vp 1.900 1.900
-    vp 1.100 1.900
-    curv2 9 10 11 12 9
-    parm u 0.00 1.00 2.00 3.00 4.00
-    end
-    # hole in second region
-    vp 1.300 1.300
-    vp 1.700 1.300
-    vp 1.700 1.700
-    vp 1.300 1.700
-    curv2 13 14 15 16 13
-    parm u 0.00 1.00 2.00 3.00 4.00
-    end
-    # surface
-    v 0.000 0.000 0.000
-    v 1.000 0.000 0.000
-    v 0.000 1.000 0.000
-    v 1.000 1.000 0.000
-    deg 1 1
-    cstype bezier
-    surf 0.0 2.0 0.0 2.0 1 2 3 4
-    parm u 0.00 2.00
-    parm v 0.00 2.00
-    trim 0.0 4.0 1
-    hole 0.0 4.0 2
-    trim 0.0 4.0 3
-    hole 0.0 4.0 4
-    end
-
-
-8.      Trimming with a special curve
-This example is similar to the trimmed NURB surface example (6), except
-there is a special curve on the surface. This example uses negative
-vertex numbers.
-
-    # trimming curve
-    vp -0.675  1.850  3.000
-    vp  0.915  1.930
-    vp  2.485  0.470  2.000
-    vp  2.485 -1.030
-    vp  1.605 -1.890 10.700
-    vp -0.745 -0.654  0.500
-    cstype rat bezier
-    deg 3
-    curv2 -6 -5 -4 -3 -2 -1 -6
-    parm u 0.00 1.00 2.00
-    end
-    # special curve
-    vp -0.185  0.322
-    vp  0.214  0.818
-    vp  1.652  0.207
-    vp  1.652 -0.455
-    curv2 -4 -3 -2 -1
-    parm u 2.00 10.00
-    end
-    # surface
-    v -1.350 -1.030 0.000
-    v  0.130 -1.030 0.432 7.600
-    v  1.480 -1.030 0.000 2.300
-    v -1.460  0.060 0.201
-    v  0.120  0.060 0.915 0.500
-    v  1.380  0.060 0.454 1.500
-    v -1.480  1.030 0.000 2.300
-    v  0.120  1.030 0.394 6.100
-    v  1.170  1.030 0.000 3.300
-    cstype rat bspline
-    deg 2 2
-    surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1
-    parm u -1.00 -1.00 -1.00 2.50 2.50 2.50
-    parm v -2.00 -2.00 -2.00 2.00 2.00 2.00
-    trim 0.0 2.0 1
-    scrv 4.2 9.7 2
-    end
-
-
-9.      Trimming with special points
-
-This example extends the trimmed NURB surface example (6) to include
-special points on both the trimming curve and surface. A space curve
-with a special point is also included. This example uses negative
-vertex numbers.
-
-    # special point and space curve data
-    vp 0.500
-    vp 0.700
-    vp 1.100
-    vp 0.200 0.950
-    v  0.300 1.500 0.100
-    v  0.000  0.000  0.000
-    v  1.000  1.000  0.000
-    v  2.000  1.000  0.000
-    v  3.000  0.000  0.000
-    cstype bezier
-    deg 3
-    curv 0.2 0.9 -4 -3 -2 -1
-    sp 1
-    parm u 0.00 1.00
-    end
-    # trimming curve
-    vp -0.675  1.850  3.000
-    vp  0.915  1.930
-    vp  2.485  0.470  2.000
-    vp  2.485 -1.030
-    vp  1.605 -1.890 10.700
-    vp -0.745 -0.654  0.500
-    cstype rat bezier
-    curv2 -6 -5 -4 -3 -2 -1 -6
-    parm u 0.00 1.00 2.00
-    sp 2 3
-    end
-    # surface
-    v -1.350 -1.030 0.000
-    v  0.130 -1.030 0.432 7.600
-    v  1.480 -1.030 0.000 2.300
-    v -1.460  0.060 0.201
-    v  0.120  0.060 0.915 0.500
-    v  1.380  0.060 0.454 1.500
-    v -1.480  1.030 0.000 2.300
-    v  0.120  1.030 0.394 6.100
-    v  1.170  1.030 0.000 3.300
-    cstype rat bspline
-    deg 2 2
-    surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1
-    parm u -1.00 -1.00 -1.00 2.50 2.50 2.50
-    parm v -2.00 -2.00 -2.00 2.00 2.00 2.00
-    trim 0.0 2.0 1
-    sp 4
-    end
-
-Connectivity between free-form surfaces
-
-Connectivity connects two surfaces along their trimming curves.
-
-The con statement specifies the first surface with its trimming curve
-and the second surface with its trimming curve. This information is
-useful for edge merging. Without this surface and curve data,
-connectivity must be determined numerically at greater expense and with
-reduced accuracy using the mg statement.
-
-Connectivity between surfaces in different merging groups is ignored.
-Also, although connectivity which crosses points of C1discontinuity in
-trimming curves is legal, it is not recommended. Instead, use two
-connectivity statements which meet at the point of discontinuity.
-
-The two curves and their starting and ending parameters should all map
-to the same curve and starting and ending points in object space.
-
-Syntax
-
-con  surf_1  q0_1  q1_1   curv2d_1   surf_2  q0_2  q1_2  curv2d_2
-
-    Free-form geometry statement.
-
-    Specifies connectivity between two surfaces.
-
-    surf_1 is the index of the first surface.
-
-    q0_1 is the starting parameter for the curve referenced by
-    curv2d_1.
-
-    q1_1 is the ending parameter for the curve referenced by curv2d_1.
-
-    curv2d_1 is the index of a curve on the first surface. This curve
-    must have been previously defined with the curv2 statement.
-
-    surf_2 is the index of the second surface.
-
-    q0_2 is the starting parameter for the curve referenced by
-    curv2d_2.
-
-    q1_2 is the ending parameter for the curve referenced by curv2d_2.
-
-    curv2d_2 is the index of a curve on the second surface. This curve
-    must have been previously defined with the curv2 statement.
-
-Example
-
-1.      Connectivity between two surfaces
-
-This example shows the connectivity between two surfaces with trimming
-curves.
-
-    cstype bezier
-    deg 1 1
-
-    v 0 0 0
-    v 1 0 0
-    v 0 1 0
-    v 1 1 0
-
-    vp 0 0
-    vp 1 0
-    vp 1 1
-    vp 0 1
-
-    curv2 1 2 3 4 1
-    parm u 0.0 1.0 2.0 3.0 4.0
-    end
-
-    surf 0.0 1.0 0.0 1.0 1 2 3 4
-    parm u 0.0 1.0
-    parm v 0.0 1.0
-    trim 0.0 4.0 1
-    end
-
-    v 1 0 0
-    v 2 0 0
-    v 1 1 0
-    v 2 1 0
-
-    surf 0.0 1.0 0.0 1.0 5 6 7 8
-    parm u 0.0 1.0
-    parm v 0.0 1.0
-    trim 0.0 4.0 1
-    end
-
-    con 1 2.0 2.0 1 2 4.0 3.0 1
-
-
-Grouping
-
-There are four statements in the .obj file to help you manipulate groups
-of elements:
-
-o	Gropu name statements are used to organize collections of
-	elements and simplify data manipulation for operations in
-	Model.
-
-o	Smoothing group statements let you identify elements over which
-	normals are to be interpolated to give those elements a smooth,
-	non-faceted appearance.  This is a quick way to specify vertex
-	normals.
-
-o	Merging group statements are used to ideneify free-form elements
-	that should be inspected for adjacency detection.  You can also
-	use merging groups to exclude surfaces which are close enough to
-	be considered adjacent but should not be merged.
-
-o	Object name statements let you assign a name to an entire object
-	in a single file.
-
-All grouping statements are state-setting.  This means that once a
-group statement is set, it alpplies to all elements that follow
-until the next group statement.
-
-This portion of a sample file shows a single element which belongs to
-three groups.  The smoothing group is turned off.
-
-    g square thing all
-    s off
-    f 1 2 3 4
-
-This example shows two surfaces in merging group 1 with a merge
-resolution of 0.5.
-
-    mg 1 .5
-    surf 0.0 1.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-    surf 0.0 1.0 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
-
-Syntax
-
-g group_name1 group_name2 . . .
-
-    Polygonal and free-form geometry statement.
-
-    Specifies the group name for the elements that follow it. You can
-    have multiple group names. If there are multiple groups on one
-    line, the data that follows belong to all groups. Group information
-    is optional.
-
-    group_name is the name for the group. Letters, numbers, and
-    combinations of letters and numbers are accepted for group names.
-    The default group name is default.
-
-s group_number
-
-    Polygonal and free-form geometry statement.
-
-    Sets the smoothing group for the elements that follow it. If you do
-    not want to use a smoothing group, specify off or a value of 0.
-
-    To display with smooth shading in Model and PreView, you must
-    create vertex normals after you have assigned the smoothing groups.
-    You can create vertex normals with the vn statement or with the
-    Model program.
-
-    To smooth polygonal geometry for rendering with Image, it is
-    sufficient to put elements in some smoothing group. However, vertex
-    normals override smoothing information for Image.
-
-    group_number is the smoothing group number. To turn off smoothing
-    groups, use a value of 0 or off. Polygonal elements use group
-    numbers to put elements in different smoothing groups. For
-    free-form surfaces, smoothing groups are either turned on or off;
-    there is no difference between values greater than 0.
-
-mg group_number res
-
-    Free-form geometry statement.
-
-    Sets the merging group and merge resolution for the free-form
-    surfaces that follow it. If you do not want to use a merging group,
-    specify off or a value of 0.
-
-    Adjacency detection is performed only within groups, never between
-    groups. Connectivity between surfaces in different merging groups
-    is not allowed. Surfaces in the same merging group are merged
-    together along edges that are within the distance res apart.
-
-    NOTE: Adjacency detection is an expensive numerical comparison
-    process.  It is best to restrict this process to as small a domain
-    as possible by using small merging groups.
-
-    group_number is the merging group number. To turn off adjacency
-    detection, use a value of 0 or off.
-
-    res is the maximum distance between two surfaces that will be
-    merged together. The resolution must be a value greater than 0.
-    This is a required argument only when using merging groups.
-
-o object_name
-
-    Polygonal and free-form geometry statement.
-
-    Optional statement; it is not processed by any Wavefront programs.
-    It specifies a user-defined object name for the elements defined
-    after this statement.
-
-    object_name is the user-defined object name. There is no default.
-
-Examples
-
-1.      Cube with group names
-
-The following example is a cube with each of its faces placed in a
-separate group. In addition, all elements belong to the group cube.
-
-    v 0.000000 2.000000 2.000000
-    v 0.000000 0.000000 2.000000
-    v 2.000000 0.000000 2.000000
-    v 2.000000 2.000000 2.000000
-    v 0.000000 2.000000 0.000000
-    v 0.000000 0.000000 0.000000
-    v 2.000000 0.000000 0.000000
-    v 2.000000 2.000000 0.000000
-    # 8 vertices
-
-    g front cube
-    f 1 2 3 4
-    g back cube
-    f 8 7 6 5
-    g right cube
-    f 4 3 7 8
-    g top cube
-    f 5 1 4 8
-    g left cube
-    f 5 6 2 1
-    g bottom cube
-    f 2 6 7 3
-    # 6 elements
-
-
-2.      Two adjoining squares with a smoothing group
-
-This example shows two adjoining squares that share a common edge. The
-squares are placed in a smoothing group to ensure that their common
-edge will be smoothed when rendered with Image.
-
-    v 0.000000 2.000000 0.000000
-    v 0.000000 0.000000 0.000000
-    v 2.000000 0.000000 0.000000
-    v 2.000000 2.000000 0.000000
-    v 4.000000 0.000000 -1.255298
-    v 4.000000 2.000000 -1.255298
-    # 6 vertices
-
-    g all
-    s 1
-    f 1 2 3 4
-    f 4 3 5 6
-    # 2 elements
-
-
-3.      Two adjoining squares with vertex normals
-
-This example also shows two squares that share a common edge. Vertex
-normals have been added to the corners of each square to ensure that
-their common edge will be smoothed during display in Model and PreView
-and when rendered with Image.
-
-    v 0.000000 2.000000 0.000000
-    v 0.000000 0.000000 0.000000
-    v 2.000000 0.000000 0.000000
-    v 2.000000 2.000000 0.000000
-    v 4.000000 0.000000 -1.255298
-    v 4.000000 2.000000 -1.255298
-    vn 0.000000 0.000000 1.000000
-    vn 0.000000 0.000000 1.000000
-    vn 0.276597 0.000000 0.960986
-    vn 0.276597 0.000000 0.960986
-    vn 0.531611 0.000000 0.846988
-    vn 0.531611 0.000000 0.846988
-    # 6 vertices
-
-    # 6 normals
-
-    g all
-    s 1
-    f 1//1 2//2 3//3 4//4
-    f 4//4 3//3 5//5 6//6
-    # 2 elements
-
-
-4.      Merging group
-
-This example shows two Bezier surfaces that meet at a common edge. They
-have both been placed in the same merging group to ensure continuity at
-the edge where they meet. This prevents "cracks" from appearing along
-the seam between the two surfaces during rendering. Merging groups will
-be ignored during flat-shading, smooth-shading, and material shading of
-the surface.
-
-    v -4.949854 -5.000000 0.000000
-    v -4.949854 -1.666667 0.000000
-    v -4.949854 1.666667 0.000000
-    v -4.949854 5.000000 0.000000
-    v -1.616521 -5.000000 0.000000
-    v -1.616521 -1.666667 0.000000
-    v -1.616521 1.666667 0.000000
-    v -1.616521 5.000000 0.000000
-    v 1.716813 -5.000000 0.000000
-    v 1.716813 -1.666667 0.000000
-    v 1.716813 1.666667 0.000000
-    v 1.716813 5.000000 0.000000
-    v 5.050146 -5.000000 0.000000
-    v 5.050146 -1.666667 0.000000
-    v 5.050146 1.666667 0.000000
-    v 5.050146 5.000000 0.000000
-    v -15.015566 -4.974991 0.000000
-    v -15.015566 -1.641658 0.000000
-    v -15.015566 1.691675 0.000000
-    v -15.015566 5.025009 0.000000
-    v -11.682233 -4.974991 0.000000
-    v -11.682233 -1.641658 0.000000
-    v -11.682233 1.691675 0.000000
-    v -11.682233 5.025009 0.000000
-    v -8.348900 -4.974991 0.000000
-    v -8.348900 -1.641658 0.000000
-    v -8.348900 1.691675 0.000000
-    v -8.348900 5.025009 0.000000
-    v -5.015566 -4.974991 0.000000
-    v -5.015566 -1.641658 0.000000
-    v -5.015566 1.691675 0.000000
-    v -5.015566 5.025009 0.000000
-
-    mg 1 0.500000
-
-    cstype bezier
-    deg 3 3
-    surf 0.000000 1.000000 0.000000 1.000000 13 14 \
-    15 16 9 10 11 12 5 6 7 8 1 2 3 4
-    parm u 0.000000 1.000000
-    parm v 0.000000 1.000000
-    end
-    surf 0.000000 1.000000 0.000000 1.000000 29 30 31 32 25 26 27 28 21 22 \
-    23 24 17 18 19 20
-    parm u 0.000000 1.000000
-    parm v 0.000000 1.000000
-    end
-
-
-Display/render attributes
-
-Display and render attributes describe how an object looks when
-displayed in Model and PreView or when rendered with Image.
-
-Some attributes apply to both free-form and polygonal geometry, such as
-material name and library, ray tracing, and shadow casting.
-Interpolation attributes apply only to polygonal geometry. Curve and
-surface resolutions are used for only free-form geometry.
-
-The following chart shows the display and render statements available
-for polygonal and free-form geometry.
-
-Table B1-1.     Display and render attributes
-
-polygonal only		polygonal or free-form	free-form only
---------------		----------------------	--------------
-bevel			lod			ctech
-c_interp		usemtl			stech
-d_interp		mtllib
-			shadow_obj
-			trace_obj
-
-All display and render attribute statements are state-setting. This
-means that once an attribute statement is set, it applies to all
-elements that follow until it is reset to a different value.
-
-The following sample shows rendering and display statements for a face
-element.:
-
-    s 1
-    usemtl blue
-    usemap marble
-    f 1 2 3 4
-
-Syntax
-
-The following syntax statements are listed by the type of geometry.
-First are statements for polygonal geometry. Second are statements for
-both free-form and polygonal geometry. Third are statements for
-free-form geometry only.
-
-bevel on/off
-
-    Polygonal geometry statement.
-
-    Sets bevel interpolation on or off. It works only with beveled
-    objects, that is, objects with sides separated by beveled faces.
-
-    Bevel interpolation uses normal vector interpolation to give an
-    illusion of roundness to a flat bevel. It does not affect the
-    smoothing of non-bevelled faces.
-
-    Bevel interpolation does not alter the geometry of the original
-    object.
-
-    on turns on bevel interpolation.
-
-    off turns off bevel interpolation. The default is off.
-
-    NOTE: Image cannot render bevel-interpolated elements that have
-    vertex normals.
-
-c_interp on/off
-
-    Polygonal geometry statement.
-
-    Sets color interpolation on or off.
-
-    Color interpolation creates a blend across the surface of a polygon
-    between the materials assigned to its vertices. This creates a
-    blending of colors across a face element.
-
-    To support color interpolation, materials must be assigned per
-    vertex, not per element. The illumination models for all materials
-    of vertices attached to the polygon must be the same. Color
-    interpolation applies to the values for ambient (Ka), diffuse (Kd),
-    specular (Ks), and specular highlight (Ns) material properties.
-
-    on turns on color interpolation.
-
-    off turns off color interpolation. The default is off.
-
-d_interp on/off
-
-    Polygonal geometry statement.
-
-    Sets dissolve interpolation on or off.
-
-    Dissolve interpolation creates an interpolation or blend across a
-    polygon between the dissolve (d) values of the materials assigned
-    to its vertices. This feature is used to create effects exhibiting
-    varying degrees of apparent transparency, as in glass or clouds.
-
-    To support dissolve interpolation, materials must be assigned per
-    vertex, not per element. All the materials assigned to the vertices
-    involved in the dissolve interpolation must contain a dissolve
-    factor command to specify a dissolve.
-
-    on turns on dissolve interpolation.
-
-    off turns off dissolve interpolation. The default is off.
-
-lod level
-
-    Polygonal and free-form geometry statement.
-
-    Sets the level of detail to be displayed in a PreView animation.
-    The level of detail feature lets you control which elements of an
-    object are displayed while working in PreView.
-
-    level is the level of detail to be displayed. When you set the
-    level of detail to 0 or omit the lod statement, all elements are
-    displayed.  Specifying an integer between 1 and 100 sets the level
-    of detail to be displayed when reading the .obj file.
-
-maplib filename1 filename2 . . .
-
-    This is a rendering identifier that specifies the map library file
-    for the texture map definitions set with the usemap identifier. You
-    can specify multiple filenames with maplib. If multiple filenames
-    are specified, the first file listed is searched first for the map
-    definition, the second file is searched next, and so on.
-
-    When you assign a map library using the Model program, Model allows
-    only one map library per .obj file. You can assign multiple
-    libraries using a text editor.
-
-    filename is the name of the library file where the texture maps are
-    defined. There is no default.
-
-usemap map_name/off
-
-    This is a rendering identifier that specifies the texture map name
-    for the element following it. To turn off texture mapping, specify
-    off instead of the map name.
-
-    If you specify texture mapping for a face without texture vertices,
-    the texture map will be ignored.
-
-    map_name is the name of the texture map.
-
-    off turns off texture mapping. The default is off.
-
-usemtl material_name
-
-    Polygonal and free-form geometry statement.
-
-    Specifies the material name for the element following it. Once a
-    material is assigned, it cannot be turned off; it can only be
-    changed.
-
-    material_name is the name of the material. If a material name is
-    not specified, a white material is used.
-
-mtllib filename1 filename2 . . .
-
-    Polygonal and free-form geometry statement.
-
-    Specifies the material library file for the material definitions
-    set with the usemtl statement. You can specify multiple filenames
-    with mtllib. If multiple filenames are specified, the first file
-    listed is searched first for the material definition, the second
-    file is searched next, and so on.
-
-    When you assign a material library using the Model program, only
-    one map library per .obj file is allowed. You can assign multiple
-    libraries using a text editor.
-
-    filename is the name of the library file that defines the
-    materials.  There is no default.
-
-shadow_obj filename
-
-    Polygonal and free-form geometry statement.
-
-    Specifies the shadow object filename. This object is used to cast
-    shadows for the current object. Shadows are only visible in a
-    rendered image; they cannot be seen using hardware shading. The
-    shadow object is invisible except for its shadow.
-
-    An object will cast shadows only if it has a shadow object. You can
-    use an object as its own shadow object. However, a simplified
-    version of the original object is usually preferable for shadow
-    objects, since shadow casting can greatly increase rendering time.
-
-    filename is the filename for the shadow object. You can enter any
-    valid object filename for the shadow object. The object file can be
-    an .obj or .mod file. If a filename is given without an extension,
-    an extension of .obj is assumed.
-
-    Only one shadow object can be stored in a file. If more than one
-    shadow object is specified, the last one specified will be used.
-
-trace_obj filename
-
-    Polygonal and free-form geometry statement.
-
-    Specifies the ray tracing object filename. This object will be used
-    in generating reflections of the current object on reflective
-    surfaces.  Reflections are only visible in a rendered image; they
-    cannot be seen using hardware shading.
-
-    An object will appear in reflections only if it has a trace object.
-    You can use an object as its own trace object. However, a
-    simplified version of the original object is usually preferable for
-    trace objects, since ray tracing can greatly increase rendering
-    time.
-
-    filename is the filename for the ray tracing object. You can enter
-    any valid object filename for the trace object. You can enter any
-    valid object filename for the shadow object. The object file can be
-    an .obj or .mod file. If a filename is given without an extension,
-    an extension of .obj is assumed.
-
-    Only one trace object can be stored in a file. If more than one is
-    specified, the last one is used.
-
-ctech  technique  resolution
-
-    Free-form geometry statement.
-
-    Specifies a curve approximation technique. The arguments specify
-    the technique and resolution for the curve.
-
-    You must select from one of the following three techniques.
-
-    ctech cparm res
-
-	Specifies a curve with constant parametric subdivision using
-	one resolution parameter. Each polynomial segment of the curve
-	is subdivided n times in parameter space, where n is the
-	resolution parameter multiplied by the degree of the curve.
-
-	res is the resolution parameter. The larger the value, the
-	finer the resolution. If res has a value of 0, each polynomial
-	curve segment is represented by a single line segment.
-
-    ctech cspace maxlength
-
-	Specifies a curve with constant spatial subdivision. The curve
-	is approximated by a series of line segments whose lengths in
-	real space are less than or equal to the maxlength.
-
-	maxlength is the maximum length of the line segments. The
-	smaller the value, the finer the resolution.
-
-    ctech curv maxdist maxangle
-
-	Specifies curvature-dependent subdivision using separate
-	resolution parameters for the maximum distance and the maximum
-	angle.
-
-	The curve is approximated by a series of line segments in which
-	1) the distance in object space between a line segment and the
-	actual curve must be less than the maxdist parameter and 2) the
-	angle in degrees between tangent vectors at the ends of a line
-	segment must be less than the maxangle parameter.
-
-	maxdist is the distance in real space between a line segment
-	and the actual curve.
-
-	maxangle is the angle (in degrees) between tangent vectors at
-	the ends of a line segment.
-
-	The smaller the values for maxdist and maxangle, the finer the
-	resolution.
-
-    NOTE: Approximation information for trimming, hole, and special
-    curves is stored in the corresponding surface. The ctech statement
-    for the surface is used, not the ctech statement applied to the
-    curv2 statement. Although untrimmed surfaces have no explicit
-    trimming loop, a loop is constructed which bounds the legal
-    parameter range. This implicit loop follows the same rules as any
-    other loop and is approximated according to the ctech information
-    for the surface.
-
-stech  technique  resolution
-
-    Free-form geometry statement.
-
-    Specifies a surface approximation technique. The arguments specify
-    the technique and resolution for the surface.
-
-    You must select from one of the following techniques:
-
-    stech cparma ures vres
-
-	Specifies a surface with constant parametric subdivision using
-	separate resolution parameters for the u and v directions. Each
-	patch of the surface is subdivided n times in parameter space,
-	where n is the resolution parameter multiplied by the degree of
-	the surface.
-
-	ures is the resolution parameter for the u direction.
-
-	vres is the resolution parameter for the v direction.
-
-	The larger the values for ures and vres, the finer the
-	resolution.  If you enter a value of 0 for both ures and vres,
-	each patch is approximated by two triangles.
-
-    stech cparmb uvres
-
-	Specifies a surface with constant parametric subdivision, with
-	refinement using one resolution parameter for both the u and v
-	directions.
-
-	An initial triangulation is performed using only the points on
-	the trimming curves. This triangulation is then refined until
-	all edges are of an appropriate length. The resulting triangles
-	are not oriented along isoparametric lines as they are in the
-	cparma technique.
-
-	uvres is the resolution parameter for both the u and v
-	directions.  The larger the value, the finer the resolution.
-
-    stech cspace maxlength
-
-	Specifies a surface with constant spatial subdivision.
-
-	The surface is subdivided in rectangular regions until the
-	length in real space of any rectangle edge is less than the
-	maxlength.  These rectangular regions are then triangulated.
-
-	maxlength is the length in real space of any rectangle edge.
-	The smaller the value, the finer the resolution.
-
-    stech curv maxdist maxangle
-
-	Specifies a surface with curvature-dependent subdivision using
-	separate resolution parameters for the maximum distance and the
-	maximum angle.
-
-	The surface is subdivided in rectangular regions until 1) the
-	distance in real space between the approximating rectangle and
-	the actual surface is less than the maxdist (approximately) and
-	2) the angle in degrees between surface normals at the corners
-	of the rectangle is less than the maxangle. Following
-	subdivision, the regions are triangulated.
-
-	maxdist is the distance in real space between the approximating
-	rectangle and the actual surface.
-
-	maxangle is the angle in degrees between surface normals at the
-	corners of the rectangle.
-
-	The smaller the values for maxdist and maxangle, the finer the
-	resolution.
-
-Examples
-
-1.      Cube with materials
-
-This cube has a different material applied to each of its faces.
-
-    mtllib master.mtl
-
-    v 0.000000 2.000000 2.000000
-    v 0.000000 0.000000 2.000000
-    v 2.000000 0.000000 2.000000
-    v 2.000000 2.000000 2.000000
-    v 0.000000 2.000000 0.000000
-    v 0.000000 0.000000 0.000000
-    v 2.000000 0.000000 0.000000
-    v 2.000000 2.000000 0.000000
-    # 8 vertices
-
-    g front
-    usemtl red
-    f 1 2 3 4
-    g back
-    usemtl blue
-    f 8 7 6 5
-    g right
-    usemtl green
-    f 4 3 7 8
-    g top
-    usemtl gold
-    f 5 1 4 8
-    g left
-    usemtl orange
-    f 5 6 2 1
-    g bottom
-    usemtl purple
-    f 2 6 7 3
-    # 6 elements
-
-
-2.      Cube casting a shadow
-
-In this example, the cube casts a shadow on the other objects when it
-is rendered with Image. The cube, which is stored in the file cube.obj,
-references itself as the shadow object.
-
-    mtllib master.mtl
-    shadow_obj cube.obj
-
-    v 0.000000 2.000000 2.000000
-    v 0.000000 0.000000 2.000000
-    v 2.000000 0.000000 2.000000
-    v 2.000000 2.000000 2.000000
-    v 0.000000 2.000000 0.000000
-    v 0.000000 0.000000 0.000000
-    v 2.000000 0.000000 0.000000
-    v 2.000000 2.000000 0.000000
-    # 8 vertices
-
-    g front
-    usemtl red
-    f 1 2 3 4
-    g back
-    usemtl blue
-    f 8 7 6 5
-    g right
-    usemtl green
-    f 4 3 7 8
-    g top
-    usemtl gold
-    f 5 1 4 8
-    g left
-    usemtl orange
-    f 5 6 2 1
-    g bottom
-    usemtl purple
-    f 2 6 7 3
-    # 6 elements
-
-
-3.      Cube casting a reflection
-
-This cube casts its reflection on any reflective objects when it is
-rendered with Image. The cube, which is stored in the file cube.obj,
-references itself as the trace object.
-
-    mtllib master.mtl
-    trace_obj cube.obj
-
-    v 0.000000 2.000000 2.000000
-    v 0.000000 0.000000 2.000000
-    v 2.000000 0.000000 2.000000
-    v 2.000000 2.000000 2.000000
-    v 0.000000 2.000000 0.000000
-    v 0.000000 0.000000 0.000000
-    v 2.000000 0.000000 0.000000
-    v 2.000000 2.000000 0.000000
-    # 8 vertices
-
-    g front
-    usemtl red
-    f 1 2 3 4
-    g back
-    usemtl blue
-    f 8 7 6 5
-    g right
-    usemtl green
-    f 4 3 7 8
-    g top
-    usemtl gold
-    f 5 1 4 8
-    g left
-    usemtl orange
-    f 5 6 2 1
-    g bottom
-    usemtl purple
-    f 2 6 7 3
-    # 6 elements
-
-
-
-4.      Texture-mapped square
-
-This example describes a 2 x 2 square. It is mapped with a 1 x 1 square
-texture. The texture is stretched to fit the square exactly.
-
-mtllib master.mtl
-
-v 0.000000 2.000000 0.000000
-v 0.000000 0.000000 0.000000
-v 2.000000 0.000000 0.000000
-v 2.000000 2.000000 0.000000
-vt 0.000000 1.000000 0.000000
-vt 0.000000 0.000000 0.000000
-vt 1.000000 0.000000 0.000000
-vt 1.000000 1.000000 0.000000
-# 4 vertices
-
-usemtl wood
-f 1/1 2/2 3/3 4/4
-# 1 element
-
-5.      Approximation technique for a surface
-
-This example shows a B-spline surface which will be approximated using
-curvature-dependent subdivision specified by the stech command.
-
-    g bspatch
-    v -5.000000 -5.000000 -7.808327
-    v -5.000000 -1.666667 -7.808327
-    v -5.000000 1.666667 -7.808327
-    v -5.000000 5.000000 -7.808327
-    v -1.666667 -5.000000 -7.808327
-    v -1.666667 -1.666667 11.977780
-    v -1.666667 1.666667 11.977780
-    v -1.666667 5.000000 -7.808327
-    v 1.666667 -5.000000 -7.808327
-    v 1.666667 -1.666667 11.977780
-    v 1.666667 1.666667 11.977780
-    v 1.666667 5.000000 -7.808327
-    v 5.000000 -5.000000 -7.808327
-    v 5.000000 -1.666667 -7.808327
-    v 5.000000 1.666667 -7.808327
-    v 5.000000 5.000000 -7.808327
-    # 16 vertices
-
-    g bspatch
-    cstype bspline
-    stech curv 0.5 10.000000
-    deg 3 3
-    surf 0.000000 1.000000 0.000000 1.000000 13 14 \ 15 16 9 10 11 12 5 6 7
-    8 1 2 3 4
-    parm u -3.000000 -2.000000 -1.000000 0.000000  \
-    1.000000 2.000000 3.000000 4.000000
-    parm v -3.000000 -2.000000 -1.000000 0.000000  \
-    1.000000 2.000000 3.000000 4.000000
-    end
-    # 1 element
-
-
-
-6.      Approximation technique for a curve
-
-This example shows a Bezier curve which will be approximated using
-constant parametric subdivision specified by the ctech command.
-
-    v -2.300000 1.950000 0.000000
-    v -2.200000 0.790000 0.000000
-    v -2.340000 -1.510000 0.000000
-    v -1.530000 -1.490000 0.000000
-    v -0.720000 -1.470000 0.000000
-    v -0.780000 0.230000 0.000000
-    v 0.070000 0.250000 0.000000
-    v 0.920000 0.270000 0.000000
-    v 0.800000 -1.610000 0.000000
-    v 1.620000 -1.590000 0.000000
-    v 2.440000 -1.570000 0.000000
-    v 2.690000 0.670000 0.000000
-    v 2.900000 1.980000 0.000000
-    # 13 vertices
-
-    g default
-    cstype bezier
-    ctech cparm 1.000000
-    deg 3
-    curv 0.000000 4.000000 1 2 3 4 5 6 7 8 9 10 \
-    11 12 13
-    parm u 0.000000 1.000000 2.000000 3.000000  \
-    4.000000
-    end
-    # 1 element
-
-
-
-Comments
-
-Comments can appear anywhere in an .obj file. They are used to annotate
-the file; they are not processed.
-
-Here is an example:
-
-    # this is a comment
-
-The Model program automatically inserts comments when it creates .obj
-files. For example, it reports the number of geometric vertices,
-texture vertices, and vertex normals in a file.
-
-    # 4 vertices
-    # 4 texture vertices
-    # 4 normals
-
-Mathematics for free-form curves/surfaces
-
-[I apologize but this section will make absolutely no sense whatsoever
- without the equations and diagrams and there was just no easy way to
- include them in a pure ASCII document.  You should probably just skip
- ahead to the section "Superseded statements."  -Jim]
-
-General forms
-
-Rational and non-rational curves and surfaces
-
-In general, any non-rational curve segment may be written as:
-
-where
-
-K + 1    is the number of control points
-
-di       are the control points
-
-n        is the degree of the curve
-
-Ni,n(t)          are the degree n basis functions
-
-Extending this to the bivariate case, any non-rational surface patch
-may be written as:
-
-where:
-
-K1 + 1   is the number of control points in the u direction
-
-K2 + 1   is the number of control points in the v direction
-
-di,j     are the control points
-
-m        is the degree of the surface in the u direction
-
-n        is the degree of the surface in the v direction
-
-Ni,m(u)          are the degree m basis functions in the u direction
-
-Nj,n(v)          are the degree n basis functions in the v direction
-
-NOTE: The front of the surface is defined as the side where the u
-parameter increases to the right and the v parameter increases upward.
-
-We may extend this curve to the rational case as:
-
-
-
-where wi are the weights associated with the control points di.
-Similarly, a rational surface may be expressed as:
-
-where wi,j  are the weights associated with the control points di,j.
-
-NOTE: If a curve or surface in an .obj file is rational, it must use
-the rat option with the cstype statement and it requires some weight
-values for each control point.
-
-
-
-The weights for the rational form are given as a third control point
-coordinate (for trimming curves) or fourth coordinate (for space curves
-and surfaces). These weights are optional and default to 1.0 if not
-given.
-
-
-
-This default weight is only reasonable for curves and surfaces whose
-basis functions sum to 1.0, such as Bezier, Cardinal, and NURB. It does
-not make sense for Taylor and may or may not make sense for a
-representation given in basis-matrix form.
-
-For all forms other than B-spline, the final curve or surface is
-constructed by piecing together the individual curve segments or
-surface patches. A global parameter space is then defined over the
-entire composite curve or surface using the parameter vector given with
-the parm statement.
-
-The parameter vector for a curve is a list of p global parameter values
-{t1, . . . , tp}. If t1  t < ti+1 is a point in global parameter space,
-then:
-
-is the corresponding point in local parameter space for the ith
-polynomial segment. It is this t which is used when evaluating a given
-segment of the piecewise curve. For surfaces, this mapping from global
-to local parameter space is applied independently in both the u and v
-parametric directions.
-
-B-splines require a knot vector rather than a parameter vector,
-although this is also given with the parm statement. Refer to the
-description of B-splines below.
-
-The following discussion of each type is expressed in terms of the
-above definitions.
-
-NOTE: The maximum degree for all curve and surface types is currently
-set at 20, which is high enough for most purposes.
-
-
-
-Free-form curve and surface types
-
-B-spline
-
-Type bspline specifies arbitrary degree non-uniform B-splines which are
-commonly referred to as NURBs in their rational form. The basis
-functions are defined by the Cox-deBoor recursion formulas as:
-
-and:
-
-where, by convention, 0/0 = 0.
-
-The xi  {x0, . . . ,xq} form a set known as the knot vector which is
-given by the parm statement. It is required that
-
-1.      xi  xi + 1,
-
-2.      x0 < xn + 1,
-
-3.      xq -n -1 < xq,
-
-4.      xi < xi + n for 0 < i < q - n - 1,
-
-5.      xn  t min < tmax  xK+ 1, where [tmin, tmax] is the parameter
-over which the B-spline is to be evaluated, and
-
-6.      K = q - n - 1.
-
-A knot is said to be of multiplicity r if its value is repeated r times
-in the knot vector. The second through fourth conditions above restrict
-knots to be of at most multiplicity n + 1 at the ends of the vector and
-at most n everywhere else.
-
-The last condition requires that the number of control points is equal
-to one less than the number of knots minus the degree. For surfaces,
-all of the above conditions apply independently for the u and v
-parametric directions.
-
-Bezier
-
-Type bezier specifies arbitrary degree Bezier curves and surfaces. This
-basis function is defined as:
-
-where:
-
-When using type bezier, the number of global parameter values given
-with the parm statement must be K/n + 1, where K is the number of
-control points. For surfaces, this requirement applies independently
-for the u and v parametric directions.
-
-Cardinal
-
-Type cardinal specifies a cubic, first derivative, continuous curve or
-surface. For curves, this interpolates all but the first and last
-control points. For surfaces, all but the first and last row and column
-of control points are interpolated.
-
-Cardinal splines, also known as Catmull-Rom splines, are best
-understood by considering the conversion from Cardinal to Bezier
-control points for a single curve segment:
-
-Here, the ci variables are the Cardinal control points and the bi
-variables are the Bezier control points. We see that the second and
-third Cardinal points are the beginning and ending points for the
-segment, respectively. Also, the beginning tangent lies along the
-vector from the first to the third point, and the ending tangent along
-the vector from the second to the last point.
-
-If we let Bi(t) be the cubic Bezier basis functions (i.e. what was
-given above for Bezier as Ni,n(t) with n = 3), then we may write the
-Cardinal basis functions as:
-
-Note that Cardinal splines are only defined for the cubic case.
-
-When using type cardinal, the number of global parameter values given
-with the parm statement must be K - n + 2, where K is the number of
-control points. For surfaces, this requirement applies independently
-for the u and v parametric directions.
-
-Taylor
-
-Type taylor specifies arbitrary degree Taylor polynomial curves and
-surfaces. The basis function is simply:
-
-NOTE: The control points in this case are the polynomial coefficients
-and have no obvious geometric significance.
-
-When using type taylor, the number of global parameter values given
-with the parm statement must be (K + 1)/(n + 1) + 1, where K is the
-number of control points. For surfaces, this requirement applies
-independently for the u and v parametric directions.
-
-Basis matrix
-
-Type bmatrix specifies general, arbitrary-degree curves defined through
-the use of a basis matrix rather than an explicit type such as Bezier.
-The basis functions are defined as:
-
-where the basis matrix is the bi,j. In order to make the matrix nature
-of this more obvious, we may also write:
-
-When constructing basis matrices, you should keep this definition in
-mind, as different authors write this in different ways. A more common
-matrix representation is:
-
-To use such matrices in the .obj file, simply transpose the matrix and
-reverse the column ordering.
-
-When using type basis, the number of global parameter values given with
-the parm statement must be (K - n)/s + 2, where K is the number of
-control points and s is the step size given with the step statement.
-For surfaces, this requirement applies independently for the u and v
-parametric directions.
-
-Surface vertex data
-
-Control points
-
-The control points for a surface consisting of a single patch are
-listed in the order i = 0 to K1 for j = 0, followed by i = 0 to K1 for
-j = 1, and so on until j = K2.
-
-For surfaces made up of many patches, which is the usual case, the
-control points are ordered as if the surface were a single large patch.
-For example, the control points for a bicubic Bezier surface consisting
-of four patches would be arranged as follows:
-
-where (m, n) is the global parameter space of the surface and the
-numbers indicate the ordering of the vertex indices in the surf
-statement.
-
-Texture vertices and texture mapping
-
-When texture vertices are not supplied, the original surface
-parameterization is used for texture mapping. However, if texture
-vertices are supplied, they are interpreted as additional information
-to be interpolated or approximated separately from, but using the same
-interpolation functions as the control vertices.
-
-That is, whereas the surface itself, in the non-rational case, was
-given in the section "Rational and non-rational curves and surfaces"
-as:
-
-
-
-the texture vertices are interpolated or approximated by:
-
-where ti,j are the texture vertices and the basis functions are the
-same as for S(u,v). It is T(u,v), rather than the surface
-parameterization (u,v), which is used when a texture map is applied.
-
-Vertex normals and normal mapping
-
-Vertex normals are treated exactly like texture vertices. When vertex
-normals are not supplied, the true surface normals are used. If vertex
-normals are supplied, they are calculated as:
-
-where qi,j are the vertex normals and the basis functions are the same
-as for S(u,v) and T(u,v).
-
-NOTE: Vertex normals do not affect the shape of the surface; they are
-simply associated with the triangle vertices in the final
-triangulation. As with faces, supplying vertex normals only affects
-lighting calculations for the surface.
-
-The treatment of both texture vertices and vertex normals in the case
-of rational surfaces is identical. It is important to notice that even
-when the surface S(u,v) is rational, the texture and normal surfaces,
-T(u,v) and Q(u,v), are not rational. This is because the control points
-(the texture vertices and vertex normals) are never rational.
-
-Curve and surface operations
-
-Special points
-
-The following equations give a more precise description of special
-points for space curves and discuss the extension to trimming curves
-and surfaces.
-
-Let C(t) be a space curve with the global parameter t. We can
-approximate this curve by a set of k-1 line segments which connect the
-points:
-
-for some set of k global parameter values {t1,...,tk}
-
-Given a special point ts in the parameter space of the curve
-(referenced by vp), we guarantee that ts  {t1, . . . ,tk}. More
-specifically, we approximate the curve by:
-
-where, at the point i where ts is inserted, we have ti  ts < ti+1.
-
-Special curves
-
-The following equations give a more precise description of a special
-curve.
-
-Let T(t) be a special curve with the global parameter t. We have:
-
-where (m,n) is a point in the global parameter space of a surface. We
-can approximate this curve by a set of k-1 line segments which connect
-the points:
-
-for some set of k global parameter values.
-
-Let S(m,n) be a surface with the global parameters m and n. We can
-approximate this surface by a triangulation of a set of p points.
-
-which lie on the surface. We further define E as the set of all edges
-such that ei,j  E implies that S(mi,ni) and S(mj,nj) are connected in
-the triangulation. Finally, we guarantee that there exists some subset
-of E:
-
-such that the points:
-
-are connected in the triangulation.
-
-Connectivity
-
-Recall that the syntax of the con statement is:
-
-con surf_1 q0_1 q1_1 curv2d_1 surf_2 q0_2 q1_2 curv2d_2
-
-If we let:
-
-T1(t1)  be the curve referenced by curv2d_1
-
-S1(m1, n1)      be the surface referenced by surf1 on which T1(t1) lies
-
-T2(t2)  be the curve referenced by curv2d_2
-
-S2(m2, n2)      be the surface referenced by surf2 on which T2(t2) lies
-
-then S1(T1(t1)), S2(T2(t2)) must be identical up to reparameterization.
-Moreover, it must be the case that:
-
-S1(T1(q0_1)) = S2(T2(q0_2))
-
-and:
-
-S1(T1(q1_1)) = S2(T2(q1_2))
-
-It is along the curve S1(T1(t1)) between t1 = q0_1 and t1 = q1_1, and
-the curve S2(T2(t2)) between t2 = q0_2 and t2 = q1_2 that the surface
-S1(m1, n1) is connected to the surface S2(m2, n2).
-
-
-
-Superseded statements
-
-The new .obj file format has eliminated the need for several patch and
-curve statements. These statements have been replaced by free-form
-geometry statements.
-
-In the 3.0 release, the following keywords have been superseded:
-
-o       bsp
-
-o       bzp
-
-o       cdc
-
-o       cdp
-
-o       res
-
-You can still read these statements in this version 3.0, however, the
-system will no longer write files in this format.
-
-This release is the last release that will read these statements. If
-you want to save any data from this format, read in the file and write
-it out. The system will convert the data to the new .obj format.
-
-For more information on the new syntax statements, see "Specifying
-free-form curves and surfaces."
-
-Syntax
-
-The following syntax statements are for the superseded keywords.
-
-bsp v1 v2 . . . v16
-
-    Specifies a B-spline patch. B-spline patches have sixteen control
-    points, defined as vertices. Only four of the control points are
-    distributed over the surface of the patch; the remainder are
-    distributed around the perimeter of the patch.
-
-    Patches must be tessellated in Model before they can be correctly
-    shaded or rendered.
-
-    v is the vertex number for a control point. Sixteen vertex numbers
-    are required. Positive values indicate absolute vertex numbers.
-    Negative values indicate relative vertex numbers.
-
-bzp v1 v2 . . . v16
-
-    Specifies a Bezier patch. Bezier patches have sixteen control
-    points, defined as vertices. The control points are distributed
-    uniformly over its surface.
-
-    Patches must be tessellated in Model before they can be correctly
-    shaded or rendered.
-
-    v is the vertex number for a control point. Sixteen vertex numbers
-    are required. Positive values indicate absolute vertex numbers.
-    Negative values indicate relative vertex numbers.
-
-cdc v1 v2 v3 v4 v5 . . .
-
-    Specifies a Cardinal curve. Cardinal curves have a minimum of four
-    control points, defined as vertices.
-
-    Cardinal curves cannot be correctly shaded or rendered. They can be
-    tessellated and then extruded in Model to create 3D shapes.
-
-    v is the vertex number for a control point. A minimum of four
-    vertex numbers are required. There is no limit on the maximum.
-    Positive values indicate absolute vertex numbers. Negative values
-    indicate relative vertex numbers.
-
-cdp v1 v2 v3 . . . v16
-
-    Specifies a Cardinal patch. Cardinal patches have sixteen control
-    points, defined as vertices. Four of the control points are
-    attached to the corners of the patch.
-
-    Patches must be tessellated in Model before they can be correctly
-    shaded or rendered.
-
-    v is the vertex number for a control point. Sixteen vertex numbers
-    are required. Positive values indicate absolute vertex numbers.
-    Negative values indicate relative vertex numbers.
-
-res useg vseg
-
-    Reference and display statement.
-
-    Sets the number of segments for Bezier, B-spline and Cardinal
-    patches that follow it.
-
-    useg is the number of segments in the u direction (horizontal or x
-    direction). The minimum setting is 3 and the maximum setting is
-    120.  The default is 4.
-
-    vseg is the number of segments in the v direction (vertical or y
-    direction). The minimum setting is 3 and the maximum setting is
-    120.  The default is 4.
-
-Comparison of 2.11 and 3.0 syntax
-
-Cardinal curve
-
-The following example shows the 2.11 syntax and the 3.0 syntax for the
-same Cardinal curve.
-
-2.11 Cardinal curve
-
-    # 2.11 Cardinal Curve
-
-    v 2.570000 1.280000 0.000000
-    v 0.940000 1.340000 0.000000
-    v -0.670000 0.820000 0.000000
-    v -0.770000 -0.940000 0.000000
-    v 1.030000 -1.350000 0.000000
-    v 3.070000 -1.310000 0.000000
-    # 6 vertices
-
-    cdc 1 2 3 4 5 6
-
-
-3.0 Cardinal curve
-
-    # 3.0 Cardinal curve
-
-    v 2.570000 1.280000 0.000000
-    v 0.940000 1.340000 0.000000
-    v -0.670000 0.820000 0.000000
-    v -0.770000 -0.940000 0.000000
-    v 1.030000 -1.350000 0.000000
-    v 3.070000 -1.310000 0.000000
-    # 6 vertices
-
-    cstype cardinal
-    deg 3
-    curv 0.000000 3.000000 1 2 3 4 5 6
-    parm u 0.000000 1.000000 2.000000 3.000000
-    end
-    # 1 element
-
-Bezier patch
-
- The following example shows the 2.11 syntax and the 3.0 syntax for the
- same Bezier patch.
-
-2.11 Bezier patch
-
-    # 2.11 Bezier Patch
-    v -5.000000 -5.000000 0.000000
-    v -5.000000 -1.666667 0.000000
-    v -5.000000 1.666667 0.000000
-    v -5.000000 5.000000 0.000000
-    v -1.666667 -5.000000 0.000000
-    v -1.666667 -1.666667 0.000000
-    v -1.666667 1.666667 0.000000
-    v -1.666667 5.000000 0.000000
-    v 1.666667 -5.000000 0.000000
-    v 1.666667 -1.666667 0.000000
-    v 1.666667 1.666667 0.000000
-    v 1.666667 5.000000 0.000000
-    v 5.000000 -5.000000 0.000000
-    v 5.000000 -1.666667 0.000000
-    v 5.000000 1.666667 0.000000
-    v 5.000000 5.000000 0.000000
-    # 16 vertices
-
-    bzp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-    # 1 element
-
-3.0 Bezier patch
-
-    #   3.0 Bezier patch
-
-    v -5.000000 -5.000000 0.000000
-    v -5.000000 -1.666667 0.000000
-    v -5.000000 1.666667 0.000000
-    v -5.000000 5.000000 0.000000
-    v -1.666667 -5.000000 0.000000
-    v -1.666667 -1.666667 0.000000
-    v -1.666667 1.666667 0.000000
-    v -1.666667 5.000000 0.000000
-    v 1.666667 -5.000000 0.000000
-    v 1.666667 -1.666667 0.000000
-    v 1.666667 1.666667 0.000000
-    v 1.666667 5.000000 0.000000
-    v 5.000000 -5.000000 0.000000
-    v 5.000000 -1.666667 0.000000
-    v 5.000000 1.666667 0.000000
-    v 5.000000 5.000000 0.000000
-    # 16 vertices
-
-    cstype bezier
-    deg 3 3
-    surf 0.000000 1.000000 0.000000 1.000000 13 14 \
-    15 16 9 10 11 12 5 6 7 8 1 2 3 4
-    parm u 0.000000 1.000000
-    parm v 0.000000 1.000000
-    end
-    # 1 element
-
diff --git a/Docs/Scenery/SceneGeneration/SceneryGeneration.tex b/Docs/Scenery/SceneGeneration/SceneryGeneration.tex
deleted file mode 100644
index 93503f7b5..000000000
--- a/Docs/Scenery/SceneGeneration/SceneryGeneration.tex
+++ /dev/null
@@ -1,550 +0,0 @@
-%
-% `SceneryGeneration.tex' -- describes the scenery generation tool pipeline
-%
-%  Written by Curtis Olson.  Started February, 1999.  curt@flightgear.org
-%
-% $Id$
-%------------------------------------------------------------------------
-
-
-\documentclass[12pt]{article}
-
-\usepackage{anysize}
-\papersize{11in}{8.5in}
-\marginsize{1in}{1in}{1in}{1in}
-
-\usepackage{amsmath}
-
-\usepackage{epsfig}
-
-\usepackage{setspace}
-\onehalfspacing
-
-\usepackage{url}
-
-
-\begin{document}
-
-
-\title{
-  Flight Gear Scenery Generation Tools.
-}
-
-
-\author{
-    Curtis L. Olson\\ 
-    (\texttt{curt@flightgear.org})
-}
-
-
-\maketitle
-
-
-\section{Introduction}
-
-This document gives a brief overview of the Flight Gear scenery
-generation tools and how they fit together in a pipeline to produce
-the runtime scenery from the raw data.
-
-The first sections describe how the Flight Gear Earth is subdivided
-and the coordinate systems that Flight Gear uses internally.  The
-remaining sections describe the tools that take diverse data sources
-and produce the actual scenery.
-
-
-\section{Internal Scenery Representation}
-
-This section describes how FG represents, manipulates, and
-transforms scenery internally.
-
-Internal, all FG scenery is defined using a cartesian coordinate
-system centered at the center of the earth.  Please refer to the
-Flight Gear CoordinateSystem document for more information.  This
-means that one of the scenery tools processing steps will be to
-convert from the source data coordinate system to the internal Flight
-Gear coordinate system.
-
-
-\subsection{Scenery Partitioning}
-
-Flight Gear splits the world up into tiles.  This splits up the
-immense scenery data base into chunks that are managable by the run
-time simulator.
-
-Tile edges are parallel to longitude and latitude lines.  Tiles are
-gauranteed to be at least 8 miles long in both width and height.  As
-we move towards the poles, the tiles get narrower, so at certain
-predefined latitudes, the tile with is doubled.  Figure \ref{fig:lats}
-shows latitudes vs.  tile widths.  The southern hemisphere is a mirror
-image of the northern hemisphere.
-
-\begin{figure}[hbt]
- \begin{center}
-  \begin{tabular}{||l|l||} \hline
-    Latitude Range & Tile Width \\ \hline
-    $[0, 22)$  & $\frac{1}{8}$ degree \\ \hline
-    $[22, 62)$ & $\frac{1}{4}$ degree \\ \hline
-    $[62, 76)$ & $\frac{1}{2}$ degree \\ \hline
-    $[76, 83)$ & $1$ degree \\ \hline
-    $[83, 86)$ & $2$ degrees \\ \hline
-    $[86, 88)$ & $4$ degrees \\ \hline
-    $[88, 89)$ & $8$ degrees \\ \hline
-    $[89, 90]$ & polar cap \\ \hline
-   \hline
-  \end{tabular}
- \end{center}
-
- \caption{Latitude vs. Tile Widths.}
- \label{fig:lats}
-\end{figure}
-
-
-Since Flight Gear tiles are partitioned parallel to longitude and
-latitude lines, they have a trapezium shape.  Figure \ref{fig:trap}
-shows an exaggerated scenery area.
-
-\begin{figure}[hbt]
-  \centerline{                   
-      \psfig{file=trap.eps}
-  }
-  \caption{Basic Tile Shape}
-  \label{fig:trap}
-\end{figure}
-
-\subsection{Reference Points}
-
-Each scenery area will have a reference point at the center of its
-area.  This reference point (for purposes of avoiding floating point
-precision problems) defines the origin of a local coordinate system
-which.  The local coordinate system is simply translated from the
-global coordinate system by the distance of the tile's center
-reference point from the center of the earth.  Figure
-\ref{fig:reference} demonstrates this better than I can explain it.
-
-\begin{figure}[hbt]
-  \centerline{                   
-      \psfig{file=ref.eps}
-  }
-  \caption{Reference Points and Translations}
-  \label{fig:reference}
-\end{figure}
-
-All the objects for a specific scenery area will be defined based on
-this local coordinate system.  For each scenery area we define a
-vector $\vec{\mathbf{a}}$ which represents the distance from the
-center of the earth to the local coordinate system.
-
-
-\subsection{Putting the pieces of scenery together}
-
-To render a scene, the scenery manager will need to load all the
-visible tiles.  Before rendering each tile we translate it by
-$\vec{\mathbf{a}}_{current} - \vec{\mathbf{a}}_{n}$.  This moves all
-the rendered tiles near to the origin, while maintaining the relative
-positions and orientations.  The of moving all the tiles near the
-origin before rendering them is to try to reduce floating point round
-off problems.
-
-When rendering, it is straightforward to calculate the proper view
-point and up vector so that the scenery will appear right side up when
-it is rendered.
-
-\subsection{Scenery file format}
-
-Here is a very brief overview of the flight gear scenery file format.
-Some of this format will have to change in the future, so I won't put
-a lot of effort here right now.  This description will be most
-understandable if you reference an actual scenery tile file.  If you
-have questions, please ask!
-
-\begin{itemize}
-  
-\item Coordinates are in (X, Y, Z) with (0, 0, 0) being the center of
-  the earth.  Units are in meters.
-  
-\item ``gbs'' is the ``global bounding sphere'' specified by the
-  center reference point and a radius.
-  
-\item This is followed by a list of vertices prefaced by ``v''
-  specifying the offsets of the vertices from the gbs reference point.
-  
-\item Then follows the list of vertex normals ``vn''.
-  
-\item Then the sets of triangle strips are specifed:
-  
-\item ``usemtl'' points to a material property record in the materials
-  file and specifies the texture/color/etc. for this triangle strip.
-  
-\item ``bs'' specifies the bounding sphere for this particular tri
-  strip (for view frustum culling)
-  
-\item ``t'' is the start of a tri strip and the integer numbers are
-  just indices back into the vertex and vertex normal lists.
-
-\item ``q'' is simply a continuation of the triangle strip.
-\end{itemize}
-
-I will eventually need to add texture coordinate support to this file
-format, as well as a way to reference and position objects from an
-external library.
-
-
-\section{Scenery Generation}
-
-This section is very fluid right now.  I have implemented a first pass
-at generating scenery.  This was a good learning experience, but it
-exposed several flaws and limitations in my original approach.  I am
-in the midst of a complete overhaul of these tools which is intended
-to address all the short comings of my first attempt.  At this point I
-am simply outlining the plan.  Much of this could change as my plan
-continues to smack up against reality.
-
-With that in mind, the scenery generation tools can be subdivided into
-four major categories.
-
-\begin{itemize}
-
-\item Libraries which provide basic functionality used by the terrain
-  tools.
-
-\item Preprocessing tools which convert data from it's original format
-  (as downloaded from the net) to something that is easier for the
-  scenery tools to process.
-
-\item Scenery generation tools which assemble and massage the
-  resulting input data into the Flight Gear scenery format.
-
-\item Miscellaneous utilities
-
-\end{itemize}
-
-\subsection{Libraries}
-
-
-\subsubsection{GPC}
-
-GPC is the ``Generic Polygon Clipper'' library.  It is available from
-
-\url{http://www.cs.man.ac.uk/aig/staff/alan/software}
-
-Please be aware that the licensing terms for the gpc library clash
-with the GPL and prevent the source code from being redistributed with
-any GPL program.  Therefore any developers interested in building the
-scenery tools will have to fetch and install this library individually
-on their own systems.
-
-\subsubsection{GFC}
- 
-GFC is the ``Geographic Foundation Classes'' library.  It is available
-from:
-
-\url{http://www.geog.psu.edu/~qian/gfc/index.html}
-
-This library allows programs to process GIS shapefiles and extract out
-the lon/lat coordinates of the GIS structures.
-
-\subsubsection{DEM}
-
-This library has routines to parse the 3 arcsec DEM file format, and
-output a square section corresponding to a specified tile.
-
-\subsubsection{Polygon}
-
-This lib contains routines to assign a unique id number to each
-polygon before it is clipped against tial boundaries.  We can use this
-unique id later on to match up the edges of polygons across tile
-boundaries.
-
-This lib also contains routines to track and assign names (types) to
-each polygon so we can color it with the correct texture at run time.
-
-\subsubsection{Triangle}
-
-Triangle can be built as a standalone binary, or as a library.  For
-our uses I am choosing to build it as a library.  This library
-impliments the delauney triangulation algorithm.  It takes a set of
-unorder points and finds the optimal triangulation of these points.
-
-For our use we feed in a set of unordered height values and the
-triangle library will output a set of triangles that can be rendered
-as terrain.
-
-The triangle library does a few more things that are useful.  It will
-subdivide triangles to ensure that they never get too long and
-skinny.  It will also let you set up boundaries and holes within the
-triangulation area.
-
-\subsection{Scenery Work Space}
-
-The scenery is constructed in a directory structure that parallels the
-final structure.  The structure looks something like the following:
-
-\begin{verbatim}
-  Scenery/ ->
-    w140n50/ ->
-    w140n60/ ->
-    w150n50/ ->
-      w141n59/ ->
-      w142n59/ ->
-      w148n59/ ->
-        533872.gz
-        533873.gz
-        533874.gz
-\end{verbatim}
-
-Beneath the scenery subdirectory is a series of subdirectories
-representing 10x10 degree chunks.  Each directory is named after the
-lower left hand corner of the area it contains.
-
-Beneath each of the 10x10 degree subdirectories is a subdirectory for
-each 1x1 degree area.  Within each of these 1x1 degree subdirectories,
-is a file for each tile.  The file name is the tile's unique numeric
-index number.  There can be multiple files per tile.  When this is
-needed, all files relating to a tile will have the same numeric root
-for the file name.
-
-\subsection{Preprocessing tools}
-
-The preprocessing tools are responsible for inputing raw world data,
-clipping it to the appropriate scenery tiles, and outputing it into
-the workspace directory tree.
-
-The scenery assembly and creation tools work on each tile
-individually, so they expect all the relevant information for a tile
-to already be there.
-
-\subsubsection{DemChop}
-
-This utility inputs 3 arcsec dem files, chops the data up along tile
-boundaries and outputs the result into the scenery workspace.
-
-\subsubsection{DemInfo}
-
-Reads the ``A'' record from a 3 arcsec DEM file and dumps some
-pertinent information.
-
-\subsubsection{DemRaw2ascii}
-
-This tool will input the 30 arcsec raw DEM format, split it up into 1
-x 1 degree sections, and output the result into the 3 arcsec format so
-it can be fed through the scenery pipeline.  (Note to self, at some
-point, this could be updated to work like DemChop and output the tile
-chunks directly.)
-
-\subsubsection{GenAirports}
-
-This tools inputs an ascii specification of the airports of the world
-that looks like the following:
-
-\begin{verbatim}
-A KORD  41.979595 -087.904464   668 CCY Chicago O Hare International 
-R 04L  41.989606 -087.905138 039.39   7500 150 AHYN NNNL 0 0 NNNO 0 0
-R 04R  41.961618 -087.889594 041.40   8071 150 AHYN YNNO 0 0 YNNO 0 0
-R 09L  41.983954 -087.903705 089.70   7967 150 AHYN YNNO 0 0 YNNO 0 0
-R 09R  41.969040 -087.902380 089.88  10141 150 AHYN YNNO 0 0 YNNO 0 0
-R 14L  41.991918 -087.903546 140.10  10003 150 AHYN YNNC 0 0 YNNO 0 0
-R 14R  41.976778 -087.917774 140.08  13000 200 AHYN YNNC 0 0 YNNO 0 0
-R 18   41.990086 -087.900410 180.00   5341 150 AMNN NNNN 0 0 NNNN 0 0
-\end{verbatim}
-
-For each airport, a bounding polygon is generated, and written as a
-clipping record for each intersecting tile in the scenery construction
-area.  The actual airport will belong to the tile containing it's
-center point, but the airport will need to be clipped out of the base
-terrain from any tiles it might spill over into.
-
-Robin Peel (robin@cpwd.com) maintains this data base, primarily for
-use with X-Plane, but lets us use it too.  His distribution contians a
-much more detailed description of the fields and formats.
-
-\subsubsection{ShapeFile}
-
-The ShapeFile tool will take the polygons from shapefiles (via GFC),
-clip them to the appropriate tile boundares (via GPC) and write the
-resulting polygons to the appropriate tile in the scenery work space.
-
-The file naming scheme is tile\_index.polygon\_id where tile\_index is
-the unique numeric index number for the tile and polygon\_id is a
-unique id for the corresponding polygon.  Each polygon is assigned a
-unique id before it is clipped against tile boundaries.  Later we will
-need to match up the edges of polygons with the pieces from the
-neighboring tiles and this unique polygon id will enable us to do
-this.  Each polygon that is written out (no matter what the source or
-type) should have a unique id number assigned to it.
-
-\subsection{Scenery generation tools}
-
-Issues:
-
-\begin{itemize}
-\item Combining height data, polygon data.
-
-\item Triangulating / tri-stripping / tri-fanning.
-
-\item Matching vertices and normals along edges and at corners.
-
-\item Resolving conflicts in data:
-  overlapping polygon areas.
-  conflicting height data between airports and DEM data
-\end{itemize}
-
-Here's the basic process to create scenery:
-
-Dump the raw data into the appropriate tile areas in the work space.
-This includes height data (DEM, airport) and polygon data (airport,
-hydro-data, land use data, etc.)
-
-For each tile create a fitted set of ``important height'' points from
-the original regular grid of data.
-
-For each tile, run the generic clipper on each polygon in order from
-highest to lowest incrementally building an accumulation ``super''
-polygon that comprises a union of all polygons we've processed so far
-for this tile.  For each polygon first clip against this
-super-accumlation-polygon.  What's left after the clip is the new
-shape of the polygon.  This is the scheme for eliminating overlapping
-features on a priority basis.
-
-For each polygon on a tile we must determine a point inside.  We need
-this for the triangulation step so we can assign a regional attribute
-to all triangles inside a polygon.
-
-Run the delauney triangulator for the tile.  The triangulator code is
-very powerful and feature rich, but also very obfuscated to use.  It
-is very robust and fast, but suffers a bit on the usability continuum.
-
-In preparation for the triangulation step we need to create the
-following items:
-
-\begin{itemize}
-\item A list of all unique vertices (nodes) in this tile, including
-  the corners
-
-\item A list of all the unique segments (edges of the polygons) in no
-  particular order.  The triangulator doesn't really care how the
-  polygons connect together, it just cares about boundary edges.
-
-\item A list of ``holes'' (if any) to cut out of the tile.  If an
-  airport overlaps multiple tiles we assign it one tile and leave a
-  hole in remaining tiles.  A hole is specified by a single point.
-  When the triangulation step is finished, the triangulator will start
-  at each hole point and recursively eat away all neighboring
-  triangles until it encounters an edge.
-
-\item A list of regions with region attributes.  These are specified
-  much the same way as holes.  After the triangulation step is
-  finished, regional attributes are assigned.  The procedure is
-  identical to cutting out a hole except that instead of removing a
-  triangle it is simply assigned the attribute for that region.
-\end{itemize}
-
-The result of the triangulation step is a list of triangles for the
-tile with each triangle assigned an attribute representing the polygon
-it lives inside.
-
-Now we have a pile of triangles.  We are heading in the right
-direction!  However, no we need to go through and assign the proper
-height to each of the verticies of the triangles.  We must be aware of
-certain constraints.  Airport elevations should have the highest
-priority, followed by the DEM elevations.  We will also want to impose
-additional constraints such as ensuring lakes are level and rivers
-don't run up hill.  Anyways, with a flurry of handwaving, we have now
-adjusted all the heights. :-)
-
-The next thing we have to worry about is making sure each tile meshes
-exactly with all it's neighbors.  We do this by spliting the tile up
-into it's 4 edges, 4 corners, and the remaining vertices.  We write
-these parts out as individual files if a neighboring tile hasn't been
-processed first.  In other words, the first tile to be process gets to
-define the shared edge or corner.  The neighbor must use this data if
-it exists.  Then we have to reassemble the tile using any pre-existing
-edges from a neighbor tiles that were processed before us and
-retriangulate since our node list has changed. 
-
-Unfortunately it's not quite this simple!
-
-We need to be careful, because we have to make sure we also preserve
-the polygon connections since lakes, rivers, and even airports often
-span multiple tiles.
-
-To do this I propose a scheme of assigning a unique integer id to each
-polygon.  When writing out the shared edge/corner pieces I also
-associate this idea.  So rather than disassembling, sharing, and
-reassembling whole tiles, we need to do this on a per-polygon basis.
-More handwaving and we are off to the next step.
-
-Now, we need to take our 3d, triangulated polygons and tri-fan or
-tri-strip them for rendering efficiency.  We have been using a
-freeware tool called ``stripe'' but it's a typical CSci hack job where
-the author was more interested in demonstrating the theory, rather
-than demonstrating bug free, robust, well written code.  Oh well.  I
-think I will try to write a utility to combine triangles into fans.
-This will help culling (smaller, centralized objects == better
-culling) but will happen at the expense of more vertex
-transformations.  I'm hoping this will result in a net gain.  Finger
-crossed. :-)
-
-Finally, we need to take our 3d, fan-ified polygons and convert them
-to the FGFS scenery format and copy them from the work space directory
-tree into the final scenery directory tree.
-
-\subsubsection{Array}
-
-This library reads in the regular grid data written by the DemChop
-preprocessing tool.  It has a fit routine which approximates the
-regular grid of height data with an irregular grid, and interpolate
-the elevation of any arbitrary point inside this grid.
-
-An irregular grid can often represent the same level detail as a
-regular grid with 4-6x fewer polygons.  This is very desirable in a
-flight sim where both detail and rendering speed is very important.
-
-Another feature of an irregular grid is that it carries fewer
-artifacts that could provide negative training value to pilots.  For
-instance a regular grid could give a pilot non-realistic cues for
-determining north/south/east/west.
-
-\subsubsection{Clipper}
-
-This library makes heavy use of ``the generic polygon clipper''.  The
-polygons of each tile are clipped against the tile boundaries as well
-as any higher priority polygons for that tile.  To do this the library
-processes the polygons from highest priority to lowest and
-incrimentally builds up an accumulation ``super-polygon''.  This
-super-polygon is the union of all the polygons processed so far.  As
-each polygon is processed, it is first clipped against this
-super-accumlation-polygon.  What's left after the clip is the new
-shape of the polygon.  This is the scheme for eliminating overlapping
-features on a priority basis.  In the end we can create a base-terrain
-polygon out the remaining open areas of the tile that weren't covered
-by any other polygons.  This way we end up with a set of ``puzzle''
-pieces that together form the complete tile with no overlaps and no
-gaps.
-
-
-% \subsubsection{Dem2node}
-% 
-% This tool takes the raw DEM files and calls routines from libDEM.a to
-% create the irregular grid approximation of the original data.  The
-% elevation data is writen to the to the appropriate tile in the scenery
-% work space.
-
-% \subsubsection{Areas}
-% \subsubsection{AssemTris}
-% \subsubsection{FixNode}
-% \subsubsection{FixObj}
-% \subsubsection{SplitTris}
-% \subsubsection{Stripe\_w}
-% \subsubsection{Tri2obj}
-
-\subsection{Miscellaneous Utilities}
-
-\subsubsection{tile-sizes.pl}
-
-Generates the width of a 1/8 x 1/8 degree tile at various latitudes.
-
-
-\end{document}
-
-
-%------------------------------------------------------------------------
diff --git a/Docs/Scenery/SceneGeneration/ref.fig b/Docs/Scenery/SceneGeneration/ref.fig
deleted file mode 100644
index cc347e286..000000000
--- a/Docs/Scenery/SceneGeneration/ref.fig
+++ /dev/null
@@ -1,47 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter 
-100.00
-Single
-0
-1200 2
-5 1 0 1 0 7 0 0 -1 0.000 0 1 0 0 6900.000 3304.688 5100 5700 6975 6300 8700 5700
-5 1 1 1 0 7 0 0 -1 4.000 0 0 0 0 6900.000 8100.000 5100 5700 6900 5100 8700 5700
-5 1 0 1 0 7 0 0 -1 4.000 0 0 0 0 6900.000 5175.000 5925 5100 6075 4650 6375 4350
-5 1 0 1 0 7 0 0 -1 4.000 0 0 0 0 8887.500 5062.500 6600 5325 6600 4800 6675 4425
-5 1 0 1 0 7 0 0 -1 4.000 0 1 0 0 6675.000 3975.000 5925 5100 6225 5250 6600 5325
-5 1 0 1 0 7 0 0 -1 4.000 0 1 0 0 6600.000 4087.500 6375 4350 6525 4425 6675 4425
-1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 6900 5700 1802 1802 6900 5700 8700 5775
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	2 1 1.00 60.00 120.00
-	 6300 4800 6300 3600
-2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	2 1 2.00 120.00 240.00
-	 6900 5700 9300 5700
-2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	2 1 2.00 120.00 240.00
-	 6900 5700 7800 4800
-2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	2 1 2.00 120.00 240.00
-	 6900 5700 6900 3300
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	2 1 1.00 60.00 120.00
-	 6300 4800 7200 4800
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	2 1 1.00 60.00 120.00
-	 6300 4800 6750 4350
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	0 0 1.00 60.00 120.00
-	 6900 5700 6300 4800
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	0 0 1.00 60.00 120.00
-	 6075 4950 6300 4950
-4 0 0 0 0 0 14 0.0000 4 150 120 6825 3150 Z\001
-4 0 0 0 0 0 14 0.0000 4 150 135 7875 4800 Y\001
-4 0 0 0 0 0 14 0.0000 4 150 150 9450 5775 X\001
-4 0 0 0 0 0 12 0.0000 4 135 135 7275 4875 X\001
-4 0 0 0 0 0 12 0.0000 4 135 135 6675 4275 Y\001
-4 0 0 0 0 0 12 0.0000 4 135 120 6300 3525 Z\001
-4 0 0 0 0 0 12 0.0000 4 90 90 6150 5100 a\001
diff --git a/Docs/Scenery/SceneGeneration/terrain.outline b/Docs/Scenery/SceneGeneration/terrain.outline
deleted file mode 100644
index 596130fcd..000000000
--- a/Docs/Scenery/SceneGeneration/terrain.outline
+++ /dev/null
@@ -1,50 +0,0 @@
-Basically what I'm doing is starting with the 3 arcsec DEM files (a
-point every 100 meters roughly.)
-
-I start out at one corner and walk down a horizonal row.  I start with
-the first 2 points and do a least squares fit, I then add the next
-point, and the next, and the next until my least squares fit exceeds
-some error tolerance from the original data.  At that point, I back up
-one point and include that point in the output set of points.  This
-point then becomes my new starting point for the least squares fit.  I
-repeat this until I finish the row.  I do this for each row to produce
-an "irregular" set of output points from the original.  I'm sure from
-a pure mathematical perspective you can see some potential flaws in
-this approach, but the actual real life result is actually quite good.
-
-I then do a Delauney triangulation of these points (and add in more to
-keep the triangles from getting too long and skinny.)
-
-I have to go through additional pain to make sure that all the points
-coincide on the edge between two adjacent areas (and the normals to so
-there is continuity in the shading.)
-
-I then run a "tri-striper" program to connect up all the individual
-triangles into more efficient opengl strips.
-
-Finally I post process everything to compensate for bugs in our lousy
-tri-striper and to add in a few other things that our render requires.
-
-There is a wee bit of documentation at:
-
-http://www.menet.umn.edu/~curt/fgfs/Docs/Scenery/CoordinateSystem/CoordinateSystem.html
-
-Here I lay out our basic coordinate system.  Essentially the scenery
-tiles that result in the above process are just cutouts of the Earths
-surface.  The maintain the curved shape and spacial orientation.  The
-renderer translates everything to near (0,0,0) to compensate for
-GLfloat precision limitations.
-
-All the tools I use to do this are distributed with the FG source, so
-feel free to download them, play around, and ask questions.
-
-Our resulting scenery tile format is structured to facilitate view
-frustum culling on a per tile basis as well as a per "fragment" basis.
-
-The next thing I plan to work on is sorting by material properties.
-As I walk through the tile structures doing my view frustum culling,
-instead of immediately rendering the visible fragments, I plan to toss
-them into buckets by material property.  Then I make a pass through
-each of these buckets, rendering all the items with like properties.
-This should minimize opengl state and texture changes which should
-help keep the performance from going in the dumpster.
diff --git a/Docs/Scenery/SceneGeneration/trap.fig b/Docs/Scenery/SceneGeneration/trap.fig
deleted file mode 100644
index 546c94a80..000000000
--- a/Docs/Scenery/SceneGeneration/trap.fig
+++ /dev/null
@@ -1,16 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter 
-100.00
-Single
-0
-1200 2
-5 1 0 1 0 7 0 0 -1 0.000 0 1 0 0 6900.000 3304.688 5100 5700 6975 6300 8700 5700
-5 1 1 1 0 7 0 0 -1 4.000 0 0 0 0 6900.000 8100.000 5100 5700 6900 5100 8700 5700
-5 1 0 1 0 7 0 0 -1 4.000 0 0 0 0 6900.000 5175.000 5925 5100 6075 4650 6375 4350
-5 1 0 1 0 7 0 0 -1 4.000 0 0 0 0 8887.500 5062.500 6600 5325 6600 4800 6675 4425
-5 1 0 1 0 7 0 0 -1 4.000 0 1 0 0 6675.000 3975.000 5925 5100 6225 5250 6600 5325
-5 1 0 1 0 7 0 0 -1 4.000 0 1 0 0 6600.000 4087.500 6375 4350 6525 4425 6675 4425
-1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 6900 5700 1802 1802 6900 5700 8700 5775
diff --git a/Docs/Scenery/Sky/Sky.tex b/Docs/Scenery/Sky/Sky.tex
deleted file mode 100644
index acdca87fd..000000000
--- a/Docs/Scenery/Sky/Sky.tex
+++ /dev/null
@@ -1,224 +0,0 @@
-%
-% `Sky.tex' -- describes the sky rendering procedure
-%
-%  Written by Curtis Olson.  Started December, 1997.
-%
-% $Id$
-%------------------------------------------------------------------------
-
-
-\documentclass[12pt]{article}
-
-\usepackage{anysize}
-\papersize{11in}{8.5in}
-\marginsize{1in}{1in}{1in}{1in}
-
-\usepackage{amsmath}
-
-\usepackage{epsfig}
-
-\usepackage{setspace}
-\onehalfspacing
-
-\usepackage{url}
-
-
-\begin{document}
-
-
-\title{
-  Flight Gear Sky Representation and Rendering.
-}
-
-
-\author{
-    Curtis L. Olson\\ 
-    (\texttt{curt@me.umn.edu})
-}
-
-
-\maketitle
-
-
-\section{Introduction}
-
-No flight simulator should be without a nice sky that smoothly
-transitions into haze at the horizon.  Such a sky should also be able
-to render sunrise and sunset effects.  This document describes how we
-have implemented such a sky.
-
-\section{Overview}
-
-The sky is represent as a 12 sided dome (or upside down bowl if you
-prefer.)  Figure \ref{fig:dome} shows how a 6 sided dome might be
-constructed.
-
-\begin{figure}[hbt]
-  \centerline{                   
-      \psfig{file=dome.eps}
-  }
-  \caption{Simplified (6 Sided) Sky Dome}
-  \label{fig:dome}
-\end{figure}
-
-The center section can be constructed with a triangle fan.  The inner
-and outer ``skirts'' can be constructed with triangle strips.
-
-The colors of each vertex can be independently controlled to achieve
-sky to haze transitions, sunrise/sunset effects with a pinkish/oranges
-glow, and one side of the sky can easily be made brighter than the
-other.  By enabling smooth shading in OpenGL, the colors will be
-blended together for a very nice effect.
-
-
-\section{Implementation}
-
-This sections describes how the sky has been implemented in OpenGL.
-
-\subsection{Vertex Generation}
-
-The sky dome structure is intended to be centered over the current
-view point at sea level.  This way we could paste cloud textures on
-the dome if we liked.  So, we simply have to generate vertices for a
-fixed dome, and then use OpenGL calls to transform and rotate it to
-the desired place.  Please refer to the actual code
-(.../Src/Scenery/sky.c) for specifics, but
-to generate the vertices we simply create a 12 element array for the
-inner set of vertices, another 12 element array for the middle set of
-vertices and a last 12 element array for the outer set of vertices.
-
-\subsection{Vertex Coloring}
-
-For each vertex position array, there is a corresponding vertex color
-array.  This way we don't have to compute each vertex color every
-iteration.  Also, by being able to individually control the color at
-each vertex, we can do all sorts of nice sky to haze blending with
-dusk and dawn effects.  Again, please refer to the source
-(.../Src/Scenery/sky.c) for specific details on how the coloring is
-implemented.  However, here's the quick overview.
-
-\subsubsection{Day and Night Coloring}
-
-For the general middle of the day, or middle of the night sky, we
-already know the desired sky color, and the haze color.  This is
-computed elsewhere based on the current sun position.  During the
-night these colors are both nearly black.  During the dawn they are
-smoothly transitioned to day time colors.  And, during the dusk they
-are smoothly transitioned back to night time colors.
-
-The center of the dome is assigned the current sky color.  The color
-of the first inner ring of vertices is weighted 70\% towards the sky
-color and 30\% towards the fog color.
-
-Then color of the middle ring of vertices is weighted 10\% towards the
-sky color and 90\% towards the fog color.
-
-The the outer ring of vertices are assigned the current fog color.
-
-\subsubsection{Dusk and Dawn Effects}
-
-Dusk and dawn effects can be accomplished by controlling the color of
-the vertices.  Rather than trying to figure out which vertices are
-near the current sun position, I just rotate the dome so the 0'th
-vertex of each ring (and the center fan) align with the sun.  This
-makes it easier to calculate vertex colors.  But, there is a fair
-amount of work involved in calculating the proper dome rotation.
-
-\begin{figure}[hbt]
-  \centerline{                   
-      \psfig{file=earth.eps}
-  }
-  \caption{Overview of Earth}
-  \label{fig:earth}
-\end{figure}
-
-Figure \ref{fig:earth} shows an overview of the setup.  $P$, the
-current view position, and $\mathbf{n}$, the local ``up'' vector,
-define the plane which is tangent to the Earth's surface at point $P$.
-Just for a quick review of your linear algebra, given $\mathbf{v_0}$,
-the position vector of $P$ and $\mathbf{v}$, the position vector of
-some other arbitrary point on the plane, and $\mathbf{n}$, the normal
-to the plane, then the vector $\mathbf{n}$ and the vector $(\mathbf{v}
-- \mathbf{v_0})$ are orthogonal (perpendicular.)  If the two vectors
-are orthogonal then their dot product will be zero, so the following
-must be true:
-
-\begin{equation}
-  \mathbf{n} \cdot ( \mathbf{v} - \mathbf{v_0} ) = 0
-\end{equation}
-
-This is the vector equation of the plane and can be rewritten as:
-
-\begin{align}
-  a(x - x_0) + b(y - y_0) + c(z - z_0) &= 0 \\
-  ax + by + cz - (\mathbf{n} \cdot \mathbf{v_0}) &= 0
-\end{align}
-
-We want to find a vector $\mathbf{v}$ representing the
-direction along the current tangent plane towards the position on the
-Earth where the Sun is directly overhead.  The vector $\mathbf{u}$ is
-defined as $\vec{\mathbf{PS}}$.
-
-\begin{figure}[hbt]
-  \centerline{                   
-      \psfig{file=local.eps}
-  }
-  \caption{Vectors and Points in Local Coordinate System}
-  \label{fig:local}
-\end{figure}
-
-Figure \ref{fig:local} shows a more detailed ``local'' view of the
-points and vectors involved.  The point, $P$, is the current view
-point.  The vector, $\mathbf{n}$, is the local up vector.  $S$
-represents the current position on the Earth's surface where the Sun
-is directly overhead.  We want to find the vector, $\mathbf{v}$ which
-is a projection of $\mathbf{u}$ onto the plane defined by $P$ and
-$\mathbf{n}$.
-
-To do this we first calculate $\mathbf{u_1}$ which is the shortest
-distance from point $S$ to the tangent plane.
-
-\begin{equation}
-  \mathbf{u_1} = \frac { \mathbf{n} \cdot \mathbf{u} }
-             { {\| \mathbf{n} \|}^2 } \mathbf{n}
-\end{equation}
-
-Armed with $\mathbf{u_1}$ we can now calculate
-$\mathbf{v}$ which is the local surface direction on the tangent
-plane towards the sun, $S$.
-
-\begin{equation}
-  \mathbf{v} = \mathbf{v_0} + \mathbf{u} - \mathbf{u_1}
-\end{equation}
-
-Ok, so now we have $\mathbf{v}$, but the fun doesn't stop here.  Now
-we need to calculate a rotation angle $\theta$ about $\mathbf{n}$ to
-align our dome with $\mathbf{v}$.  The origin of the dome always
-aligns with a vector pointing directly South.  So, we need to repeat
-the above procedure to map a vector pointing straight down $( 0, 0,
--\mathbf{z} )$ onto our tangent plane to produce the local, surface,
-south vector $\mathbf{w}$.  We then take the $\arccos()$ of the dot product
-of $\mathbf{v}$ with $\mathbf{w}$.
-
-\begin{equation}
-  \theta = \arccos( \mathbf{v} \cdot \mathbf{w} )
-\end{equation}
-
-Whew, that gives us the angle we want.  Well almost, not quite.  The
-problem is that the dot product returns a number in the range of
-$(-1.0 \ldots 1.0)$. Thus, the $\arccos()$ function returns a $\theta$
-in the range of $(0.0 \ldots 180.0)$.  But this is not enough
-information to determine if $\mathbf{v}$ is in the east hemisphere or
-west hemisphere and if this angle should be positive or negative.
-
-So, to get that last piece of information we need, we can rotate the
-vector $\mathbf{w}$ by 90 degrees about $\mathbf{n}$.  This gives us
-the local surface east vector on the tangent plane.  Taking the dot
-product of $\mathbf{v}$ and the local east vector tells us which
-hemisphere $\mathbf{v}$ is in.  And, from this, we can uniquely
-determine the proper angle for the sky dome rotation.
-
-\end{document}
-
-
-%------------------------------------------------------------------------
diff --git a/Docs/Scenery/Sky/dome.fig b/Docs/Scenery/Sky/dome.fig
deleted file mode 100644
index aef865ca3..000000000
--- a/Docs/Scenery/Sky/dome.fig
+++ /dev/null
@@ -1,47 +0,0 @@
-#FIG 3.2
-Portrait
-Center
-Inches
-Letter 
-100.00
-Single
-0
-1200 2
-2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 0 0 7
-	 4800 2700 3375 3450 4050 4500 6600 4500 7725 3450 6750 2700
-	 4800 2700
-2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 0 0 8
-	 3375 3450 2700 4500 2400 5400 3300 7200 7500 7200 8700 5400
-	 8400 4500 7725 3450
-2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 0 0 4
-	 2700 4500 3450 5850 7200 5850 8400 4500
-2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 0 0 3
-	 3300 7200 3450 5850 4050 4500
-2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 0 0 3
-	 6600 4500 7200 5850 7500 7200
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
-	 3375 3450 3450 5850
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
-	 4050 4500 7200 5850
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
-	 6600 4500 8400 4500
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
-	 2700 4500 3300 7200
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
-	 3450 5850 7500 7200
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
-	 7200 5850 8700 5400
-2 1 2 1 0 7 0 0 -1 4.000 0 0 -1 0 0 4
-	 2700 4500 4125 3600 7275 3600 8400 4500
-2 1 2 1 0 7 0 0 -1 4.000 0 0 -1 0 0 3
-	 6750 2700 7275 3600 7350 4350
-2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 3
-	 4050 4500 5625 3075 6750 2700
-2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 3
-	 4800 2700 5625 3075 6600 4500
-2 1 2 1 0 7 0 0 -1 4.000 0 0 -1 0 0 4
-	 2400 5400 4050 4350 7350 4350 8700 5400
-2 1 2 1 0 7 0 0 -1 4.000 0 0 -1 0 0 3
-	 4050 4350 4125 3600 4800 2700
-2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 3
-	 3375 3450 5625 3075 7725 3450
diff --git a/Docs/Scenery/Sky/earth.fig b/Docs/Scenery/Sky/earth.fig
deleted file mode 100644
index fd19619ef..000000000
--- a/Docs/Scenery/Sky/earth.fig
+++ /dev/null
@@ -1,44 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter  
-100.00
-Single
--2
-1200 2
-5 1 0 2 0 7 0 0 -1 0.000 0 1 0 0 4800.000 -4650.000 2400 4800 4800 5100 7200 4800
-5 1 0 2 0 7 0 0 -1 0.000 0 0 0 0 14250.000 4800.000 4800 7200 4500 4800 4800 2400
-5 1 2 1 0 7 0 0 -1 3.000 0 1 0 0 -4650.000 4800.000 4800 7200 5100 4800 4800 2400
-5 1 2 1 0 7 0 0 -1 3.000 0 0 0 0 4800.000 14250.000 2400 4800 4800 4500 7200 4800
-1 3 0 2 0 7 0 0 -1 0.000 1 0.0000 4800 4800 2400 2400 4800 4800 7200 4800
-1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4800 4800 25 25 4800 4800 4820 4815
-1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6300 4200 25 25 6300 4200 6320 4215
-2 1 2 1 0 7 0 0 -1 3.000 0 0 -1 0 0 2
-	 4500 5100 5100 4500
-2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2
-	 6600 5400 7800 4200
-2 1 2 1 0 7 0 0 -1 3.000 0 0 -1 0 0 2
-	 2400 4800 7200 4800
-2 1 0 2 0 7 0 0 -1 6.000 0 0 -1 0 0 5
-	 6600 4200 6600 6600 7800 5400 7800 3000 6600 4200
-2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2
-	 7200 3600 7200 6000
-2 1 0 1 0 -1 0 0 20 4.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 7200 4800 6750 4200
-2 1 0 1 0 -1 0 0 20 4.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 7200 4800 6300 4200
-2 1 2 1 0 -1 0 0 20 3.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 6750 4200 6300 4200
-2 1 0 1 0 -1 0 0 20 4.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 7200 4800 8100 4800
-4 0 0 0 0 0 14 0.0000 4 105 105 8175 4875 n\001
-4 0 0 0 0 0 14 0.0000 4 150 120 7275 5025 P\001
-4 0 0 0 0 0 14 0.0000 4 105 105 6825 4200 v\001
-4 0 0 0 0 0 14 0.0000 4 195 645 5625 4275 S (Sun)\001
-4 0 0 0 0 0 14 0.0000 4 105 105 6375 4500 u\001
-4 0 0 0 0 0 14 0.0000 4 195 525 4800 5025 Origin\001
diff --git a/Docs/Scenery/Sky/local.fig b/Docs/Scenery/Sky/local.fig
deleted file mode 100644
index 1e5182924..000000000
--- a/Docs/Scenery/Sky/local.fig
+++ /dev/null
@@ -1,45 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter  
-100.00
-Single
--2
-1200 2
-1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 8700 21 21 4500 8700 4515 8715
-1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6900 8100 21 21 6900 8100 6915 8115
-1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6900 6600 21 21 6900 6600 6915 6615
-1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5700 6000 21 21 5700 6000 5715 6015
-2 1 0 2 0 7 0 0 -1 0.000 0 0 -1 0 0 5
-	 1800 7200 4200 4800 9600 4800 7200 7200 1800 7200
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
-	 4500 7200 6900 4800
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
-	 3000 6000 8400 6000
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 5700 6000 5700 4200
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 5700 6000 6900 8100
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 5700 6000 6900 6600
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	0 0 1.00 60.00 120.00
-	 6900 6600 6900 8100
-2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 4500 8700 5686 5994
-4 0 0 0 0 0 14 0.0000 4 105 105 6825 6450 v\001
-4 0 0 0 0 0 14 0.0000 4 195 645 6750 8325 S (Sun)\001
-4 0 0 0 0 0 14 0.0000 4 105 105 6975 7500 u\001
-4 0 0 0 0 0 10 0.0000 4 105 75 7080 7568 1\001
-4 0 0 0 0 0 14 0.0000 4 195 525 4200 8925 Origin\001
-4 0 0 0 0 0 14 0.0000 4 150 120 5475 5850 P\001
-4 0 0 0 0 0 10 0.0000 4 105 75 5550 5925 0\001
-4 0 0 0 0 0 14 0.0000 4 105 105 5625 6375 v\001
-4 0 0 0 0 0 10 0.0000 4 105 75 5700 6450 0\001
-4 0 0 0 0 0 14 0.0000 4 105 105 6450 7725 u\001
-4 0 0 0 0 0 14 0.0000 4 105 105 5625 4125 n\001
diff --git a/Docs/Serial/nmeafaq.txt b/Docs/Serial/nmeafaq.txt
deleted file mode 100644
index 8d1eaeb98..000000000
--- a/Docs/Serial/nmeafaq.txt
+++ /dev/null
@@ -1,635 +0,0 @@
-One place to find this document is at:
-
-    ftp://sundae.triumf.ca/pub/peter/nmeafaq.txt
-
----------------------------------------------------------------------------
-
-
-                                The NMEA FAQ
-                        Version 6.1  Sept. 15, 1997
-                            (NMEA URL updated)
-
-Additions, corrections, and comments should be emailed to the author,
-Peter Bennett  bennett@triumf.ca
-
-Contents:
-
-1.      What is NMEA?
-  1.1     What is an NMEA Standard
-  1.2     NMEA Address
-
-2.      Electrical Interface
-
-3.      NMEA-0180 and NMEA-0182
-  3.1     Simple Format
-  3.2     Complex Format
-
-4.      NMEA-0183
- 
-  4.1     General Sentence Format
-  4.2     Sentences sent by specific equipment
-  4.3     Sample Sentences Dissected
-    4.3.1   Standard Sentences
-    4.3.2   Garmin Proprietary Sentences
-
-5.      RS-232 connections
-
-6.      Troubleshooting
-
-7.      About the author
-  7.1    Acknowledgements
-
-1.      What is NMEA?
-
-        The National Marine Electronics Association is dedicated to the
-        education and advancement of the marine electronics industry and
-        the market which it serves.
-
-        It is a non-profit association composed of manufacturers,
-        distributors, dealers, educational institutions, and others
-        interested in peripheral marine electronics occupations
-                        (quoted from a promo in "NMEA News")
-
-
-  1.1   What is an NMEA standard?
-
-        For the purposes of this article, an NMEA standard defines an
-        electrical interface and data protocol for communications
-        between marine instrumentation. (They may also have standards
-        for other things.)
-
-  1.2   NMEA Address
-
-        P.O. Box 3435
-        New Bern NC, 28564-3435
-        U.S.A.
-        Phone: 919-638-2626
-        Fax:  919-638-4885
-        email: nmea@coastalnet.com
-        web page: http://www4.coastalnet.com/nmea/default.html
-
-
-2.      Electrical Interface
-
-        These standards allow a single "talker", and several "listeners"
-        on one circuit.  The recommended interconnect wiring is a
-        shielded twisted pair, with the shield grounded only at the
-        talker.  The standards do not specify the use of any particular
-        connector.
-
-
-        The NMEA-0180 and 0182 standards say that the talker output may
-        be RS-232, or from a TTL buffer, capable of delivering 10 mA at
-        4 V.  A sample circuit shows an open collector TTL buffer with a
-        680 ohm resistor to +12 V, and a diode to prevent the output
-        voltage from rising above +5.7 V.
-
-        NMEA-0183 accepts this, but recommends that the talker output
-        comply with EIA-422.  This is a differential system, having two
-        signal lines, A and B. The voltages on the "A" line correspond
-        to those on the older TTL single wire, while the "B" voltages
-        are reversed (while "A" is at +5, "B" is at ground, and vice
-        versa)
-
-        In either case, the recommended receive circuit uses an
-        opto-isolator with suitable protection circuitry.  The input
-        should be isolated from the receiver's ground.
-
-        In practice, the single wire, or the EIA-422 "A" wire may be
-        directly connected to a computer's RS-232 input.
-
-
-
-3.      NMEA-0180 and NMEA 0182
-
-        NMEA-0180 and 0182 are very limited, and just deal with
-        communcations from a Loran-C (or other navigation receiver,
-        although the standards specifically mention Loran), and an
-        autopilot.
-
-        From the information I have, it appears that 0180 and 0182 are
-        identical.  I suspect that equipment claiming to use NMEA-0180
-        will use the "simple" format described below, while those using
-        NMEA-0182 will use the "complex" format. (but this is really
-        just a guess... corrections??)
-
-  3.1   "Simple" data format
-
-        The simple format consists of a single data byte transmitted at
-        intervals of 0.8 to 5 seconds, at 1200 baud with odd parity.
-        Bits 5 - 0 give the cross-track error in units of 0.1 uS or 0.01
-        nautical mile.  The error is given in offset binary, with a
-        count of 1 representing full scale right error, 32 (hex 20) for
-        on course, and 63 (hex 3f) full scale left error.  Bit 6 is a 1
-        if the data is valid, and bit 7 is 0 to indicate the simple
-        data format.
-
-  3.2   "Complex" data format
-
-        The complex format consists of a data block of 37 bytes of
-        (mostly) readable ASCII text giving cross-track error, bearing
-        to waypoint, present Lat/Long, and a binary status byte.  The
-        data block shall be sent at intervals of 2 to 8 sec. All bytes
-        in the complex format have bit 7 = 1 to distinguish them from
-        the simple format.  It is permissible for a sending device to
-        send both simple and complex data, and even to send a "simple"
-        data byte in the middle of a "complex" data block.
-
-        Byte        Data
-          1          $
-          2          M                  | device
-          3          P                  | address
-
-          4          K = kilometres     | cross track
-                     N = nautical miles | error
-                     U = microseconds   | units
-
-          5 - 8      0 - 9 or .          cross track error value
-          9          L or R              cross track error position
-
-         10          T or M              True or Magnetic bearing
-         11 - 13     0 - 9               bearing to next waypoint
-
-         14 - 23     12D34'56"N or       present latitude
-                     12D34.56'N
-         24 - 34     123D45'56"W or      present longitude
-                     123D45.67"W
-
-         35          non-ASCII status byte
-                     bit 0 = 1 for manual cycle lock
-                         1 = 1     low SNR
-                         2 = 1     cycle jump
-                         3 = 1     blink
-                         4 = 1     arrival alarm
-                         5 = 1     discontinuity of TDs
-                         6 = 1 always
-          36         "NUL" character (hex 80)(reserved status byte)
-          37         "ETX" character (hex 83)
-          Any unavailable data is filled with "NUL" bytes.
-
-
-4.      NMEA-0183
- 
-  4.1     General Sentence Format
-
-        Under the NMEA-0183 standard, all characters used are printable
-        ASCII text (plus carriage return and line feed).  NMEA-0183 data
-        is sent at 4800 baud.
-
-        The data is transmitted in the form of "sentences".  Each
-        sentence starts with a "$", a two letter "talker ID", a three
-        letter "sentence ID", followed by a number of data fields
-        separated by commas, and terminated by an optional checksum, and
-        a carriage return/line feed.  A sentence may contain up to 82
-        characters including the "$" and CR/LF.
-
-        If data for a field is not available, the field is simply
-        omitted, but the commas that would delimit it are still sent,
-        with no space between them.
-
-        Since some fields are variable width, or may be omitted as
-        above, the receiver should locate desired data fields by
-        counting commas, rather than by character position within the
-        sentence.
-
-        The optional checksum field consists of a "*" and two hex digits
-        representing the exclusive OR of all characters between, but not
-        including, the "$" and "*".  A checksum is required on some
-        sentences.
-
-        The standard allows individual manufacturers to define
-        proprietary sentence formats.  These sentences start with "$P",
-        then a 3 letter manufacturer ID, followed by whatever data the
-        manufacturer wishes, following the general format of the
-        standard sentences.
-
-        Some common talker IDs are:
-                GP      Global Positioning System receiver
-                LC      Loran-C receiver
-                OM      Omega Navigation receiver
-                II      Integrated Instrumentation
-                                (eg. AutoHelm Seatalk system)
-
-  4.2   Sentences sent by specific equipment
-
-        This section lists the sentence types used by various equipment.
-        The format and data included in each sentence type is given in
-        section 4.3.
-
-         Eagle AccuNav
-             Standard: RMB, RMC, GLL, APB
-             Proprietary: PSLIB
-             It also pretends it's a Loran, sending LCGLL, as well as GPGLL
-
-        Garmin GPS-38, NMEA-0183 V. 1.5 mode
-            Standard: GLL, RMB, RMC, WPL, BOD, XTE, VTG, BWC
-            Proprietary: PGRMM (map datum), PGRMZ (altitude), PSLIB (dgps ctrl)
-
-        Garmin GPS-38, NMEA-0183 V. 2.0 mode
-            Standard: GLL, RMB, RMC, WPL, BOD, GSA, GSV, RTE, GGA
-            Proprietary: PGRME (estimated error), PGRMM, PGRMZ, PSLIB
-
-        Garmin GPS-45 (and probably GPS-40 and GPS-90)
-            Standard: BOD, GLL, RTE, RMB, RMC, GGA, GSA, GSV
-            Proprietary: PGRME, PGRMM, PGRMZ
-
-        Garmin GPS-65 (and probably GPS-75)
-            Standard: BWC, GLL, RMB, RMC, R00, WPL, XTE, VTG
-            Proprietary: PGRMM, PGRMZ, PSLIB
-
-        Magellan Trailblazer
-            Standard: APB, BWC, GGA, GLL, RMB, RMC, VTG
-        Trimble Ensign XL
-            Standard: APA, BWC, BWR, GGA, GLL, RMB
-
-        Trimble Flightmate Pro and Scoutmaster
-            Standard: APA, APB, BWC, GGA, GLL, GSA, GSV, RMB, RMC,
-                VTG, WCV, XTE, ZTC
-
-        Autohelm Seatalk
-            Autohelm Seatalk is a proprietary bus for communications
-            between various intruments.  Some of the instruments can act
-            as NMEA-0183 talkers or listeners.  Data received from an
-            external NMEA-0183 device will, if Seatalk understands the
-            sentence, be re-transmitted, but not necessarily in the same
-            sentence type.
-
-            The specific sentences sent will depend on the data
-            available on the Seatalk bus (i.e. sentences containing wind
-            speed and direction will only be sent if the system includes
-            a wind instrument)
-
-            Seatalk output:
-            Standard: APB, BPI, BWC, VWR, VHW, DBT, GLL, HDM, HDT, HCS,
-                MTW, VTG
-
-            Seatalk input:
-            Standard: APA, APB, RMB, XTE, XTR, BPI, BWR, BWC, BER,
-                BEC,WDR, WDC, BOD, WCV, VHW, VWR, DBT
-
-
-  4.3   Sample Sentences Dissected
-  4.3.1  Standard Sentences
-
-        A talker typically sends a group of sentences at intervals
-        determined by the unit's update rate, but generally not more
-        often than once per second.
-
-        Characters following the "*" are a checksum.  Checksums are
-        optional for most sentences, according to the standard.
-
-        APB - Autopilot format B
-        APB,A,A,0.10,R,N,V,V,011,M,DEST,011,M,011,M
-           A            Loran-C blink/SNR warning
-           A            Loran-C cycle warning
-           0.10         cross-track error distance
-           R            steer Right to correct (or L for Left)
-           N            cross-track error units - nautical miles
-           V            arrival alarm - circle
-           V            arrival alarm - perpendicular
-           011,M        magnetic bearing, origin to destination
-           DEST         destination waypoint ID
-           011,M        magnetic bearing, present position to destination
-           011,M        magnetic heading to steer
-                        (bearings could be given in True as 033,T)
-           (note: some pilots, Roberston in particular, misinterpret "bearing
-           from origin to destination" as "bearing from present position to
-           destination".  This apparently results in poor performance if the
-           boat is sufficiently off-course that the two bearings are
-           different.)
-
-        BOD - Bearing - origin to destination waypoint
-        BOD,045.,T,023.,M,DEST,START
-           045.,T       bearing 045 True from "START" to "DEST"
-           023.,M       breaing 023 Magnetic from "START" to "DEST"
-           DEST         destination waypoint ID
-           START        origin waypoint ID
-
-        BWC - Bearing and distance to waypoint - great circle
-        BWC,225444,4917.24,N,12309.57,W,051.9,T,031.6,M,001.3,N,004*29
-           225444       UTC time of fix 22:54:44
-           4917.24,N    Latitude of waypoint
-           12309.57,W   Longitude of waypoint
-           051.9,T      Bearing to waypoint, degrees true
-           031.6,M      Bearing to waypoint, degrees magnetic
-           001.3,N      Distance to waypoint, Nautical miles
-           004          Waypoint ID
-
-        BWR - Bearing and distance to waypoint - rhumb line
-                (format same as BWC)
-
-        DBT - Depth below transducer
-        DBT,0017.6,f,0005.4,M
-           0017.6,f     17.6 feet
-           0005.4,M     5.4 Metres
-
-        GGA - Global Positioning System Fix Data
-        GGA,123519,4807.038,N,01131.324,E,1,08,0.9,545.4,M,46.9,M, , *42
-           123519       Fix taken at 12:35:19 UTC
-           4807.038,N   Latitude 48 deg 07.038' N
-           01131.324,E  Longitude 11 deg 31.324' E
-           1            Fix quality: 0 = invalid
-                                     1 = GPS fix
-                                     2 = DGPS fix
-           08           Number of satellites being tracked
-           0.9          Horizontal dilution of position
-           545.4,M      Altitude, Metres, above mean sea level
-           46.9,M       Height of geoid (mean sea level) above WGS84
-                        ellipsoid
-           (empty field) time in seconds since last DGPS update
-           (empty field) DGPS station ID number
-
-        GLL - Geographic position, Latitude and Longitude
-        GLL,4916.45,N,12311.12,W,225444,A
-           4916.46,N    Latitude 49 deg. 16.45 min. North
-           12311.12,W   Longitude 123 deg. 11.12 min. West
-           225444       Fix taken at 22:54:44 UTC
-           A            Data valid
-             (Garmin 65 does not include time and status)
-
-        GSA - GPS DOP and active satellites
-        GSA,A,3,04,05,,09,12,,,24,,,,,2.5,1.3,2.1*39
-           A            Auto selection of 2D or 3D fix (M = manual)
-           3            3D fix
-           04,05...     PRNs of satellites used for fix (space for 12)
-           2.5          PDOP (dilution of precision)
-           1.3          Horizontal dilution of precision (HDOP)
-           2.1          Vertical dilution of precision (VDOP)
-             DOP is an indication of the effect of satellite geometry on
-             the accuracy of the fix.
-
-        GSV - Satellites in view
-        GSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75
-           2            Number of sentences for full data
-           1            sentence 1 of 2
-           08           Number of satellites in view
-           01           Satellite PRN number
-           40           Elevation, degrees
-           083          Azimuth, degrees
-           46           Signal strength - higher is better
-           
-                There my be up to three GSV sentences in a data packet
-
-        HDM - Heading, Magnetic
-        HDM,235.,M
-           HDM          Heading, Magnetic
-           235.,M       Heading 235 deg. Magnetic
-            (HDG, which includes deviation and variation, is recommended
-            instead)
-
-        HSC - Command heading to steer
-        HSC,258.,T,236.,M
-           258.,T       258 deg. True
-           236.,M       136 deg. Magnetic
-
-        MTW - Water temperature, Celcius
-        MTW,11.,C
-           11.,C        11 deg. C
-
-        R00 - List of waypoint IDs in currently active route
-        R00,MINST,CHATN,CHAT1,CHATW,CHATM,CHATE,003,004,005,006,007,,,*05
-           (This sentence is produced by a Garmin 65, but is not listed
-           in Version 2.0 of the standard.  The standard lists RTE for
-           this purpose.)
-
-        RMB - Recommended minimum navigation information (sent by nav.
-                receiver when a destination waypoint is active)
-        RMB,A,0.66,L,003,004,4917.24,N,12309.57,W,001.3,052.5,000.5,V*0B
-           A            Data status A = OK, V = warning
-           0.66,L       Cross-track error (nautical miles, 9.9 max.),
-                                steer Left to correct (or R = right)
-           003          Origin waypoint ID
-           004          Destination waypoint ID
-           4917.24,N    Destination waypoint latitude 49 deg. 17.24 min. N
-           12309.57,W   Destination waypoint longitude 123 deg. 09.57 min. W
-           001.3        Range to destination, nautical miles
-           052.5        True bearing to destination
-           000.5        Velocity towards destination, knots
-           V            Arrival alarm  A = arrived, V = not arrived
-           *0B          mandatory checksum
-
-        RMC - Recommended minimum specific GPS/Transit data
-        RMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68
-           225446       Time of fix 22:54:46 UTC
-           A            Navigation receiver warning A = OK, V = warning
-           4916.45,N    Latitude 49 deg. 16.45 min North
-           12311.12,W   Longitude 123 deg. 11.12 min West
-           000.5        Speed over ground, Knots
-           054.7        Course Made Good, True
-           191194       Date of fix  19 November 1994
-           020.3,E      Magnetic variation 20.3 deg East
-           *68          mandatory checksum
-
-        RTE - Waypoints in active route
-        RTE,2,1,c,0,W3IWI,DRIVWY,32CEDR,32-29,32BKLD,32-I95,32-US1,BW-32,BW-198*69
-           2            two sentences for full data
-           1            this is sentence 1 of 2
-           c            c = complete list of waypoints in this route
-                        w = first listed waypoint is start of current leg
-           0            Route identifier
-           W3IWI...     Waypoint identifiers
-
-        VHW - Water speed and heading
-        VHW,259.,T,237.,M,05.00,N,09.26,K
-           259.,T       Heading 259 deg. True
-           237.,M       Heading 237 deg. Magnetic
-           05.00,N      Speed 5 knots through the water
-           09.26,K      Speed 9.26 KPH
-
-        VWR - Relative wind direction and speed
-        VWR,148.,L,02.4,N,01.2,M,04.4,K
-           148.,L       Wind from 148 deg Left of bow
-           02.4,N       Speed 2.4 Knots
-           01.2,M       1.2 Metres/Sec
-           04.4,K       Speed 4.4 Kilometers/Hr
-
-        VTG - Track made good and ground speed
-        VTG,054.7,T,034.4,M,005.5,N,010.2,K
-           054.7,T      True track made good
-           034.4,M      Magnetic track made good
-           005.5,N      Ground speed, knots
-           010.2,K      Ground speed, Kilometers per hour
-
-        WCV - Waypoint Closure Velocity
-        WDC - Distance to Waypoint
-        WDR - Waypoint Distance, Rhumb Line
-
-        WPL - waypoint location
-        WPL,4917.16,N,12310.64,W,003*65
-           4917.16,N    Latitude of waypoint
-           12310.64,W   Longitude of waypoint
-           003          Waypoint ID
-             When a route is active, this sentence is sent once for each
-             waypoint in the route, in sequence. When all waypoints have
-             been reported, GPR00 is sent in the next data set. In any
-             group of sentences, only one WPL sentence, or an R00
-             sentence, will be sent.
-
-        XTE - Cross track error, measured
-        XTE,A,A,0.67,L,N
-           A            General warning flag V = warning
-                                (Loran-C Blink or SNR warning)
-           A            Not used for GPS (Loran-C cycle lock flag)
-           0.67         cross track error distance
-           L            Steer left to correct error (or R for right)
-           N            Distance units - Nautical miles
-
-        XTR - Cross-Track Error - Dead Reckoning
-        XTR,0.67,L,N
-           0.67         cross track error distance
-           L            Steer left to correct error (or R for right)
-           N            Distance units - Nautical miles
-
-
-4.3.2  Proprietary Sentences
-
-        The following are Garmin proprietary sentences.  "P" denotes
-        proprietary, "GRM" is Garmin's manufacturer code, and "M" or "Z"
-        indicates the specific sentence type.
-
-        $PGRME,15.0,M,45.0,M,25.0,M*22
-           15.0,M       Estimated horizontal position error in metres (HPE)
-           45.0,M       Estimated vertical error (VPE) in metres
-           25.0,M       Overall spherical equivalent position error
-
-        $PGRMZ,93,f,3*21
-           93,f         Altitude in feet
-           3            Position fix dimensions 2 = user altitude
-                                                3 = GPS altitude
-        This sentence shows in feet, regardless of units shown on the display.
-
-        $PGRMM,NAD27 Canada*2F
-           Currently active horizontal datum
-
-        Proprietary sentences to control a Starlink differential beacon
-        receiver. (I assume Garmin's DBR is made by Starlink)
-        $PSLIB,,,J*22
-        $PSLIB,,,K*23
-           These two sentences are normally sent together in each group
-           of sentences from the GPS.
-           The three fields are: Frequency, bit Rate, Request Type.  The
-           value in the third field may be:
-                J = status request
-                K = configuration request
-                blank = tuning message
-
-           When the GPS receiver is set to change the DBR frequency or
-           baud rate, the "J" sentence is replaced (just once) by (for
-           example): $PSLIB,320.0,200*59 to set the DBR to 320 KHz, 200
-           baud.
-    
-5.      RS-232 connections
-
-        Although this is not really related to NMEA, many people want to
-        connect a GPS to a computer, so need to know about the RS-232
-        serial ports on a computer.
-
-        The RS-232 standard defines two classes of devices that may
-        communicate using RS-232 serial data - Data Terminal Equipment
-        (DTE), and Data Communication Equipment (DCE).  Computers and
-        terminals are considered DTE, while modems are DCE.  The
-        standard defines pinouts for DTE and DCE such that a "straight
-        through" cable (pin 2 to pin 2, 3 to 3, etc) can be used between
-        a DTE and DCE.  To connect two DTEs together, you need a "null
-        modem" cable, that swaps pins between the two ends (eg. pin 2 to
-        3, 3 to 2).  Unfortunately, there is sometimes disagreement
-        whether a certain device is DTE or DCE, hence my standard RS-232
-        disclaimer:
-                if it doesn't work, swap pins 2 and 3!
-
-        The standard RS-232 connector is a 25 conductor DB-25, although
-        many PCs (and some other equipment) now use a 9 pin DE-9 (often
-        incorrectly called DB-9)
-
-        Serial Port Connections
-        Computer (DTE)                              Modem
-        DB-25   DE-9   Signal          Direction    DB-25
-          2      3    Tx Data             ->          2
-          3      2    Rx Data             <-          3
-          4      7    Request to send     ->          4
-          5      8    Clear to send       <-          5
-          6      6    Data Set Ready      <-          6
-          7      5    signal ground                   7
-          8      1    Data CarrierDetect  <-          8
-         20      4    Data Terminal Ready ->          20
-         22      9    Ring Indicator      <-          22
-
-        For NMEA-0183 interfacing, we are only concerned with Rx Data,
-        signal ground (and possibly Tx Data, if we want the computer to
-        talk to the GPS)
-
-        NMEA-0183 data is sent at 4800 baud.
-
-6.  Troubleshooting
-
-        First check that the talker (usually GPS or Loran) can send
-        NMEA-0183, and determine what sentences it sends.  Also, verify
-        that the listener understands NMEA-0183, and that it understands
-        the sentences the talker is sending.  In some cases the same
-        information may be sent in two or more different sentences.  If
-        the talker and listener don't both use the same sentences, there
-        will be no communication.  It may be possible to change the
-        sentences sent by the talker, to match those understood by the
-        listener.
-
-        Next, check that the talker is indeed set to send NMEA-0183
-        data.  Some talkers may have provision to send NMEA-0180 or
-        0182, or some proprietary format.
-
-        A computer, using any convenient terminal program (Telix,
-        Procomm, Windows Terminal, etc.) set to 4800 baud, can be used
-        to monitor the NMEA data, and confirm what sentences are sent,
-        and that the data is in the correct format.
-        Verify that the wiring is correct - that the talker data output
-        is connected to the listener data input, and that a signal
-        ground line is connected between the two pieces of equipment.
-
-        If you have multiple listeners connected to a single talker, you
-        may be overloading the talker port.  Try connecting only one
-        listener at a time.
-
-        On any NMEA-0183 circuit, there can _only_ be one talker.  If
-        you must have more than one talker, and one of the talker
-        devices can also act as a listener, you may be able to connect
-        things "in series", so a talker-only output is connected to a
-        listener/talker input, and the listener/talker output is
-        connected to other listeners.  However, some listener/talker
-        devices may reformat the data, or only pass data they
-        understand. (The Autohelm Seatalk system does this, and claims
-        the data as it's own, starting all output sentences with "$II".)
-
-        Particularly with older equipment, the equipment may claim to
-        comply with NMEA-0183, but in fact have an error in the data
-        format.  (My Kings 8001 Loran-C claims to send an APB sentence,
-        but gets some of the fields in the wrong order, so my autopilot
-        can't understand it.)  This sort of problem can be verified by
-        capturing the NMEA-0183 data on a computer, and comparing the
-        data formats with those given above.
-
-
-7.  About the author
-
-        This FAQ was written by:
-                Peter Bennett
-                bennett@triumf.ca
-
-        I have an FTP site containing this file, a GPS FAQ, and other
-        NMEA information files and PC programs for capturing and
-        displaying NMEA data, and related things:
-
-                ftp://sundae.triumf.ca/pub/peter/index.html
-        This site is mirrored in Germany at:
-        ftp://ftp-i2.informatik.rwth-aachen.de/pub/arnd/GPS/peter/index.html
-
-7.1  Acknowlegments
-
-        I would like to thank the following for their contributions
-         or corrections to this document:
-             Tom Clark, clark@tomcat.gsfc.nasa.gov
-             Bob Shearer, t.shearer@unixa.nerc-wallingford.ac.uk
-             David Steckler, davidst@nobeltec.com
-             Karl Olmstead, olmstead@ridgecrest.ca.us
-             Dave Wells, KD6TO, davew@cruzio.com
-             Mike Morrow, caveman@castles.com
-
-
diff --git a/Docs/Time/Events/Events.tex b/Docs/Time/Events/Events.tex
deleted file mode 100644
index e250acd5b..000000000
--- a/Docs/Time/Events/Events.tex
+++ /dev/null
@@ -1,148 +0,0 @@
-%
-% `Events.tex' -- describes the FG Event Manager
-%
-%  Written by Curtis Olson.  Started December, 1997.
-%
-% $Id$
-%------------------------------------------------------------------------
-
-
-\documentclass[12pt]{article}
-
-\usepackage{anysize}
-\papersize{11in}{8.5in}
-\marginsize{1in}{1in}{1in}{1in}
-
-\usepackage{amsmath}
-
-\usepackage{epsfig}
-
-\usepackage{setspace}
-\onehalfspacing
-
-\usepackage{url}
-
-
-\begin{document}
-
-
-\title{
-  Flight Gear Periodic Event Manager and Scheduler
-}
-
-
-\author{
-    Curtis L. Olson\\ 
-    (\texttt{curt@me.umn.edu})
-}
-
-
-\maketitle
-
-
-\section{Introduction}
-
-Many tasks within the simulator need to only run periodically.  These
-are typically tasks that calculate values that don't change
-significantly in 1/60th of a second, but instead change noticeably on
-the order of seconds, minutes, or hours.
-
-Running these tasks every iteration would needless degrade
-performance.  Instead, we would like to spread these out over time to
-minimize the impact they might have on frame rates, and minimize the
-chance of pauses and hesitations.
-
-\section{Overview}
-
-The goal of the event manager is to provide a way for events to be run
-periodically, and to spread this load out so that the processing time
-spent at any particular iteration is minimized.
-
-The scheduler consists of two parts.  The first part is simply a list
-of registered events along with any management information associated
-with that event.  The second part is a run queue.  When events are
-triggered, they are placed in the run queue.  The system executes only
-one pending event per iteration in order to balance the load.
-
-\section{The Events List}
-
-\subsection{Event List Structure}
-
-All registered events are maintained in a list.  Currently, this list
-is simply an array of event structures.  Each event structure stores
-the following information.
-
-\begin{itemize}
-  \item An ASCII description or event identifier.  This is used when
-    outputting event statistics.
-
-  \item A pointer to the event function.
-
-  \item An event status flag.  The flag marks the process as ready to
-    run, queued in the run queue, or suspended from eligibility to
-    run.
-    
-  \item A time interval specifying how often to schedule and run this
-    event.
-                      
-  \item The absolute time this event was last run.
-  
-  \item The next absolute time this event is scheduled to run.
-    
-  \item The cumulative run time for this process (in ms.)
-    
-  \item The least time consumed by a single run of this event (in ms.)
-
-  \item The most time consumed by a single run of this event (in ms.)
-
-  \item The number of times this event has been run.
-\end{itemize}
-
-\subsection{Event List Operation}
-
-To use the event list, you must first initialize it by calling
-\texttt{fgEventInit()}.  
-
-Once the list has been initialized, you can register events by calling
-\texttt{fgEventRegister()}.  A typical usage might be:
-\texttt{fgEventRegister(``fgUpdateWeather()'', fgUpdateWeather,
-  FG\_EVENT\_READY, 60000)}.  This tells the event manager to schedule
-and run the event, \texttt{fgUpdateWeather()}, every 60 seconds.  The
-first field is an ASCII description of the function, the second field
-is a pointer to the function, the third field is the status flag, and
-the last field is the time interval.  Event functions should return
-\texttt{void} and accept no parameters.  The status flag can set to
-either \texttt{FG\_EVENT\_SUSP}, \texttt{FG\_EVENT\_READY}, or
-\texttt{FG\_EVENT\_QUEUED}.  \texttt{FG\_EVENT\_SUSP} means register
-the event, but never schedule it to run.  \texttt{FG\_EVENT\_READY}
-means register the event and schedule and run it normally.
-\texttt{FG\_EVENT\_QUEUED} is mostly used internally so that an event
-will never have more than one entry in the run queue.
-
-Finally, in your main loop, you must add a call to
-\texttt{fgEventProcess()} to run it every iteration.  This routine
-will schedule all pending events (push them onto the run queue) and
-then execute the first thing in the run queue.
-
-\section{The Run Queue}
-
-The run queue is a very simple queue who's elements are just a pointer
-to an event list element.  When an event needs to be scheduled, a
-pointer to that event is pushed onto the back of the queue.  Each time
-\texttt{fgEventProcess()} is called, the first element on the run
-queue will be executed.
-
-\section{Profiling Events}
-
-As stated before, each event record contains simple event statistics
-such as the total time spent running this event, the quickest run, the
-slowest run, and the total number of times run.  We can output the
-list of events along with these statistics in order to determine if any of
-them are consuming an excessive amount of time, or if there is any
-chance that a particular event could run slow enough to be responsible
-for a perceived hesitation or pause in the flow of the simulation.
-
-\end{document}
-
-
-%------------------------------------------------------------------------
diff --git a/Hints/aaa b/Hints/aaa
deleted file mode 100644
index 45744f164..000000000
--- a/Hints/aaa
+++ /dev/null
@@ -1,306 +0,0 @@
-From fatcity!root@news.cts.com  Wed Aug 20 16:34:24 1997
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["3412" "Wed" "20" "August" "1997" "14:14:39" "-0800" "Steve Baker" "steve@mred.bgm.link.com" nil "83" "Re: culling with view frustrum before view transformation" "^From:" nil nil "8" nil nil nil nil nil]
-	nil)
-Received: from mailhub.cts.com (mailhub.cts.com [204.216.216.130])
-	by meserv.me.umn.edu (8.8.6/8.8.6) with SMTP id QAA04291
-	for ; Wed, 20 Aug 1997 16:34:23 -0500 (CDT)
-Received: from donews.cts.com(really [192.188.72.21]) by mailhub.cts.com
-	via smail with smtp
-	id 
-	for ; Wed, 20 Aug 97 14:25:48 -0700 (PDT)
-	(Smail-3.1.92 1996-Mar-19 #3 built 1996-Apr-21)
-Received: from fatcity by donews.cts.com with uucp
-	(Smail3.1.29.1 #5) id m0x1IG4-000007a; Wed, 20 Aug 97 14:25 PDT
-Received: by fatcity.com (06-Aug-97/v1.0d-b55/bab) via UUCP id 0C90BB6D; Wed, 20 Aug 1997 14:14:39 -0800
-Message-ID: 
-X-Comment: OpenGL Game Developers Mailing List
-X-Sender: steve@mred.bgm.link.com (Steve Baker)
-Reply-To: OPENGL-GAMEDEV-L@fatcity.com
-Errors-To: ML-ERRORS@fatcity.com
-Mime-Version: 1.0
-Content-Type: text/plain; charset="us-ascii"
-Content-Transfer-Encoding: 7bit
-Organization: Fat City Network Services, San Diego, California
-X-ListServer: v1.0d, build 55; ListGuru (c) 1996-1997 Bruce A. Bergman
-Precedence: bulk
-From: steve@mred.bgm.link.com (Steve Baker)
-Sender: root@fatcity.com
-To: Multiple recipients of list OPENGL-GAMEDEV-L 
-Subject: Re: culling with view frustrum before view transformation
-Date: Wed, 20 Aug 1997 14:14:39 -0800
-
-> >Brian Hook wrote:
-> >> You can do bounding spheres,
-> >> bounding boxes, or a combination of both (sphere first, then box).
-> >
-> >Which is faster to test for being completely inside, outside, or
-> >partial, of the view frustrum?
-> 
-> Obviously bounding sphere will be the fastest, but since it's, well, a
-> sphere, it's not going to be particularly accurate (since it's rotationally
-> invariant).  
-> 
-> if ( distance( obj.position, plane ) >= obj_sphere.radius )
->    trivial_reject = true;
-> 
-> (I assume you also check the sign of the distance)
-
-I echo your sentiments that bounding spheres are the fastest approach to
-culling to FOV frustum - also for some kinds of collision detection.
-
-The most important thing to bear in mind about culling is that the first
-trivial-reject test you apply is by far the most time-critical. This test
-is always applied to more nodes than any of the subsequent tests.
-
-So, do the cheapest test first.
-
-This is typically the NEAR plane test. Everything behind the viewers head
-gets chopped out - and it's an especially cheap test.
-
-   if ( obj_sphere.center.z < near_plane - obj_sphere.radius )
-     REJECT!!
-
-...next do the second cheapest test (assuming you know that your database
-could possibly beyond the far clip plane)...
-
-   if ( obj_sphere.center.z - obj_sphere.radius > far_plane )
-     REJECT!!
-
-...and *then* do...
-
-   if ( distance( obj.position, plane ) >= obj_sphere.radius )
-     REJECT!!
-
-It's also useful to know that in many applications, you cull more objects from
-the left and right faces of the frustum than you do from the top and bottom - so
-test left, then right, then bottom then top.
-
-Also, with bounding sphere tests, you shouldn't forget to do total-accept
-as well as total-reject tests. Once you know that an object's sphere is
-TOTALLY on screen, you don't have to descend into the daughter objects to
-cull-test them...you *know* they are all on-screen.
-
-Another way to look at that it to remember which of the six possible plane tests
-didn't even touch the sphere - as you work your way down the object hierarchy,
-you can accumulate those flags and avoid even testing those planes that a parent
-sphere has already cleanly passed. If you do this then a vast percentage of
-your spheres will only need to be tested against one plane.
-
-Sphere-based culling can be extremely cost-effective. It's so cheap that even if
-you feel the need to use a bounding cubeoid (or even a yet more complex shape),
-it's still worth doing a sphere-based cull first just to get rid of the trivial
-accept and reject cases.
-
-
-Steve Baker                     817-619-1361 (Vox-Lab)
-Hughes Training Inc.            817-619-8776 (Vox-Office/Vox-Mail)
-2200 Arlington Downs Road       817-619-4028 (Fax)
-Arlington, Texas. TX 76005-6171 Steve@MrEd.bgm.link.com (eMail)
-http://www.hti.com              http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
--- 
-Author: Steve Baker
-  INET: steve@mred.bgm.link.com
-
-Fat City Network Services    -- (619) 538-5030
-San Diego, California        -- Public Internet Access
--------------------------------------------------------------------
-To REMOVE yourself from this mailing list, send an E-Mail message
-to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
-the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
-(or the name of mailing list you want to be removed from).
-
-From fatcity!root@news.cts.com  Thu Aug 21 09:19:20 1997
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["2834" "Thu" "21" "August" "1997" "07:00:54" "-0800" "Steve Baker" "steve@mred.bgm.link.com" nil "77" "Re: culling with view FRUSTUM before view transformation" "^From:" nil nil "8" nil nil nil nil nil]
-	nil)
-Received: from mailhub.cts.com (mailhub.cts.com [204.216.216.130])
-	by meserv.me.umn.edu (8.8.6/8.8.6) with SMTP id JAA02567
-	for ; Thu, 21 Aug 1997 09:19:20 -0500 (CDT)
-Received: from donews.cts.com(really [192.188.72.21]) by mailhub.cts.com
-	via smail with smtp
-	id 
-	for ; Thu, 21 Aug 97 07:16:00 -0700 (PDT)
-	(Smail-3.1.92 1996-Mar-19 #3 built 1996-Apr-21)
-Received: from fatcity by donews.cts.com with uucp
-	(Smail3.1.29.1 #5) id m0x1Y1f-0000Qaa; Thu, 21 Aug 97 07:15 PDT
-Received: by fatcity.com (06-Aug-97/v1.0d-b55/bab) via UUCP id 0C90BDD1; Thu, 21 Aug 1997 07:00:54 -0800
-Message-ID: 
-X-Comment: OpenGL Game Developers Mailing List
-X-Sender: steve@mred.bgm.link.com (Steve Baker)
-Reply-To: OPENGL-GAMEDEV-L@fatcity.com
-Errors-To: ML-ERRORS@fatcity.com
-Mime-Version: 1.0
-Content-Type: text/plain; charset="us-ascii"
-Content-Transfer-Encoding: 7bit
-Organization: Fat City Network Services, San Diego, California
-X-ListServer: v1.0d, build 55; ListGuru (c) 1996-1997 Bruce A. Bergman
-Precedence: bulk
-From: steve@mred.bgm.link.com (Steve Baker)
-Sender: root@fatcity.com
-To: Multiple recipients of list OPENGL-GAMEDEV-L 
-Subject: Re: culling with view FRUSTUM before view transformation
-Date: Thu, 21 Aug 1997 07:00:54 -0800
-
-> OK, this is probably explained in books etc., but what is the fastest way
-> to find the distance between a point and a plane?
-
-A plane can be represented by the equation
-
-     Ax + By + Cz + D = 0 ;
-
-A,B,C is just the surface normal of the plane and D is the shortest
-distance from the origin to the plane.
-
-So, if you need to find the distance of a point from the plane, just
-imagine a new plane that goes through your test point and is parallel
-to the plane you want to test. The plane equation of that new plane would be:
-
-     A'x + B'y + C'z + D' = 0 ;
-
-Since the two planes are parallel, their surface normals are the same, so
-
-   A' == A
-   B' == B
-   C' == C
-   D' == D + distance_between_the_two_planes
-
-...the only thing that's different is their D values - which differ by the
-distance of your test point from the original plane.
-
-So, for a point (x,y,z), the distance from the plane (A,B,C,D) is
-
-   dist = D' - D
-        = -A'x - B'y - C'z - D
-        = -Ax - By - Cz - D
-        = -( [ABC]dot[xyz] + D )
-
-That's the general result - but culling to the view frustum is a very
-special case...if you are working in eye-relative coordinates (IMHO this
-is best), then since all top,bot,left,right planes of the frustum meet
-at the eye - and since the eye is at the origin (by definition), then
-D is always zero for those plane and that saves you a subtract.
-
-If you are feeling even more in need of optimisation - then you can save one
-multiply per plane by realising that (for rectangular screens) one of the
-three components of the plane equation will always be zero.
-
-  eg for the LEFT clip plane, the Y component of the normal of the plane
-     is zero, so the distance to the left or right plane is just
-
-        - ( A x' + C z' )
-
-     and to the top or bottom plane it's just:
-
-        - ( A x' + B y' )
-
-     Since you are only using this for culling, you don't need the minus sign
-     so the cost of a test can be as little as two multiplies and one add
-     per plane.
-
-
-Steve Baker                     817-619-1361 (Vox-Lab)
-Hughes Training Inc.            817-619-8776 (Vox-Office/Vox-Mail)
-2200 Arlington Downs Road       817-619-4028 (Fax)
-Arlington, Texas. TX 76005-6171 Steve@MrEd.bgm.link.com (eMail)
-http://www.hti.com              http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
--- 
-Author: Steve Baker
-  INET: steve@mred.bgm.link.com
-
-Fat City Network Services    -- (619) 538-5030
-San Diego, California        -- Public Internet Access
--------------------------------------------------------------------
-To REMOVE yourself from this mailing list, send an E-Mail message
-to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
-the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
-(or the name of mailing list you want to be removed from).
-
-From fatcity!root@news.cts.com  Fri Aug 22 08:51:10 1997
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["2087" "Fri" "22" "August" "1997" "06:31:24" "-0800" "Steve Baker" "steve@mred.bgm.link.com" nil "47" "Re: culling with view FRUSTUM before view transformation" "^From:" nil nil "8" nil nil nil nil nil]
-	nil)
-Received: from mailhub.cts.com (mailhub.cts.com [204.216.216.130])
-	by meserv.me.umn.edu (8.8.6/8.8.6) with SMTP id IAA21767
-	for ; Fri, 22 Aug 1997 08:51:09 -0500 (CDT)
-Received: from donews.cts.com(really [192.188.72.21]) by mailhub.cts.com
-	via smail with smtp
-	id 
-	for ; Fri, 22 Aug 97 06:46:19 -0700 (PDT)
-	(Smail-3.1.92 1996-Mar-19 #3 built 1996-Apr-21)
-Received: from fatcity by donews.cts.com with uucp
-	(Smail3.1.29.1 #5) id m0x1u2a-0000PHa; Fri, 22 Aug 97 06:46 PDT
-Received: by fatcity.com (06-Aug-97/v1.0d-b55/bab) via UUCP id 0C90C1C4; Fri, 22 Aug 1997 06:31:24 -0800
-Message-ID: 
-X-Comment: OpenGL Game Developers Mailing List
-X-Sender: steve@mred.bgm.link.com (Steve Baker)
-Reply-To: OPENGL-GAMEDEV-L@fatcity.com
-Errors-To: ML-ERRORS@fatcity.com
-Mime-Version: 1.0
-Content-Type: text/plain; charset="us-ascii"
-Content-Transfer-Encoding: 7bit
-Organization: Fat City Network Services, San Diego, California
-X-ListServer: v1.0d, build 55; ListGuru (c) 1996-1997 Bruce A. Bergman
-Precedence: bulk
-From: steve@mred.bgm.link.com (Steve Baker)
-Sender: root@fatcity.com
-To: Multiple recipients of list OPENGL-GAMEDEV-L 
-Subject: Re: culling with view FRUSTUM before view transformation
-Date: Fri, 22 Aug 1997 06:31:24 -0800
-
-> > > Actually, I find it easier to scale the whole such that D = 1, then you
-> > > only need to store the non-degenerate (A', B', C') vector (i.e., A' =
-> > > A/D, etc...).  Storing a already-normalized (A, B, C) + D quadruple is
-> > > worth it only if you know before hand that the planes will never be
-> > > scaled before their normals are used.  In the general case where a
-> > > scaling is possible, you'll have to renormalize anyway.
-> > 
-> > Normally, I might agree with you - but in the case of Frustum clipping,
-> > scaling the normal by dividing by 'D' is a bad move since D==0 in the
-> > case of all four 'interesting' planes. :-)
-> 
-> Interesting point. This is of course only true when the eyepoint is in
-> the origin, which brings us back to the issue of clipping before or
-> after the modelview transformation.
- 
-Well - that's a dangerous thing to assume - I mean, the eye might just happen
-to move to the true world coordinate origin (by flook) and crash your program
-with a bunch of divide by zero errors.
-
-In any case, you are going to run into nasty precision problems as your eye
-approaches the origin - even if it doesn't reach it.
-
-> Learn something new every day.... :-)
-
-...Forget something important every night... :-)
-
-
-Steve Baker                     817-619-1361 (Vox-Lab)
-Hughes Training Inc.            817-619-8776 (Vox-Office/Vox-Mail)
-2200 Arlington Downs Road       817-619-4028 (Fax)
-Arlington, Texas. TX 76005-6171 Steve@MrEd.bgm.link.com (eMail)
-http://www.hti.com              http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
--- 
-Author: Steve Baker
-  INET: steve@mred.bgm.link.com
-
-Fat City Network Services    -- (619) 538-5030
-San Diego, California        -- Public Internet Access
--------------------------------------------------------------------
-To REMOVE yourself from this mailing list, send an E-Mail message
-to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
-the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
-(or the name of mailing list you want to be removed from).
-
diff --git a/Hints/endian-ness b/Hints/endian-ness
deleted file mode 100644
index 8800ebd4d..000000000
--- a/Hints/endian-ness
+++ /dev/null
@@ -1,71 +0,0 @@
-From fatcity!root@news.cts.com  Fri May 15 08:52:18 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["1426" "Fri" "15" "May" "1998" "06:30:53" "-0800" "Steve Baker" "sbaker@link.com" nil "39" "Re: Endian swapping" "^From:" nil nil "5" nil nil nil nil nil]
-	nil)
-Received: from mh2.cts.com (root@mh2.cts.com [205.163.24.68])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id IAA18883
-	for ; Fri, 15 May 1998 08:52:18 -0500 (CDT)
-Received: from king.cts.com (root@king.cts.com [198.68.168.21]) by mh2.cts.com (8.8.7/8.8.5) with ESMTP id GAA12800; Fri, 15 May 1998 06:52:14 -0700 (PDT)
-Received: from donews.cts.com (root@donews.cts.com [192.188.72.21])
-	by king.cts.com (8.8.7/8.8.7) with SMTP id GAA18786;
-	Fri, 15 May 1998 06:52:13 -0700 (PDT)
-Received: from fatcity by donews.cts.com with uucp
-	(Smail3.1.29.1 #5) id m0yaKtA-00001sa; Fri, 15 May 98 06:51 PDT
-Received: by fatcity.com (10-Feb-1998/v1.0f-b64/bab) via UUCP id 00027B2C; Fri, 15 May 1998 06:30:53 -0800
-Message-ID: 
-X-Comment: OpenGL Game Developers Mailing List
-X-Sender: Steve Baker 
-Reply-To: OPENGL-GAMEDEV-L@fatcity.com
-Errors-To: ML-ERRORS@fatcity.com
-Organization: Fat City Network Services, San Diego, California
-X-ListServer: v1.0f, build 64; ListGuru (c) 1996-1998 Bruce A. Bergman
-Precedence: bulk
-Mime-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Content-Transfer-Encoding: 7bit
-From: Steve Baker 
-Sender: root@fatcity.com
-To: Multiple recipients of list OPENGL-GAMEDEV-L 
-Subject: Re: Endian swapping
-Date: Fri, 15 May 1998 06:30:53 -0800
-
-On Fri, 15 May 1998, Sean L. Palmer wrote:
-
-> I'm trying to make this library as cross-platform as humanly possible with
-> my limited resources, so if anyone has any code to detect whether the target
-> is Big- or Little-endian, please e-mail it my way.
- 
-/*
-  Return TRUE if this machine is little endian,
-  FALSE otherwise.
-*/
-
-int is_little_endian ()
-{
-  int i = 1 ;
-
-  return *((char *) &i) ;
-}
-
-...this works because the address of an integer on a little-endian machine is
-the address of the low order byte (whose value is 1) and on a big-endian machine,
-it's the address of the high order byte (whose value is 0).
-
-Steve Baker                (817)619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
--- 
-Author: Steve Baker
-  INET: sbaker@link.com
-
-Fat City Network Services    -- (619) 538-5051  FAX: (619) 538-5051
-San Diego, California        -- Public Internet access / Mailing Lists
---------------------------------------------------------------------
-To REMOVE yourself from this mailing list, send an E-Mail message
-to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
-the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
-(or the name of mailing list you want to be removed from).  You may
-also send the HELP command for other information (like subscribing).
-
diff --git a/Hints/gamma b/Hints/gamma
deleted file mode 100644
index 0cef4f13f..000000000
--- a/Hints/gamma
+++ /dev/null
@@ -1,186 +0,0 @@
-From owner-flight-gear@me.umn.edu  Thu Apr 23 08:45:16 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["7258" "Thu" "23" "April" "1998" "09:44:56" "-0500" "Steve Baker" "sbaker@link.com" nil "158" "Re: [FGFS] lighting question" "^From:" nil nil "4" nil nil nil nil nil]
-	nil)
-Received: (from majordom@localhost)
-	by meserv.me.umn.edu (8.8.8/8.8.8) id IAA05148
-	for flight-gear-outgoing; Thu, 23 Apr 1998 08:45:16 -0500 (CDT)
-X-Authentication-Warning: meserv.me.umn.edu: majordom set sender to owner-flight-gear@me.umn.edu using -f
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id IAA05144
-	for ; Thu, 23 Apr 1998 08:45:10 -0500 (CDT)
-Received: from sutcliffe.bgm.link.com (sutcliffe.bgm.link.com [130.210.236.18])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id IAA29813 for ; Thu, 23 Apr 1998 08:44:39 -0500 (CDT)
-X-Sender: steve@sutcliffe.bgm.link.com
-In-Reply-To: <199804230119.UAA13239@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: flight-gear@me.umn.edu
-From: Steve Baker 
-Sender: owner-flight-gear@me.umn.edu
-To: flight-gear@me.umn.edu
-Subject: Re: [FGFS] lighting question
-Date: Thu, 23 Apr 1998 09:44:56 -0500 (CDT)
-
-On Wed, 22 Apr 1998, Curtis L. Olson wrote:
-
-> Here's a lighting question for someone.
-> 
-> Let's say it's noon-ish.  If I set the ambient light component to
-> about 0.3 and the diffuse light component to about 1.0 I get a
-> reasonably bright scene with good contrast in the shadowy areas.
-> 
-> Now, I'm running into problems when the sun is low in the sky.  Even
-> with a high diffuse lighting component (1.0) the angle the sun light
-> makes with the horizontal ground is very small so the diffuse lighting
-> component ends up being virtually nothing.  I'm fiddling around with
-> trying to increase the ambient component to 1.0, but I still get a
-> very dark scene.
- 
-...simple question - long answer - sorry...
-
-First the "Why does this look bad?" answer...
-
-  Well, when the sun is low in the sky, that is exactly what really
-  does happen - the angle between sun and (flattish) ground gets small
-  and it gets dark.
-
-  The problem is that our eyes have automatic gain control. When the
-  world gets darker, we increase our pupil apartures to increase the
-  amount of light we allow in. That only works when the whole world
-  goes darker - and not in a room in normal daylight containing a
-  small, dim CRT.
-
-  Also, in the real world, the sun lights things much more brightly
-  than a CRT phosphor can reproduce. When you drop that brightness
-  by (say) a factor of ten because it's dusk then the sun is still
-  pretty bright - but 1/10th the brightness on a CRT phosphor is pretty
-  dim.
-
-  If you watch your sunset scenes in a darkened room, they'll look
-  much better. However, for a desktop simulation, that may not help.
-
-  The other reason there is a problem is that the CRT phosphor is 
-  not a linear device - if you double the number for the pixel
-  brightness - you don't get twice the brightness coming out the
-  other side. This non-linearity is *supposed* to be corrected
-  by a process called 'gamma correction' which works by boosting
-  the contrast of the dark pixels and reducing the contrast of
-  the bright ones.
-
-  Fixing the gamma will help noon-time scenes as well as dusk
-  and dawn since the amount of stuff you can see in shadowed
-  areas will be better if the gamma is set right.
-
-  The required amount of gamma modification changes with the
-  age of the CRT and which particular choice of phosphor layer
-  the CRT manufacturer made. You may also need more gamma correction
-  in (say) the BLUE channel than in RED or GREEN.
-
-  Fancy machines like SGI ONYX's have hardware gamma tables on
-  the output of the machine to do this correction - I doubt that
-  all the PC-based 'toy' 3D cards have this feature.
-
-Now, the "What can we do to improve matters?" answer...
-
-  Well, you seem to be on the right track - you basically have to increase
-  the ambient light to make up for the missing light on the horizontal
-  surfaces. However, this tends to reduce the amount of contrast between
-  the dark regions and the vertical surfaces that are being brightly lit
-  just as the sun goes down. That is the opposite of the real world since
-  the shadows are much more contrasty late in the day than they are at noon.
-  (That is a subjective thing - I could be wrong about that)
-
-  You said:
-
-  > I'm fiddling around with trying to increase the ambient component to 1.0,
-  > but I still get a very dark scene.
-
-  ...that suprises me - you ought to be getting a very bright scene
-  with ambient==1.0 since all surfaces are being lit with a very bright
-  light that is ignoring their orientation. The scene should be brighter
-  than at noon.
-
-  Perhaps you don't have the ambient component of the glMaterial set
-  up right?
-
-  On the gamma front, there are two experiments you can try:
-
-    Curt: I know you have access to an SGI RE2 machine - and that
-    you can run FGFS on it. So, run FGFS up and set the time of
-    day to dusk - so you have the too-dark scene. Now open another
-    shell window and try running 'gamma 1.0' then 'gamma 1.5' then
-    'gamma 2.0'. If I'm right about the gamma setting being the problem
-    then gamma 1.0 should look just like it does on the PC, and
-    (depending on the age of your CRT), 1.5 or 2.0 (or something like
-    that) should make it look much better.
-
-    If you can't get to an SGI machine then do a screen dump of your
-    image into a file, then load that file into Xview (under Linux)
-    or something like photoshop. Image processing programs like this
-    usually let you change the gamma for an image interactively by
-    recomputing the pixels (this eliminates the need for gamma hardware).
-    In XView, pick the colour editor window and click on the gamma
-    button next to the intensity graph. Type in 2.0 (or whatever) and
-    you'll notice that the curve in the window looks like this:
-
-
-                    ****
-                  **
-                 *
-                *
-               *
-               *
-              *
-              *
-              *
-  
-     (pardon the ASCII art)
-
-     ....which means that the dark areas have been increased in contrast
-     and the light areas reduced in contrast.
-
-   If either of these tests shows that gamma is indeed your problem then
-   you need to think about how to set the gamma on your hardware.
-
-   For software OpenGL with Mesa - I think Mesa has a gamma setting
-   extension (or an environment variable or something) - the 3Dfx
-   card (IIRC) has a way to set the gamma too - although I don't
-   know how. The general way to set the gamma is not through OpenGL,
-   so doing this in a portable way from inside FGFS is going to be hard.
-   You may have to rely on the user setting it up in some external
-   tool (a windoze control panel most likely).
-
-> I may have something fouled up, or may not understand something
-> correctly, but does anyone have any suggestions as to what the ambient
-> and diffuse lighting components ought to be set to in order for the
-> scenery to be "realistically" lit  when the sun is low in the sky?
-
-Well, 'realistically' is a hard thing - the human eye can discern detail
-in a scene lit at a gazillion candelas - all the way down to a gazillionth
-of a candela, lots of orders of magnitude. A CRT can only display the
-number of brightness levels provided in the frame buffer (256 if you are
-lucky - a mere 2.5 orders of magnitude) - and is VERY dim in any case.
-
-Getting 'realistic' brightnesses just isn't going to happen on a desktop
-display system - so it's all a matter of compromise.
-
-On 'real' flight simulators, the fight for better contrast and brightness
-and more orders of magnitude of brightness variation is a continual battle
-that results in some pretty exotic display technologies. (Things like
-shining an arc-lamp onto a million tiny mirrors that are tilted using
-pizo-electric effects to modulate the brightness...ugh!)
-
-Steve Baker                (817)619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
--------------------------------------
-Please visit the FGFS web page:  http://www.menet.umn.edu/~curt/fgfs/
-For help on using this list (especially unsubscribing), send a message to
-"flight-gear-request@me.umn.edu" with a single line of text: "help".
-
diff --git a/Hints/joystick b/Hints/joystick
deleted file mode 100644
index 048d88ed1..000000000
--- a/Hints/joystick
+++ /dev/null
@@ -1,73 +0,0 @@
-From owner-fgfs-devel@flightgear.org  Mon Sep 14 10:44:02 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["1542" "Mon" "14" "September" "1998" "10:41:38" "-0500" "Steve Baker" "sbaker@link.com" nil "42" "Re: FGFS: Windows Joystick support" "^From:" nil nil "9" nil nil nil nil nil]
-	nil)
-Received: from mailhub.woodsoup.org (IDENT:root@anduin.physics.iastate.edu [129.186.82.1])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id KAA21095
-	for ; Mon, 14 Sep 1998 10:44:00 -0500 (CDT)
-Received: from majordom by mailhub.woodsoup.org with local (Exim 1.92 #1)
-	for fgfs-devel-outgoing@flightgear.org
-	id 0zIamX-0005os-00; Mon, 14 Sep 1998 10:43:13 -0500
-Received: from bgm.link.com ([130.210.2.10] helo=lfkw10.bgm.link.com)
-	by mailhub.woodsoup.org with esmtp (Exim 1.92 #1)
-	for fgfs-devel@flightgear.org
-	id 0zIamW-0005ok-00; Mon, 14 Sep 1998 10:43:12 -0500
-Received: from samantha.bgm.link.com (samantha.bgm.link.com [130.210.65.19])
-          by lfkw10.bgm.link.com (8.8.6/RSC-RTI-1.0) with SMTP
-	  id KAA21757; Mon, 14 Sep 1998 10:42:23 -0500 (CDT)
-X-Sender: steve@samantha.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <3.0.5.32.19980913154136.007e8440@umr.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-From: Steve Baker 
-Sender: owner-fgfs-devel@flightgear.org
-To: William Riley 
-cc: fgfs-devel@flightgear.org
-Subject: Re: FGFS: Windows Joystick support
-Date: Mon, 14 Sep 1998 10:41:38 -0500 (CDT)
-
-On Sun, 13 Sep 1998, William Riley wrote:
-
-> Is anyone working on joystick support for Win9x/NT?  I'm a fledgling
-> programmer and was thinking about tacking this task.  If anyone has started
-> (or finished) please email me directly or through the list.  Thanks.
- 
-There is basic joystick support in GLUT - I presume the simplest thing
-to do to start with is to use that since the result will be portable to
-all of our target systems.
-
-The downside is that IIRC, GLUT only supports a very simple joystick
-setup (single stick, two axes, two buttons).
-
-Whatever API we finally choose needs to consider the portability issues.
-
-IMHO, it would be better to extend GLUT and offer any improvements back
-into the general Freeware community rather than to settle on an ad'hoc
-FGFS-specific solution.
-
-Joystick info for Linux can be found here:
-
-  http://atrey.karlin.mff.cuni.cz/~vojtech/joystick/
-
-Joystick programming info for Windoze is here:
-
-  http://www.hut.fi/Misc/Electronics/docs/joystick/pc_joystick.html#programming
-
-That same site has a TON of interesting joystick info:
-
-  http://www.hut.fi/Misc/Electronics/docs/joystick/
-
-GLUT's joystick support is not documented yet since it's only present in the
-very latest GLUT 3.7 beta. However, if you check the source code for that
-release of GLUT, you'll see how it's done there.
-
-
-Steve Baker                (817)619-2657 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
-
diff --git a/Hints/lights.c b/Hints/lights.c
deleted file mode 100644
index 026680ee9..000000000
--- a/Hints/lights.c
+++ /dev/null
@@ -1,288 +0,0 @@
-From curt@infoplane.com  Fri Nov 13 06:10:29 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["6615" "Fri" "13" "November" "1998" "06:10:23" "-0600" "curt@infoplane.com" "curt@infoplane.com" nil "271" "fuzzy-light-effect" "^From:" nil nil "11" nil nil nil nil nil]
-	nil)
-Received: from dorthy.state.net (dorthy.state.net [209.234.62.254])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id GAA15847
-	for ; Fri, 13 Nov 1998 06:10:28 -0600 (CST)
-Received: from sledge.infoplane.com (curt@sledge.infoplane.com [204.120.151.21]) by dorthy.state.net (8.8.8/8.7.2) with ESMTP id GAA25998 for ; Fri, 13 Nov 1998 06:10:08 -0600 (CST)
-Received: (from curt@localhost)
-	by sledge.infoplane.com (8.8.8/8.8.8/Debian/GNU) id GAA24798
-	for curt@me.umn.edu; Fri, 13 Nov 1998 06:10:23 -0600
-Message-Id: <199811131210.GAA24798@sledge.infoplane.com>
-From: curt@infoplane.com
-To: curt@me.umn.edu
-Subject: fuzzy-light-effect
-Date: Fri, 13 Nov 1998 06:10:23 -0600
-
-/* stars - draws a twisting sphere of eerie lights
-   Copyright (C) 1998 James Bowman
-
-stars is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-gpasm is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with gpasm; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-
-#include 
-#include 
-#include 
-#include        /* for cos(), sin(), and sqrt() */
-#include 
-#ifdef WIN32
-#include 
-#else
-#include 
-#endif
-#include 
-
-static int phi;                 /* Global clock */
-static int texWidth = 64;       /* 64x64 is plenty */
-
-/************************************************************************/
-
-/* Generate a pleasing, light-shaped texture. */
-
-static void
-setTexture(void)
-{
-  int texSize;
-  void *textureBuf;
-  GLubyte *p;
-  int i,j;
-  double radius;
-
-  texSize = texWidth*texWidth;
-
-  textureBuf = malloc(texSize);
-  if (NULL == textureBuf) return;
-
-  p = (GLubyte *)textureBuf;
-
-  radius = (double)(texWidth / 2);
-
-  for (i=0; i < texWidth; i++) {
-    for (j=0; j < texWidth; j++) {
-      double x, y, d;
-            
-      x = fabs((double)(i - (texWidth / 2)));
-      y = fabs((double)(j - (texWidth / 2)));
-
-      d = sqrt((x * x) + (y * y));
-      if (d < radius) {
-        double t = 1.0 - (d / radius); /* t is 1.0 at center,
-                                          0.0 at edge */
-
-        /* inverse square looks nice */
-        *p = (int)((double)0xff * (t * t));
-      } else
-        *p = 0x00;
-      p++;
-    }
-  }
-
-  gluBuild2DMipmaps(GL_TEXTURE_2D, 1, texWidth, texWidth, 
-                    GL_LUMINANCE,
-                    GL_UNSIGNED_BYTE, textureBuf);
-  free(textureBuf);
-}
-
-/************************************************************************/
-
-static int W, H;
-
-#define NUM_STARS 100
-
-#define frand()  ((float)(rand() & 0xfff) / (float)0x1000)  /* 0.0 - 1.0 */
-#define frand2() (1.0f - (2.0f * frand()))                  /* -1 - +1   */
-
-/* Normalise the input vector */
-static void vecNormalise(float *vv)
-{
-  double mag;
-
-  mag = sqrt((vv[0] * vv[0]) + (vv[1] * vv[1]) + (vv[2] * vv[2]));
-  vv[0] /= mag;
-  vv[1] /= mag;
-  vv[2] /= mag;
-}
-
-void
-redraw_viewing(void)
-{
-  static int cold = 1;
-  static float stars[NUM_STARS * 3];
-  GLfloat fb_buffer[NUM_STARS * 4];
-  int i;
-
-  if (cold) {
-    /* Position all the stars more-or-less randomly on the surface
-     * of a unit sphere. */
-    for (i = 0; i < NUM_STARS; i++) {
-      stars[3 * i + 0] = frand2();
-      stars[3 * i + 1] = frand2();
-      stars[3 * i + 2] = frand2();
-      vecNormalise(&stars[3 * i]);
-    }
-    cold = 0;
-  }
-
-  glClear(GL_COLOR_BUFFER_BIT);
-
-  /* First use feedback to determine the screen positions of the
-     stars. */
-  glFeedbackBuffer(NUM_STARS * 4, GL_3D, fb_buffer);
-  glRenderMode(GL_FEEDBACK);
-
-  glMatrixMode(GL_MODELVIEW);
-  glPushMatrix();
-  glRotatef(phi % 360, 0.0f, 1.0f, 0.0f); /* Constant spin */
-  glRotatef(sin((double)phi / 300.0) * 150.0,   /* Periodic twist */
-            0.1f, 0.6f, -0.5f);
-  glBegin(GL_POINTS);
-  for (i = 0; i < NUM_STARS; i++)
-    glVertex3fv(&stars[3 * i]);
-  glEnd();
-  glPopMatrix();
-  glRenderMode(GL_RENDER);      /* No more feedback */
-
-  /* Now draw the stars as sprites. */
-  glEnable(GL_TEXTURE_2D);
-  glEnable(GL_BLEND);           /* Simple additive blend is fine */
-  glBlendFunc(GL_ONE, GL_ONE);
-
-  /* Choose a color triple like this so that when the sprites overlap
-   * and the color saturates, red will clamp first, then green, then
-   * blue. */
-  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-  glColor3f(1.0f, 0.75f, 0.5f);
-
-  /* Set up projection and modelview matrix that gives us a 1:1
-   * mapping to screen coordinates. */
-  glMatrixMode(GL_PROJECTION);
-  glPushMatrix();
-  glLoadIdentity();
-  glMatrixMode(GL_MODELVIEW);
-  glPushMatrix();
-  glLoadIdentity();
-  glScalef(2.0f / (GLfloat)W, 2.0f / (GLfloat)H, 1.0f);
-  glTranslatef(0.5f * -(GLfloat)W, 0.5f * -(GLfloat)H, 0.0f);
-
-  {
-    float width;
-    float x, y, z;
-    int i;
-
-    glBegin(GL_QUADS);
-
-    for (i = 0; i < NUM_STARS; i++) {
-      /* Skip the GL_POINT_TOKEN */
-      x = fb_buffer[4 * i + 1];
-      y = fb_buffer[4 * i + 2];
-      z = fb_buffer[4 * i + 3];
-
-      width = 10.0 * (2.0 - z); /* Arbitrary distance attenuation */
-
-      glTexCoord2f(0.0f, 0.0f);
-      glVertex2f(x - width, y - width);
-
-      glTexCoord2f(1.0f, 0.0f);
-      glVertex2f(x + width, y - width);
-
-      glTexCoord2f(1.0f, 1.0f);
-      glVertex2f(x + width, y + width);
-      
-      glTexCoord2f(0.0f, 1.0f);
-      glVertex2f(x - width, y + width);
-    }
-
-    glEnd();
-  }
-
-  glMatrixMode(GL_MODELVIEW);
-  glPopMatrix();
-  glMatrixMode(GL_PROJECTION);
-  glPopMatrix();
-  
-  glutSwapBuffers();
-}
-
-void
-reshape_viewing(int w, int h)
-{
-  glViewport(0, 0, w, h);
-  W = w;
-  H = h;
-}
-
-/************************************************************************/
-
-void
-animate(void)
-{
-  phi++;
-  redraw_viewing();
-}
-
-void
-key(unsigned char key, int x, int y)
-{
-  switch (key) {
-  case 27:
-  case 'q':
-    exit(0);
-  }
-}
-
-int
-main(int argc, char **argv)
-{
-  glutInit(&argc, argv);
-
-  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
-  glutInitWindowSize(640, 480);
-
-  glutCreateWindow("stars");  
-  glutReshapeFunc(reshape_viewing);
-  glutDisplayFunc(redraw_viewing);
-
-  glutIdleFunc(animate);
-  glutKeyboardFunc(key);
-
-  glDisable(GL_DEPTH_TEST);
-  glDisable(GL_LIGHTING);
-
-  glMatrixMode(GL_MODELVIEW);
-
-  setTexture();
-  glTexParameteri(GL_TEXTURE_2D,
-                  GL_TEXTURE_MIN_FILTER,
-                  GL_LINEAR_MIPMAP_NEAREST);
-  glTexParameteri(GL_TEXTURE_2D,
-                  GL_TEXTURE_MAG_FILTER,
-                  GL_LINEAR);
-
-  glMatrixMode(GL_PROJECTION);
-  gluPerspective( /* field of view in degree */ 40.0f,
-                  /* aspect ratio             */ 1.0f,
-                  /* Z near */ 3.0f,
-                  /* Z far */ 5.0f);
-  glMatrixMode(GL_MODELVIEW);
-  gluLookAt(0.0f, 0.0f, 4.0f,   /* eye position */
-    0.0f, 0.0f, 0.0f,           /* looking at */
-    0.0f, 1.0f, 0.0f);          /* up vector */
-
-  glutMainLoop();
-  return 0;             /* ANSI C requires main to return int. */
-}
-
diff --git a/Hints/mip-mapping b/Hints/mip-mapping
deleted file mode 100644
index d3dd74863..000000000
--- a/Hints/mip-mapping
+++ /dev/null
@@ -1,118 +0,0 @@
-From sbaker@link.com  Thu Mar 12 22:51:27 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["4342" "Thu" "12" "March" "1998" "22:50:07" "-0600" "Steve Baker" "sbaker@link.com" "" "95" "Re: Texturing (finally)" "^From:" nil nil "3" nil nil nil nil nil]
-	nil)
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id WAA13969
-	for ; Thu, 12 Mar 1998 22:51:26 -0600 (CST)
-Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-   id WAA25775 for ; Thu, 12 Mar 1998 22:50:51 -0600 (CST)
-X-Sender: steve@lechter.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199803121856.MAA05616@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Status: RO
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: Texturing (finally)
-Date: Thu, 12 Mar 1998 22:50:07 -0600 (CST)
-
-On Thu, 12 Mar 1998, Curtis L. Olson wrote:
-
-> Steve Baker writes:
-> > So you have the texture into OpenGL using glGenTextures /
-> > glBindTexture and you have a number for each texture?  Does the
-> > routine generate the MIPmaps for you?
-> 
-> I found some code that looks like it might do the mipmapping ... I'll
-> fiddle around with that a bit if I get a chance.
- 
-Once you have an image in memory, the code in the RedBook is all you need.
-
-There is a glu function for generating the MIPmaps. It works OK for
-starters - but eventually you'll want to rewrite it. Since the sources
-for glu are provided with Mesa (and they work with ANY OpenGL), you
-can easily take the standard glu code and hack it yourself later.
-
-The main thing that I find I need to do with MIPmapping is to control
-the final alpha value of MIPmapped transparency textures. Simply averaging
-all the high level texel Alpha's together to get the lowest LOD doesn't
-work very well in some applications for translucent texture.
-
-However, that won't matter to you for a LONG while yet - so just steal
-the RedBook examples.
-
-> > As a starter (just to get something going), you could simply divide
-> > the latitude and longitude of each terrain vertex by some suitable
-> > constant and use that as the texture coordinate. Alternatively, you
-> > could let OpenGL do the work using glTexGenf.
-> 
-> Tell me more about glTexGenf().
-
-I have to come clean here and mention that I have never actually used
-glTexGenf.
-
-Basically, it provides a mechanism where OpenGL will generate the
-texture coordinates for you automatically using other vertex information.
-I forget all the modes it has - but IIRC, one of them allows you to specify
-the equation of a plane (A,B,C,D where: Ax+By+Cz+D==0) - and the texture
-coordinates are computed by projecting each vertex (x,y,z) onto that
-plane.
-
-If you set that plane to be a plane that is tangential to the earth
-at the center of the terrain tile that you are rendering, then the
-texture would 'drape' itself nicely over the terrain - but there would
-be seams at the edge of each tile.
-
->  All my coordinates come off the disk
-> in (X, Y, Z) so it would take some computational effort to convert
-> back to lon/lat ...
-
-Yes - you'd need to store (X,Y,Z,S,T) for each vertex on disk and compute
-the texture coordinates in the terrain tool. You'd need to do that
-eventually anyway since the number you use to multiply the lat/long
-to convert to S,T will be different for each kind of texture map - and
-for databases at different latitudes (otherwise the texture gets all
-squashed up near the poles).
-
-I guess if you don't want to change your file format that much, you
-could store a matrix at the top of the file that could be used to
-transform (X,Y,Z) into (S,T,garbage).  But that's really the same
-thing as using glTexGen to do the work - and you'll still get seams
-at the edge of every terrain tile whenever the matrix changes.
-
-Since OpenGL supports the idea of a texture matrix, you could simply
-load your per-tile matrix onto the OpenGL texture matrix stack and
-use glTexCoord3f(x,y,z) [where (x,y,z) is the same vertex coordinate
-that you pass to glVertex3f()].
-
-However, in your quest to DO THE RIGHT THING, there is little choice
-but to store the texture S,T in the file along with the other vertex
-information - any other approach is going to produce seams in the texture
-and sooner or later, you'll get dissatisfied with that.
-
-I suggest that in the short term, you use the texture matrix approach
-since that gets you a textured image *quickly*. It will also let you
-debug the texture loader, the MIPmapping, the glTexBind, etc stuff
-and so on. You'll be able to find some nice textures and make some
-new (and v.cool) screen shots. Switching to stored (S,T) coords is
-something you can attack later when the seams get too annoying.
-
->  Right now I'm using fg_random() to specify
-> texture coordinates :-) It seems to work, but has some strange
-> effects. :-)
-
-Strange!!...I'm not suprised!
-
-Steve Baker                     817-619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.           817-619-4028 (Fax)
-2200 Arlington Downs Road       SBaker@link.com (eMail)
-Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
-http://www.hti.com        http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
diff --git a/Hints/nmea b/Hints/nmea
deleted file mode 100644
index 27cfbb670..000000000
--- a/Hints/nmea
+++ /dev/null
@@ -1,101 +0,0 @@
-From curt@me.umn.edu  Fri Nov 13 17:02:31 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["209" "Fri" "13" "November" "1998" "17:02:29" "-0600" "Curtis L. Olson" "curt@me.umn.edu" nil "6" "nmea stuff 3" "^From:" nil nil "11" nil nil nil nil nil]
-	nil)
-Received: from kenai.me.umn.edu (curt@kenai.me.umn.edu [134.84.18.22])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id RAA29774
-	for ; Fri, 13 Nov 1998 17:02:31 -0600 (CST)
-Received: (from curt@localhost)
-	by kenai.me.umn.edu (8.9.1/8.9.1) id RAA32468;
-	Fri, 13 Nov 1998 17:02:30 -0600
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-Content-Transfer-Encoding: 7bit
-Message-ID: <13900.47749.734021.549964@kenai.me.umn.edu>
-X-Mailer: VM 6.61 under Emacs 19.34.1
-From: "Curtis L. Olson" 
-To: curt@me.umn.edu
-Subject: nmea stuff 3
-Date: Fri, 13 Nov 1998 17:02:29 -0600 (CST)
-
-http://www.marinesoft.com/Navigation/Technical/index.htm
--- 
-Curtis Olson                        University of MN, ME Dept.
-curt@me.umn.edu                     
-http://www.menet.umn.edu/~curt      Try Linux!
-
-From curt@me.umn.edu  Fri Nov 13 16:41:49 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["730" "Fri" "13" "November" "1998" "16:41:47" "-0600" "Curtis L. Olson" "curt@me.umn.edu" nil "21" "nmea stuff 2" "^From:" nil nil "11" nil nil nil nil nil]
-	nil)
-Received: from kenai.me.umn.edu (curt@kenai.me.umn.edu [134.84.18.22])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id QAA29467
-	for ; Fri, 13 Nov 1998 16:41:48 -0600 (CST)
-Received: (from curt@localhost)
-	by kenai.me.umn.edu (8.9.1/8.9.1) id QAA32325;
-	Fri, 13 Nov 1998 16:41:47 -0600
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-Content-Transfer-Encoding: 7bit
-Message-ID: <13900.46507.212248.131431@kenai.me.umn.edu>
-X-Mailer: VM 6.61 under Emacs 19.34.1
-From: "Curtis L. Olson" 
-To: curt@me.umn.edu
-Subject: nmea stuff 2
-Date: Fri, 13 Nov 1998 16:41:47 -0600 (CST)
-
-http://www.fet.uni-hannover.de/~purnhage/gps/gps.html
-
-garman hacking project
-    http://www.abnormal.com/~thogard/gps/grmnhack.html
-
-nmea code documents
-    http://www.oce.orst.edu/Wecoma/Docs/Computing/XMidas/Formatter_ID.html
-    http://www.oce.orst.edu/Wecoma/Docs/Computing/XMidas/NMEA_0183_Format.html
-
-http://www.cl.cam.ac.uk/users/ijl20/nmea.txt
-
-http://www.cl.cam.ac.uk/users/ijl20/gps_file.html
-
-(*) http://vancouver-webpages.com/pub/peter/index.html
-    http://vancouver-webpages.com/pub/peter/idx_nmeadoc.html
-    http://vancouver-webpages.com/pub/peter/nmeafaq.txt
--- 
-Curtis Olson                        University of MN, ME Dept.
-curt@me.umn.edu                     
-http://www.menet.umn.edu/~curt      Try Linux!
-
-From curt@me.umn.edu  Fri Nov 13 15:10:29 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["376" "Fri" "13" "November" "1998" "15:10:27" "-0600" "Curtis L. Olson" "curt@me.umn.edu" nil "14" "nmea stuff" "^From:" nil nil "11" nil nil nil nil nil]
-	nil)
-Received: from kenai.me.umn.edu (curt@kenai.me.umn.edu [134.84.18.22])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id PAA27473
-	for ; Fri, 13 Nov 1998 15:10:28 -0600 (CST)
-Received: (from curt@localhost)
-	by kenai.me.umn.edu (8.9.1/8.9.1) id PAA31952;
-	Fri, 13 Nov 1998 15:10:27 -0600
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-Content-Transfer-Encoding: 7bit
-Message-ID: <13900.41027.169267.293790@kenai.me.umn.edu>
-X-Mailer: VM 6.61 under Emacs 19.34.1
-From: "Curtis L. Olson" 
-To: curt@me.umn.edu
-Subject: nmea stuff
-Date: Fri, 13 Nov 1998 15:10:27 -0600 (CST)
-
-http://pfranc.com/projects/g45contr/assemb.htm
-http://pfranc.com/ - gps connector
-http://pfranc.com/projects/g45contr/beans.htm
-
-http://www.thecapn.com/
-http://www.thecapn.com/nmea.htm
-http://vancouver-webpages.com/peter/
-
-
--- 
-Curtis Olson                        University of MN, ME Dept.
-curt@me.umn.edu                     
-http://www.menet.umn.edu/~curt      Try Linux!
-
diff --git a/Hints/opengl-optimization b/Hints/opengl-optimization
deleted file mode 100644
index 773ff5277..000000000
--- a/Hints/opengl-optimization
+++ /dev/null
@@ -1,60 +0,0 @@
-Original Article: http://www.egroups.com/list/opengl-gamedev-l/?start=11533
-Ben Carter writes:
->
->  Hmm.. Here's a question - is it worth optimising out redundant state
-> changes? In other words, if I do :
-> 
->  glEnable(GL_TEXTURE_2D);
->  
->  glEnable(GL_TEXTURE_2D);
->  
-
-   Generally, yes.  There's usually a validation step that's scheduled
-after a call to glEnable().  It updates the internals caches and what
-not based on state that was set prior to the enable call.  Its difficult 
-to estimate what every driver does, but there's still internal updating
-that probably occurs.
-
-   Additionally, its much better to write, for example:
-
-	glLightfv( GL_LIGHT0, ... );
-	glLightfv( GL_LIGHT0, ... );
-	glLightfv( GL_LIGHT0, ... );
-	glEnable( GL_LIGHT0 );
-	glEnable( GL_LIGHTING );
-
-than the opposite.  Its less important to do this in initialization, but 
-if you're dynamically changing things like lighting or texturing, you'll 
-only validate on the glEnable(), as compared to each glLight() call if
-you glEnable() first.
-
->  Is there going to be a performance hit from the second glEnable call?
-> Would it be worthwhile writing a wrapper around the state system that
-> kept the current state somewhere and only made calls that were
-> necessary, or are the drivers smart enough to do that?
-
-   Some drivers might be smart enough, but I think the underlying
-assumption is that its easier to just reprocess like something's
-changed, than actually try to keep track of which state's changed, and
-localize that validation.
- 
-   The wrapper idea could be useful; I guess it depends if the apps
-design can't guard against it.  FWIW.
-
-Thanx,
-Dave
-
-  ---------------------------------------------------------------------
-
-   Dave Shreiner                                   
-   Silicon Graphics, Inc.                            (650) 933-4899
------ 
-FAQ and OpenGL Resources at:
-  http://www.geocities.com/SiliconValley/Hills/9956/OpenGL
-
--- 
-Author: Dave Shreiner
-  INET: shreiner@sgi.com
-
-Fat City Network Services    -- (619) 538-5051  FAX: (619) 538-5051
-San Diego, California        -- Public Internet access / Mailing Lists
diff --git a/Hints/polygon-offset b/Hints/polygon-offset
deleted file mode 100644
index 6bd65c4fc..000000000
--- a/Hints/polygon-offset
+++ /dev/null
@@ -1,358 +0,0 @@
-From fatcity!root@news.cts.com  Thu Mar 26 17:57:48 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["8204" "Thu" "26" "March" "1998" "15:32:55" "-0800" "akin@pobox.com" "akin@pobox.com" nil "162" "Re: poly offset " "^From:" nil nil "3" nil nil nil nil nil]
-	nil)
-Received: from mh2.cts.com (root@mh2.cts.com [205.163.24.68])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id RAA07001
-	for ; Thu, 26 Mar 1998 17:57:43 -0600 (CST)
-Received: from king.cts.com (root@king.cts.com [198.68.168.21]) by mh2.cts.com (8.8.7/8.8.5) with ESMTP id PAA05457; Thu, 26 Mar 1998 15:55:40 -0800 (PST)
-Received: from donews.cts.com (root@donews.cts.com [192.188.72.21])
-	by king.cts.com (8.8.7/8.8.7) with SMTP id PAA21507;
-	Thu, 26 Mar 1998 15:55:38 -0800 (PST)
-Received: from fatcity by donews.cts.com with uucp
-	(Smail3.1.29.1 #5) id m0yIMSJ-0000NEa; Thu, 26 Mar 98 15:53 PST
-Received: by fatcity.com (10-Feb-1998/v1.0f-b64/bab) via UUCP id 00016F4B; Thu, 26 Mar 1998 15:32:55 -0800
-Message-ID: 
-X-Comment: OpenGL Game Developers Mailing List
-X-Sender: akin@pobox.com
-Reply-To: OPENGL-GAMEDEV-L@fatcity.com
-Errors-To: ML-ERRORS@fatcity.com
-Organization: Fat City Network Services, San Diego, California
-X-ListServer: v1.0f, build 64; ListGuru (c) 1996-1998 Bruce A. Bergman
-Precedence: bulk
-Mime-Version: 1.0
-Content-Type: text/plain; charset="us-ascii"
-Content-Transfer-Encoding: 7bit
-From: akin@pobox.com
-Sender: root@fatcity.com
-To: Multiple recipients of list OPENGL-GAMEDEV-L 
-Subject: Re: poly offset 
-Date: Thu, 26 Mar 1998 15:32:55 -0800
-
-
-Bryan Gibson-Winge wrote:
-| I was curious to see if anyone would describe a method of using poly offset
-| that didn't eventually conclude with "and mess with the numbers 'till it
-| works".
-
-There is such a method, but since it's not in any of the usual OpenGL
-literature it's not widely discussed.  I'll try to summarize it; maybe
-the result could go into the FAQ.
-
-The purpose of polygon offset is to separate two or more primitives
-by just enough distance in Z that they can be depth-buffered without
-artifacts caused by depth computation roundoff errors, differences in
-sampling algorithms for different types of primitives, etc.
-
-The ``factor'' argument provides separation in the case where the
-primitives are not parallel.  The factor value to use depends on the
-screen sizes of the primitives involved.
-
-	The canonical example is highlighting the edge of a triangle
-	by drawing a line between the two associated triangle vertices.
-	The depth value for each pixel on the line depends only on the
-	depth values at the two vertices of the triangle edge.	However,
-	the depth value for each pixel in the triangle depends on all
-	three of the triangle's vertices.  Since lines and triangles are
-	sampled differently (e.g. diamond-exit rule for lines vs. point
-	sampling for triangles), at a given pixel the depth computed
-	for the edge line usually differs from the depth computed
-	for the underlying triangle.  This can cause ``stitching'' or
-	other unpleasant artifacts in the image, because depth buffering
-	sometimes places the line in front of the triangle and sometimes
-	behind it.
-
-	How much separation is needed to ensure that the line is always
-	in front of the triangle?  If you look at the rasterization
-	arithmetic or play with a few diagrams, you can see that at some
-	pixels the depth value for the triangle is computed at a point
-	almost one pixel away from the ideal edge (which produces the
-	depth values for the line).  Since the triangle can have an almost
-	arbitrarily large depth slope, there is no fixed offset that will
-	guarantee separation between the two primitives in all cases.
-	However, a (variable) separation of 1.0 times the depth slope of
-	the triangle is always sufficient.  (For the purposes of this
-	discussion, the depth slope is max(|dz/dx|,|dz/dy|).  The spec
-	has additional information.)  It's sometimes more than you need,
-	but it's always large enough to work.
-
-	If the line were two pixels wide rather than one, then 1.0
-	times the depth slope wouldn't be enough separation, because
-	some pixels on the line might have depth values derived from an
-	edge point more than one pixel away from the underlying point
-	on the triangle.  2.0 would be sufficient, though.
-
-	So now you understand the factor argument.  It should be
-	nonzero when you're attempting to separate two primitives that
-	aren't parallel, and its value should be roughly the size of
-	the screen-space overlap (measured in pixels) between the two
-	primitives.  For any given triangle, the factor is multiplied
-	by the triangle's depth slope to compute the amount of separation.
-
-The ``units'' or ``bias'' argument provides separation in the case
-where the primitives are roughly parallel.  The value to use
-depends on how many primitives you're trying to stack up.
-
-	Consider the edged-triangle case again.  What happens when the
-	depth slope of the triangle is zero?  Since the depth slope is
-	zero, no matter what the factor argument is, you won't get any
-	separation between the triangle and the edge line.  However,
-	you still want some separation between the two primitives,
-	so that you get a consistent result (i.e., one that doesn't
-	depend on the order in which you draw things or on whether the
-	depth-comparison function tests for equality).
-
-	The bias argument guarantees a little separation even in the case
-	where the depth slope is zero.	Furthermore, it generalizes to
-	the case where the depth slopes of the primitives are nonzero,
-	but the primitives are roughly parallel (for example, when using
-	one polygon as a decal on another).
-
-	The original version of polygon offset allowed you to specify
-	a bias that was simply added to the depth value at each pixel.
-	However, it was quite difficult to choose an appropriate value,
-	because the choice depends not only on the number of bits in the
-	depth buffer (offsets smaller than the depth buffer precision
-	don't do you much good!) but also on the precision of various
-	computations inside the OpenGL driver and the hardware.
-	Perspective projection can also make a difference, since
-	resolution is better at the near clipping plane than it is at
-	the far clipping plane.
-
-	The current version of polygon offset specifies the bias in
-	multiples of a ``minimum resolvable difference,'' which is some
-	value determined by the driver developer.  The minimum resolvable
-	difference is sufficient to separate two parallel primitives,
-	taking into account the perspective projection, size of the
-	depth buffer, hardware precision, etc.
-
-	Since one unit is sufficient to separate two primitives, you
-	can use more than one unit to separate additional primitives.
-	For example, by using bias values of 1, 2, 3, ... you can stack
-	up an arbitrary set of polygons on a base polygon.
-
-	Since some OpenGL implementations add the bias before the
-	perspective divide, a bias of 1.0 unit might be much larger
-	than is needed for primitives close to the near clipping plane.
-	If your app is smart enough to know exactly how the driver
-	behaves, and roughly where in the view volume the primitives
-	will fall, then it can use a bias of less than 1.0 to separate
-	primitives close to the near clipping plane.  Most of the time
-	this is *not* worth the effort, though.
-
-Some practical examples:
-
-	Drawing lines of width 1.0 pixel on the edge of a triangle
-	should use a factor of 1.0 (to guarantee separation when the
-	triangle depth slope is nonzero) and a bias of 1.0 (to guarantee
-	separation when the triangle depth slope is zero).
-
-	Drawing wider lines requires larger factors.  A good rule of
-	thumb might be to use a factor equal to ceil(lineWidth/2 + 0.5).
-
-	Drawing decal polygons needs a zero factor and a nonzero bias,
-	provided that you can guarantee that all of the vertices of
-	the decal polygons are on the same side of the plane of the
-	base polygon, and not on that plane.  (If intersections occur,
-	you might need a nonzero factor, because the depth slopes of
-	the primitives might be different.)  Use a bias of 1.0 for the
-	lowest-level decal (the one closest to the base), 2.0 for the
-	next-highest, and so on.
-
-	Positive factors and biases push primitives in one direction;
-	negative factors and biases push primitives in the other
-	direction.  Sometimes it makes a difference (for example, if you
-	want to use the values in the depth buffer for a subsequent pass).
-
-If you run into trouble, the most likely cause is that the driver
-developer underestimated the value of the minimum resolvable difference.
-(I know of no way to predict this value; I think you just have to
-measure it.  The basic idea is to binary-search across the range of depth
-values, drawing two parallel polygons at each stage and determining if
-depth-buffering artifacts occur.  Do this once at the near plane, and
-once at the far plane, and take the largest result.  Repeat for extreme
-depthrange values.)  Tweaking the bias argument is probably the only
-way to resolve this. :-)
-
-Finally, as Steve Baker and I have discussed in the past, the
-reference_plane extension is often a cleaner solution than polygon offset,
-if your OpenGL implementation supports it.
-
-Allen
--- 
-Author: 
-  INET: akin@pobox.com
-
-Fat City Network Services    -- (619) 538-5051  FAX: (619) 538-5051
-San Diego, California        -- Public Internet access / Mailing Lists
---------------------------------------------------------------------
-To REMOVE yourself from this mailing list, send an E-Mail message
-to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
-the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
-(or the name of mailing list you want to be removed from).  You may
-also send the HELP command for other information (like subscribing).
-
-From fatcity!root@news.cts.com  Fri Jan 16 04:45:15 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["1385" "Fri" "16" "January" "1998" "02:06:11" "-0800" "Mark Kilgard" "mjk@fangio.engr.sgi.com" nil "43" "Re: glPolygonOffset" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-Received: from mh2.cts.com (root@mh2.cts.com [205.163.24.68])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id EAA19075
-	for ; Fri, 16 Jan 1998 04:45:14 -0600 (CST)
-Received: from king.cts.com (root@king.cts.com [198.68.168.21]) by mh2.cts.com (8.8.7/8.8.5) with ESMTP id CAA19264; Fri, 16 Jan 1998 02:39:16 -0800 (PST)
-Received: from donews.cts.com (root@donews.cts.com [192.188.72.21])
-	by king.cts.com (8.8.7/8.8.7) with SMTP id CAA07365;
-	Fri, 16 Jan 1998 02:39:07 -0800 (PST)
-Received: from fatcity by donews.cts.com with uucp
-	(Smail3.1.29.1 #5) id m0xt8sd-00008Sa; Fri, 16 Jan 98 02:20 PST
-Received: by fatcity.com (02-Jan-98/v1.0f-b63/bab) via UUCP id 0C92BDFF; Fri, 16 Jan 1998 02:06:11 -0800
-Message-ID: 
-X-Comment: OpenGL Game Developers Mailing List
-X-Sender: mjk@fangio.engr.sgi.com (Mark Kilgard)
-Reply-To: OPENGL-GAMEDEV-L@fatcity.com
-Errors-To: ML-ERRORS@fatcity.com
-Organization: Fat City Network Services, San Diego, California
-X-ListServer: v1.0f, build 63; ListGuru (c) 1996-1998 Bruce A. Bergman
-Precedence: bulk
-Mime-Version: 1.0
-Content-Type: text/plain; charset=US-ASCII
-Content-Transfer-Encoding: 7bit
-From: mjk@fangio.engr.sgi.com (Mark Kilgard)
-Sender: root@fatcity.com
-To: Multiple recipients of list OPENGL-GAMEDEV-L 
-Subject: Re: glPolygonOffset
-Date: Fri, 16 Jan 1998 02:06:11 -0800
-
-opengl-gamedev,
-
-> At one time I came across web site with example for glPolygonOffset, but I 
-> can not find it again. Does anybody know web site. 
-
-Polygon offset is used to "lift" the projected planar shadows off of
-the floor to avoid Z fighting in my dinoshade.c example.  See:
-
-  http://reality.sgi.com/mjk/tips/TexShadowReflectLight.html
-
-Other cool OpenGL rendering techniques are shown at:
-
-  http://reality.sgi.com/mjk/tips/
-
-There are also several polygon offset examples in the GLUT 3.6 source
-code distribution.  See:
-
-  http://reality.sgi.com/mjk/glut3/glut3.html
-
-In particular, look at:
-
-  progs/examples/origami.c
-  progs/examples/surfgrid.c
-  progs/examples/dinoshade.c
-  progs/examples/halomagic.c
-  progs/redbook/polyoff.c
-  progs/advanced/haloed.c
-
-I hope this helps.
-
-- Mark
--- 
-Author: Mark Kilgard
-  INET: mjk@fangio.engr.sgi.com
-
-Fat City Network Services    -- (619) 538-5030  FAX: (619) 538-5051
-San Diego, California        -- Public Internet Access
---------------------------------------------------------------------
-To REMOVE yourself from this mailing list, send an E-Mail message
-to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
-the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
-(or the name of mailing list you want to be removed from).  You may
-also send the HELP command for other information (like subscribing).
-
-From sjbaker@hti.com  Mon Jun 14 08:52:00 1999
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["2439" "Mon" "14" "June" "1999" "08:51:06" "-0500" "Stephen J Baker" "sjbaker@hti.com" "" "65" "Re: glPolygonOffset()" "^From:" nil nil "6" nil nil nil nil nil]
-	nil)
-Received: from issun6.hti.com (sunmgr.hti.com [130.210.206.69])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id IAA24327
-	for ; Mon, 14 Jun 1999 08:51:59 -0500 (CDT)
-Received: from issun5.hti.com ([130.210.202.3]) by issun6.hti.com
-          (Netscape Messaging Server 3.6)  with ESMTP id AAA3DCD
-          for ; Mon, 14 Jun 1999 08:51:27 -0500
-Received: from samantha.bgm.link.com ([130.210.66.11]) by issun5.hti.com
-          (Netscape Messaging Server 3.6)  with SMTP id AAA4A5D
-          for ; Mon, 14 Jun 1999 08:51:26 -0500
-X-Sender: steve@samantha.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <14177.35403.456685.793490@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: "Stephen J Baker" 
-To: "Curtis L. Olson" 
-Subject: Re: glPolygonOffset()
-Date: Mon, 14 Jun 1999 08:51:06 -0500 (CDT)
-
-On Fri, 11 Jun 1999, Curtis L. Olson wrote:
-
-> What's the current recommendation for doing glPolygonOffset() type
-> stuff.
- 
-It doesn't work on 3Dfx hardware at all.
-
-I have been trying to get David B. to implement it in the FXMesa
-driver - but I'm not sure if he plans to do it in Mesa 3.1 or not.
-
-> I think I'm going to need to do something with this in the forseeable
-> future.  Either with roads and streams, or with runway markings, or
-> night lighting ...
- 
-Yep.
-
-I have been using the kludge of moving the near/far clip planes
-just a tad. This has a similar effect to glPolygonOffset and it
-works on 3Dfx hardware.
-
-Under Mesa 3.0, doing this trick is pretty fast too.
-
-Unfortunately, I kindof screwed myself on this one though.
-
-I found a Mesa bug in the fog code - and part of the fix
-increased the cost of doing fog density changes (so what!).
-Then both David B and I noticed that there was a bug that
-prevented the fog density from being recomputed when the
-near/far clip range was changed....and the fix for *that*
-makes my near/far kludge run pretty slowly.
-
-So, I'm working on the basis that I'll use the near/far
-hack on Mesa 3.0 and switch to glPolygonOffset for 3.1.
-
-Of course glPolygonOffset might well work for Mesa 3.0
-on non-3Dfx machines - and it certainly should work under
-Windoze with the OpenGL's supplied by the hardware vendors.
-
-Regrettably, the value of the two parameters to glPolygonOffset
-are likely to vary from card to card. Also, the older SGI
-machines (running OpenGL 1.0) don't have glPolygonOffset, and
-their glPolygonOffsetEXT has a different definition for the
-two glPolygonOffset parameters.
-
-Ugh!
-
-> I want to handle some tile paging issues.  I want to try drawing
-> all the terrain in immediate mode rather than doing display lists.
-
-That's probably not such a bad idea. Compiled Vertex arrays (in
-immediate mode) are the trendy solution (ie that's what Quake III does),
-you might want to investigate that.
-
-> Anyways, assuming I get that stuff handled, the next major thing I
-> hope to do would be along the lines of airports, or roads, or ground
-> lights ...
- 
-Yep. Light aircraft pilots often navigate by roads/rivers/railroads
-and having those in the scene will certainly help.
-
-Steve Baker                (817)619-2657 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-2466 (Fax)
-Work: sjbaker@hti.com      http://www.hti.com
-Home: sjbaker1@airmail.net http://web2.airmail.net/sjbaker1
-
diff --git a/Hints/portable-sound b/Hints/portable-sound
deleted file mode 100644
index 7bb6999ce..000000000
--- a/Hints/portable-sound
+++ /dev/null
@@ -1,331 +0,0 @@
-From fatcity!root@news.cts.com  Mon Jan  5 14:50:59 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["1623" "Mon" "5" "January" "1998" "12:03:38" "-0800" "Chris Schoeneman" "crs@millpond.engr.sgi.com" "" "41" "Re: [Q] OpenGL + Arbitrary display mode in Win32" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-Received: from mh2.cts.com (root@mh2.cts.com [205.163.24.68])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id OAA05604
-	for ; Mon, 5 Jan 1998 14:50:58 -0600 (CST)
-Received: from king.cts.com (root@king.cts.com [198.68.168.21]) by mh2.cts.com (8.8.7/8.8.5) with ESMTP id MAA20781; Mon, 5 Jan 1998 12:43:38 -0800 (PST)
-Received: from donews.cts.com (root@donews.cts.com [192.188.72.21])
-	by king.cts.com (8.8.7/8.8.7) with SMTP id MAA01273;
-	Mon, 5 Jan 1998 12:41:39 -0800 (PST)
-Received: from fatcity by donews.cts.com with uucp
-	(Smail3.1.29.1 #5) id m0xpJ0S-0000Hga; Mon, 5 Jan 98 12:20 PST
-Received: by fatcity.com (02-Jan-98/v1.0f-b63/bab) via UUCP id 0C927564; Mon, 05 Jan 1998 12:03:38 -0800
-Message-ID: 
-X-Comment: OpenGL Game Developers Mailing List
-X-Sender: crs@millpond.engr.sgi.com (Chris Schoeneman)
-Reply-To: OPENGL-GAMEDEV-L@fatcity.com
-Errors-To: ML-ERRORS@fatcity.com
-Organization: Fat City Network Services, San Diego, California
-X-ListServer: v1.0f, build 63; ListGuru (c) 1996-1998 Bruce A. Bergman
-Precedence: bulk
-Mime-Version: 1.0
-Content-Type: text/plain; charset=US-ASCII
-Content-Transfer-Encoding: 8bit
-From: crs@millpond.engr.sgi.com (Chris Schoeneman)
-Sender: root@fatcity.com
-To: Multiple recipients of list OPENGL-GAMEDEV-L 
-Subject: Re: [Q] OpenGL + Arbitrary display mode in Win32
-Date: Mon, 05 Jan 1998 12:03:38 -0800
-
-Doty, Lee wrote:
-> 
-> Any sound gurus out there?  I agree that if we could get 3d sound in
-> there, life would get exponentially happier.
-
-I'm willing to donate the sound code from bzflag.  It's supports:
-
-  arbitrary number of simultaneous sounds (limited by CPU speed)
-  attenuation with distance
-  propagation delay
-  doppler effects
-  stereo panning
-
-It runs in a separate thread and has a very simple interface.  I have
-it running on Windows 95/NT and Irix, and Daryll Strauss ported it to
-Linux.  The Windows version would work better if DirectSound didn't
-suck so bad, but it works reasonably well now.
-
-A drawback is that it can suck up a lot of CPU time since it has to
-do its own filtering and mixing.  It also needs support for a better
-HRTF, reverb with distance, high-frequency rolloff with distance, and
-a way to set the volume on individual sounds.  That last one is trivial
-but the others are more involved.
-
-Mark, you interested?  I've also got fullscreen and resolution changing
-code for Irix.
-
-Cheers,
--chris
--- 
-Author: Chris Schoeneman
-  INET: crs@millpond.engr.sgi.com
-
-Fat City Network Services    -- (619) 538-5030  FAX: (619) 538-5051
-San Diego, California        -- Public Internet Access
---------------------------------------------------------------------
-To REMOVE yourself from this mailing list, send an E-Mail message
-to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
-the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
-(or the name of mailing list you want to be removed from).  You may
-also send the HELP command for other information (like subscribing).
-
-From crs@millpond.engr.sgi.com  Mon Jan  5 15:36:10 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["1034" "Mon" "5" "January" "1998" "13:35:59" "-0800" "Chris Schoeneman" "crs@millpond.engr.sgi.com" "<199801052135.NAA21198@millpond.engr.sgi.com>" "23" "Re: bzflag sound playing code" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-Received: from sgi.sgi.com (SGI.COM [192.48.153.1])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with SMTP id PAA07002
-	for ; Mon, 5 Jan 1998 15:36:07 -0600 (CST)
-Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by sgi.sgi.com (950413.SGI.8.6.12/970507) via ESMTP id NAA08189
-	for <@sgi.engr.sgi.com:curt@me.umn.edu>; Mon, 5 Jan 1998 13:36:04 -0800
-	env-from (crs@millpond.engr.sgi.com)
-Received: from millpond.engr.sgi.com (millpond.engr.sgi.com [150.166.55.67]) by cthulhu.engr.sgi.com (950413.SGI.8.6.12/960327.SGI.AUTOCF) via ESMTP id NAA07557 for <@cthulhu.engr.sgi.com:curt@me.umn.edu>; Mon, 5 Jan 1998 13:36:00 -0800
-Received: (from crs@localhost) by millpond.engr.sgi.com (950413.SGI.8.6.12/960327.SGI.AUTOCF) id NAA21198 for curt@me.umn.edu; Mon, 5 Jan 1998 13:35:59 -0800
-Message-Id: <199801052135.NAA21198@millpond.engr.sgi.com>
-In-Reply-To: <199801052103.PAA30512@kenai.me.umn.edu> from "Curtis L. Olson" at Jan 5, 98 03:03:52 pm
-X-Mailer: ELM [version 2.4 PL23]
-MIME-Version: 1.0
-Content-Type: text/plain; charset=US-ASCII
-Content-Transfer-Encoding: 8bit
-From: crs@millpond.engr.sgi.com (Chris Schoeneman)
-To: curt@me.umn.edu (Curtis L. Olson)
-Subject: Re: bzflag sound playing code
-Date: Mon, 5 Jan 1998 13:35:59 -0800 (PST)
-
-Curtis L. Olson wrote:
-> 
-> Is the licensing of the bzflag sound code such that I could use it to
-> build in sounds support for our project?  We would want to have a
-> continuously looping engine sound (plus wind sound, and maybe rain
-> hitting the windshield sound.)  Then we'd need to intersperse the
-> other sounds such as flaps, stall horn, landing gear, thunder, crash,
-> etc.  It sounds like it might be exactly the sort of thing we need.
-
-Hmm, it's not a perfect match.  Most of your sounds are purely local,
-so you don't need the stereo panning, propagation delay, and doppler
-effect.  However, that's no reason not to try it!
-
-Ripping my sound code out from bzflag shouldn't be too much work
-but I'm really busy at the moment.  Could you wait about a week?
-
-BTW, as far as licensing goes I'd just want the copyright notice to
-stay on the source files (we'll have to tweek the legal notice) and
-a mention in the credits, if you have a credits list.  A right to
-use enhancements to the code would be cool, too.
-
-Cheers,
--chris
-
-From crs@millpond.engr.sgi.com  Mon Jan  5 16:22:27 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["1125" "Mon" "5" "January" "1998" "14:22:22" "-0800" "Chris Schoeneman" "crs@millpond.engr.sgi.com" "<199801052222.OAA21481@millpond.engr.sgi.com>" "27" "Re: bzflag sound playing code" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-Received: from sgi.sgi.com (SGI.COM [192.48.153.1])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with SMTP id QAA08463
-	for ; Mon, 5 Jan 1998 16:22:26 -0600 (CST)
-Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by sgi.sgi.com (950413.SGI.8.6.12/970507) via ESMTP id OAA22876
-	for <@sgi.engr.sgi.com:curt@me.umn.edu>; Mon, 5 Jan 1998 14:22:25 -0800
-	env-from (crs@millpond.engr.sgi.com)
-Received: from millpond.engr.sgi.com (millpond.engr.sgi.com [150.166.55.67]) by cthulhu.engr.sgi.com (950413.SGI.8.6.12/960327.SGI.AUTOCF) via ESMTP id OAA25764 for <@cthulhu.engr.sgi.com:curt@me.umn.edu>; Mon, 5 Jan 1998 14:22:22 -0800
-Received: (from crs@localhost) by millpond.engr.sgi.com (950413.SGI.8.6.12/960327.SGI.AUTOCF) id OAA21481 for curt@me.umn.edu; Mon, 5 Jan 1998 14:22:22 -0800
-Message-Id: <199801052222.OAA21481@millpond.engr.sgi.com>
-In-Reply-To: <199801052204.QAA31163@kenai.me.umn.edu> from "Curtis L. Olson" at Jan 5, 98 04:04:44 pm
-X-Mailer: ELM [version 2.4 PL23]
-MIME-Version: 1.0
-Content-Type: text/plain; charset=US-ASCII
-Content-Transfer-Encoding: 8bit
-From: crs@millpond.engr.sgi.com (Chris Schoeneman)
-To: curt@me.umn.edu (Curtis L. Olson)
-Subject: Re: bzflag sound playing code
-Date: Mon, 5 Jan 1998 14:22:22 -0800 (PST)
-
-Curtis L. Olson wrote:
-> 
-> Does your code support continuously looping sounds?  Or would this be
-> fairly straight forward to implement?  I've done virtually nothing
-> with sound in my life other than listen to it. :-)
-
-It does/should.  bzflag doesn't use this code though so it may suffer
-from bit rot.  I used it to test the Doppler effect.
-
-There may also be some issues around having a very large world.  Imagine
-the sound as a spherical shell.  Outside the shell, sound hasn't reached
-you yet;  inside the shell, the sound has passed by.  In bzflag I need
-to keep sounds around for as long as any part of the shell is inside the
-world because it's possible to move from one place to another instantly.
-Seems to me you have this same situation if you want external views.
-
-The sound engine is clever enough not to process sounds unless you're in
-the shell, so a large world probably won't cause any problems.  I'm just
-not sure at the moment.
-
-
-> This all sounds completely reasonable.  All our stuff is released
-> under the basic "GPL".
-
-Should be fine.  I've no problem releasing my code under the GPL.
-Cheers,
--chris
-
-From crs@millpond.engr.sgi.com  Mon Jan  5 17:33:03 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["660" "Mon" "5" "January" "1998" "15:32:53" "-0800" "Chris Schoeneman" "crs@millpond.engr.sgi.com" "<199801052332.PAA21873@millpond.engr.sgi.com>" "18" "Re: bzflag sound playing code" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-X-VM-Message-Order:
-	(1 2 3 4 6 5 7 8 9 10 11 12 13 14 15
-	 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
-	 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
-	 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
-	 61 62 63 64)
-X-VM-Summary-Format: "%n %*%a %-17.17F %-3.3m %2d %4l/%-5c %I\"%s\"\n"
-X-VM-Labels: ("r")
-X-VM-VHeader: ("Resent-" "From:" "Sender:" "To:" "Apparently-To:" "Cc:" "Subject:" "Date:") nil
-X-VM-Bookmark: 57
-Received: from sgi.sgi.com (SGI.COM [192.48.153.1])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with SMTP id RAA10765
-	for ; Mon, 5 Jan 1998 17:33:01 -0600 (CST)
-Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by sgi.sgi.com (950413.SGI.8.6.12/970507) via ESMTP id PAA14176
-	for <@sgi.engr.sgi.com:curt@me.umn.edu>; Mon, 5 Jan 1998 15:33:00 -0800
-	env-from (crs@millpond.engr.sgi.com)
-Received: from millpond.engr.sgi.com (millpond.engr.sgi.com [150.166.55.67]) by cthulhu.engr.sgi.com (950413.SGI.8.6.12/960327.SGI.AUTOCF) via ESMTP id PAA19353 for <@cthulhu.engr.sgi.com:curt@me.umn.edu>; Mon, 5 Jan 1998 15:32:53 -0800
-Received: (from crs@localhost) by millpond.engr.sgi.com (950413.SGI.8.6.12/960327.SGI.AUTOCF) id PAA21873 for curt@me.umn.edu; Mon, 5 Jan 1998 15:32:53 -0800
-Message-Id: <199801052332.PAA21873@millpond.engr.sgi.com>
-In-Reply-To: <199801052322.RAA32525@kenai.me.umn.edu> from "Curtis L. Olson" at Jan 5, 98 05:22:08 pm
-X-Mailer: ELM [version 2.4 PL23]
-MIME-Version: 1.0
-Content-Type: text/plain; charset=US-ASCII
-Content-Transfer-Encoding: 8bit
-From: crs@millpond.engr.sgi.com (Chris Schoeneman)
-To: curt@me.umn.edu (Curtis L. Olson)
-Subject: Re: bzflag sound playing code
-Date: Mon, 5 Jan 1998 15:32:53 -0800 (PST)
-
-Curtis L. Olson wrote:
-> 
-> Our code is all GPL'd, so if you can keep within those license
-> restrictions feel free to borrow code.  (Or does bzflag take place a
-> long time ago in a galaxy far, far away ... I haven't tried running it
-> yet myself.) :-)
-
-Actually, it's already got accurate sun, moon, and stars.  The star
-magnitudes are relatively okay (there's not enough dynamic range on
-a monitor anyway).  You can specify any position on the earth, and
-the positions are accurately based on the time and date.  Great minds
-think alike, eh?
-
-I don't have the planets as I thought I'd gone overboard myself.  Guess
-I hadn't gone far enough!
-
-Cheers,
--chris
-
-From curt@me.umn.edu  Thu Apr 30 09:02:28 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["3542" "" "30" "April" "1998" "09:02:26" "-0500" "Curtis L. Olson" "curt@me.umn.edu" nil "88" "[comp.os.linux.announce] Enlightened Sound Daemon version 0.2" "^From:" nil nil "4" nil nil nil nil nil]
-	nil)
-Received: from kenai.me.umn.edu (curt@kenai.me.umn.edu [134.84.18.22])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id JAA10406
-	for ; Thu, 30 Apr 1998 09:02:28 -0500 (CDT)
-Received: (from curt@localhost)
-	by kenai.me.umn.edu (8.8.5/8.8.5) id JAA19157;
-	Thu, 30 Apr 1998 09:02:27 -0500
-Message-ID: 
-Lines: 88
-X-Mailer: Gnus v5.3/Emacs 19.34
-From: curt@me.umn.edu (Curtis L. Olson)
-Sender: curt@me.umn.edu
-To: curt@me.umn.edu
-Subject: [comp.os.linux.announce] Enlightened Sound Daemon version 0.2
-Date: 30 Apr 1998 09:02:26 -0500
-
-
--- 
-Curtis Olson                        University of MN, ME Dept.
-curt@me.umn.edu                     
-http://www.menet.umn.edu/~curt      Try Linux!
-------- Start of forwarded message -------
-From: "Eric B. Mitchell" 
-Newsgroups: comp.os.linux.announce
-Subject: Enlightened Sound Daemon version 0.2
-Followup-To: comp.os.linux.misc
-Date: Thu, 30 Apr 1998 08:25:43 GMT
-Organization: Altair Aerospace Corporation
-Message-ID: 
-Reply-To: emitchell@altaira.com
-
------BEGIN PGP SIGNED MESSAGE-----
-
-
-I am pleased to announce the preliminary release of the 
-Enlightened Sound Daemon (EsounD version 0.2) for Linux.  
-More details at .
-This program is designed to mix together several digitized 
-audio streams for playback by a single device.  The current 
-list of features includes the following functionality:
-
- o  A simple authentication scheme is implemented.  The first
-    process to present a 16 byte key to the daemon determines
-    the ownership of the daemon.  The owner of the daemon may
-    allow or disallow connections from other keys.  If a HUP
-    signal is received, ownership of the daemon is reset.
-
- o  Playback of multiple digital samples simultaneously is 
-    supported.  The daemon uses a raw sample format which 
-    is easily generated by the SOX utility from many other 
-    data formats.
-
- o  The mixed audio data may be output from the daemon as a
-    "monitor" stream.
-
- o  Recording from the current input of the sound device is
-    supported.  Full duplex operation (simultaneous recording
-    and playback) is supported.
-
- o  Client connections may cache samples for playback by an 
-    assigned identification number.  For example, a window
-    manager may cache samples in the server for playback on
-    various events, and play them back without replaying the
-    full audio stream for the sample.  Samples may be looped
-    until the server receives a "stop sample" message. 
-
-Currently, the only platform supported is Linux.  It is intended
-that this program support multiple platforms.  I have limited
-access to other Unix platforms, so any help in porting the
-Enlightened Sound Daemon to other platforms is appreciated.  
-The amp program, by Tomislav Uzelac may be a good reference 
-for porting the audio interface to other platforms.
-
-This is to be considered an alpha release, as functionality
-remains to be implemented.
-
-- -- ebm
-+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+
-|  __                         a.k.a. Eric B. Mitchell |
-|  |_) .  _  _|      _|  _     ericmit@ix.netcom.com  |
-|  | \ ( (_ (_| (_| (_| (/_   www.netcom.com/~ericmit |
-| How's My Programming?   Call:  1 - 800 - DEV - NULL |
-+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+
-
-
-
-- -- 
-This article has been digitally signed by the moderator, using PGP.
-http://www.iki.fi/mjr/cola-public-key.asc has PGP key for validating signature.
-Send submissions for comp.os.linux.announce to: linux-announce@news.ornl.gov
-PLEASE remember a short description of the software and the LOCATION.
-This group is archived at http://www.iki.fi/mjr/linux/cola.html
-
------BEGIN PGP SIGNATURE-----
-Version: 2.6.3ia
-Charset: latin1
-
-iQCVAgUBNUg1h1rUI/eHXJZ5AQHjSwP/aGb9U1fIgnUA6qMaD6x/JeTM2IJVRLDa
-YxXoZ9EbENIKCbV9lV0PcGogW0+eA2zAZq3tQFu9P9B+eFX6jcVD2FhDekvFI5ZS
-j44u74PbNU45LIuw2xxiaBAgfZcnZ9XZ3uy6Z9Yu3Xd+xkZ5k9nxafP1+tkPztmA
-y5okM7m4rEs=
-=Y1B3
------END PGP SIGNATURE-----
-------- End of forwarded message -------
-
diff --git a/Hints/scene-graph b/Hints/scene-graph
deleted file mode 100644
index 522c7681d..000000000
--- a/Hints/scene-graph
+++ /dev/null
@@ -1,85 +0,0 @@
-From owner-fgfs-devel@flightgear.org  Fri Mar 12 12:57:31 1999
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["1824" "Fri" "12" "March" "1999" "12:55:14" "-0600" "Stephen J Baker" "sjbaker@hti.com" "" "53" "[FGFS-Devel] Scene graph API." "^From:" nil nil "3" nil nil nil nil nil]
-	nil)
-Received: from mailhub.woodsoup.org (IDENT:root@anduin.physics.iastate.edu [129.186.82.1])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id MAA10391
-	for ; Fri, 12 Mar 1999 12:57:30 -0600 (CST)
-Received: from majordom by mailhub.woodsoup.org with local (Exim 1.92 #1)
-	for fgfs-devel-outgoing@flightgear.org
-	id 10LX6P-0003CG-00; Fri, 12 Mar 1999 12:56:09 -0600
-Received: from sunmgr.hti.com ([130.210.206.69] helo=issun6.hti.com)
-	by mailhub.woodsoup.org with esmtp (Exim 1.92 #1)
-	for fgfs-devel@flightgear.org
-	id 10LX6O-0003C8-00; Fri, 12 Mar 1999 12:56:08 -0600
-Received: from issun5.hti.com ([130.210.202.3]) by issun6.hti.com
-          (Netscape Messaging Server 3.6)  with ESMTP id AAAEEB
-          for ; Fri, 12 Mar 1999 12:55:26 -0600
-Received: from samantha.bgm.link.com ([130.210.65.19]) by issun5.hti.com
-          (Netscape Messaging Server 3.6)  with SMTP id AAA6D20
-          for ; Fri, 12 Mar 1999 12:55:25 -0600
-X-Sender: steve@samantha.bgm.link.com
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: fgfs-devel@flightgear.org
-From: "Stephen J Baker" 
-Sender: owner-fgfs-devel@flightgear.org
-To: Flight Gear Mailing List 
-Subject: [FGFS-Devel] Scene graph API.
-Date: Fri, 12 Mar 1999 12:55:14 -0600 (CST)
-
-
-I have just posted an early (pre-alpha - whatever) version of my
-new Scene Graph API and simple matrix/vector math library onto my
-web site:
-
-   http://www.woodsoup.org/~sbaker/ssg
-
-...and...
-
-   http://www.woodsoup.org/~sbaker/sg
-
-...these are the libraries that I'm using in my Tux-the-Penguin
-game - so they *work* pretty well - but may not be as complete
-or well-structured as they should be. There are also no example
-programs (apart from the game itself) and the only file loader
-is for an obscure ASCII format that nobody is likely to want
-as a standard. I hope to fix that somewhat over then next few
-weeks - but I'm on vacation next week.
-
-I think these libraries could be applicable to FGFS in several
-areas:
-
-1) 3D instrument panels.
-
-2) BUildings and other hand-created features like airfields,
-   detailed city areas and so forth.
-
-3) Other aircraft.
-
-There are some issues about how this would all integrate into
-Curts terrain rendering scheme - but I think it's do-able.
-
-Anyway, it would be nice if people would read the manuals
-and email me some comments, criticisms, suggestions, etc.
-Like I said though - these are really early cuts so don't
-go out and write 100,000 lines of code that depend on
-them - OK?
-
-Since I'm going to be out in the wilds of Arkansas for the
-next week (Do they have email out there? I *think* they
-have phones), don't expect a quick answer to any questions.
-
-Steve Baker                (817)619-2657 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-2466 (Fax)
-Work: sjbaker@hti.com      http://www.hti.com
-Home: sjbaker1@airmail.net http://web2.airmail.net/sjbaker1
-
-
---
-Please visit the FGFS web page:  http://www.flightgear.org
-For help on using this list (especially unsubscribing), send a message to
-"fgfs-devel-request@flightgear.org" with a single line of text: "help".
-
diff --git a/Hints/screen-dump b/Hints/screen-dump
deleted file mode 100644
index b77b24f4e..000000000
--- a/Hints/screen-dump
+++ /dev/null
@@ -1,66 +0,0 @@
-From kaszeta@me.umn.edu  Tue Apr 27 12:25:04 1999
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["1377" "Tue" "27" "April" "1999" "12:25:03" "-0500" "Richard Kaszeta" "kaszeta@me.umn.edu" nil "46" "Screen Dump under OpenGL" "^From:" nil nil "4" nil nil nil nil nil]
-	nil)
-Received: from bofh.me.umn.edu (kaszeta@bofh.me.umn.edu [134.84.18.23])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id MAA17257
-	for ; Tue, 27 Apr 1999 12:25:04 -0500 (CDT)
-Received: (from kaszeta@localhost)
-	by bofh.me.umn.edu (8.9.1/8.9.1) id MAA32360;
-	Tue, 27 Apr 1999 12:25:04 -0500
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-Content-Transfer-Encoding: 7bit
-Message-ID: <14117.62191.861894.721574@bofh.me.umn.edu>
-X-Mailer: VM 6.47 under Emacs 19.34.1
-From: Richard Kaszeta 
-To: curt@me.umn.edu
-Subject: Screen Dump under OpenGL
-Date: Tue, 27 Apr 1999 12:25:03 -0500 (CDT)
-
-Dumps the framebuffer to a .ppm file:
-
-#include 
-#include 
-#include 
-#include 
-
-#define RGB  3			/* 3 bytes of color info per pixel */
-#define RGBA 4			/* 4 bytes of color+alpha info */
-
-void my_glDumpWindow(const char * filename, int win_width, int win_height) {
-  int i, j, k, q;
-  GLubyte *buffer;
-  unsigned char *ibuffer;
-  FILE *fp;
-
-  buffer = (GLubyte *) malloc(win_width*win_height*RGBA);
-  ibuffer = (unsigned char *) malloc(win_width*win_height*RGB);
-
-  /* read window contents from color buffer with glReadPixels */
-  glFinish();
-  glReadPixels(0, 0, win_width, win_height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-
-  fp = fopen(filename, "w");
-  fprintf(fp, "P6\n# CREATOR: glReadPixel()\n%d %d\n%d\n",
-          win_width, win_height, UCHAR_MAX);
-  q = 0;
-  for (i = 0; i < win_height; i++)
-    for (j = 0; j < win_width; j++)
-      for (k = 0; k < RGB; k++)
-        ibuffer[q++] = (unsigned char)
-          *(buffer + (RGBA*((win_height-1-i)*win_width+j)+k));
-  fwrite(ibuffer, sizeof(unsigned char), RGB*win_width*win_height, fp);
-  fclose(fp);
-  free(buffer);
-  free(ibuffer);
-
-  printf("wrote file (%d x %d pixels, %d bytes)\n",
-         win_width, win_height, RGB*win_width*win_height);
-}
-
--- 
-Richard W Kaszeta 			PhD. Candidate and Sysadmin
-bofh@me.umn.edu				University of MN, ME Dept
-http://www.menet.umn.edu/~kaszeta
-
diff --git a/Hints/shadows-lights b/Hints/shadows-lights
deleted file mode 100644
index f27db254b..000000000
--- a/Hints/shadows-lights
+++ /dev/null
@@ -1,178 +0,0 @@
-From owner-fgfs-devel@flightgear.org  Tue Jun 15 12:24:35 1999
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["5330" "Tue" "15" "June" "1999" "12:24:25" "-0500" "Stephen J Baker" "sjbaker@hti.com" "" "145" "RE: [FGFS-Devel] Towards a Binary Scenery Format" "^From:" nil nil "6" nil nil nil nil nil]
-	nil)
-Received: from mailhub.woodsoup.org (IDENT:root@anduin.physics.iastate.edu [129.186.82.1])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id MAA00346
-	for ; Tue, 15 Jun 1999 12:24:34 -0500 (CDT)
-Received: from majordom by mailhub.woodsoup.org with local (Exim 1.92 #1)
-	for fgfs-devel-outgoing@flightgear.org
-	id 10twwQ-0005Iu-00; Tue, 15 Jun 1999 12:24:06 -0500
-Received: from sunmgr.hti.com ([130.210.206.69] helo=issun6.hti.com)
-	by mailhub.woodsoup.org with esmtp (Exim 1.92 #1)
-	for fgfs-devel@flightgear.org
-	id 10twwP-0005Ia-00; Tue, 15 Jun 1999 12:24:05 -0500
-Received: from issun5.hti.com ([130.210.202.3]) by issun6.hti.com
-          (Netscape Messaging Server 3.6)  with ESMTP id AAA5868
-          for ; Tue, 15 Jun 1999 12:23:32 -0500
-Received: from lechter.bgm.link.com ([130.210.63.22]) by issun5.hti.com
-          (Netscape Messaging Server 3.6)  with SMTP id AAA40B9
-          for ; Tue, 15 Jun 1999 12:23:31 -0500
-X-Sender: steve@lechter.bgm.link.com
-In-Reply-To: <14182.32328.710469.293159@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: fgfs-devel@flightgear.org
-From: "Stephen J Baker" 
-Sender: owner-fgfs-devel@flightgear.org
-To: fgfs-devel@flightgear.org
-Subject: RE: [FGFS-Devel] Towards a Binary Scenery Format
-Date: Tue, 15 Jun 1999 12:24:25 -0500 (CDT)
-
-On Tue, 15 Jun 1999, Curtis L. Olson wrote:
-
-> With what you know about our current terrain scheme, do we have any
-> chance of doing things like having object cast shadows on the ground
-> ... especially our own plane?  How about landing lights illuminating
-> the ground?
- 
-Well, ownship shadow is do-able so long as people don't get too picky.
-General shadows are impossible. Shadows for a few specialised things
-might be doable if they are really important to you. (We need them
-for things like Night-Vision-Goggles (NVG's) where shadows cast by
-the moon are CRITICAL to military operations).
-
-For ownship shadows, 
-
-You can figure out the intersection of the ray from the sun through
-the center of the plane onto the ground polygons - that's not too
-hard.
-
-Then take a texture mapped quad containing a plan-view shadow and
-rotate it to the same heading as ownship but with the roll/pitch
-driven by the terrain.
-
-That looks OK for 99% of the time and is probably 'good enough'.
-
-I do this in my Tux game - with a circular shadow texture,
-there are LOTS of cases where it fails, nobody noticed yet!
-
-Caveats:
-
-* It doesn't take account of ownship roll/pitch - although
-  for small angles, you can perhaps kludge it by squashing the
-  shadow polygon in width/length.
-
-* It won't shadow things like buildings or other aircraft.
-  (because the shadow is projected onto the terrain beneath
-  them).
-
-* It won't split across terrain polygons - so it tends to
-  momentarily vanish in concavities and momentarily float
-  above convexities.
-
-* You need a different shadow texture for each aircraft type.
-
-* It's not easy to produce umbra/penumbra effects as a
-  function of ownship altitude...but you could maybe
-  kludge something with glAlphaFunc.
-
-Helicopter and VTOL pilots use the ownship shadow as an
-important height cue - so you need to get it right for
-them. However, they tend not to land with 60 degree
-bank angles!  I believe that Navy pilots learn to use
-the shadow as a height cue when ditching in the ocean.
-
-
-Landing lights are a pain. In OpenGL, you can define a light
-source for each landing light (not many planes need more than
-the half dozen or so that OpenGL guarantees to support).
-
-The problem is that lighting is only computed at polygon
-vertices. When you are on approach, there are likely to
-be polygons that are MUCH larger than the puddle of light
-that the landing light projects.
-
-You can decimate polygons either dynamically (hard) or
-statically (easier).
-
-Statically, just make runway/taxiway/apron polygons that
-are modelled so as to be switched into 'high detail' at
-close range using an LOD node (ssgRangeSelector in SSG).
-That's not really great because you can't land on a road
-or in a field that the database prep tools didn't think
-you'd want to land in because your lights won't work well.
-You'll also get bad things happening when you fly low
-over general terrain with your landing lights on.
-
-Dynamically is REALLY hard to code with any generality.
-
-Instead of using OpenGL lights, you could use multi-pass
-rendering or make use of Multi-texture (if your hardware
-supports it). In this way, you can render a daylight
-scene and on a second pass render a black anti-light
-texture over the entire scene.
-
-In the past, that was REALLY COSTLY because it halved
-your frame rate. However, the latest generation of
-PC cards can do multi-texture which should greatly
-speed that up. On a Voodoo-3, the second pass is
-essentialy free.
-
-Multipass is great for single landing lights - but
-if you have a wingman who is landing in formation,
-or if you are flying a 747 with half a dozen
-landing lights - then you need one OpenGL rendering
-pass PER LIGHT - plus the original...now you are
-screwed and will lose framerate.
-
-A *REALLY* cheesy solution that I used once in a
-railroad simulator was to render the scene with
-dense black fog applied to all of the terrain and
-buildings - but not to lights and the sky. The
-result was an omni-directional light source that
-didn't cast nice pools of light - but which was
-utterly free.
-
-Using a second texture pass, it's hard to get the
-light to attenuate nicely with range - so you tend
-to light up mountains that are 40 miles away with
-your super-bright landing lights! The kludge to
-fix that is to add the cheesy black fog trick to
-the light-texture pass.
-
-I think that of all of these, statically diced
-polygons works best. However, it rather relies
-on the fact that:
-
-* Light aircraft don't often fly low over
-  open country at night.
-
-* Big aircraft don't fly low over open
-  country at all.
-
-* Airforce planes don't fly with landing
-  lights on at all unless they are on
-  final approach. This would be stoopid
-  in combat - and they are taught to fly
-  that way at all times.
-
-* Navy pilots are even taught to land without
-  landing lights.
-
-If FGFS pilots want to land on freeways at night,
-then their landing lights would look *terrible*.
-
-Steve Baker                (817)619-2657 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-2466 (Fax)
-Work: sjbaker@hti.com      http://www.hti.com
-Home: sjbaker1@airmail.net http://web2.airmail.net/sjbaker1
-
-
---
-Please visit the FGFS web page:  http://www.flightgear.org
-For help on using this list (especially unsubscribing), send a message to
-"fgfs-devel-request@flightgear.org" with a single line of text: "help".
-
diff --git a/Hints/ssg b/Hints/ssg
deleted file mode 100644
index 6409424b3..000000000
--- a/Hints/ssg
+++ /dev/null
@@ -1,244 +0,0 @@
-From owner-fgfs-devel@flightgear.org  Thu May 20 08:36:54 1999
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["8912" "Thu" "20" "May" "1999" "08:35:37" "-0500" "Stephen J Baker" "sjbaker@hti.com" nil "210" "Re: [FGFS-Devel] Things to do list" "^From:" nil nil "5" nil nil nil nil nil]
-	nil)
-Received: from mailhub.woodsoup.org (IDENT:root@anduin.physics.iastate.edu [129.186.82.1])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id IAA09534
-	for ; Thu, 20 May 1999 08:36:53 -0500 (CDT)
-Received: from majordom by mailhub.woodsoup.org with local (Exim 1.92 #1)
-	for fgfs-devel-outgoing@flightgear.org
-	id 10kSzs-0005Sv-00; Thu, 20 May 1999 08:36:28 -0500
-Received: from sunmgr.hti.com ([130.210.206.69] helo=issun6.hti.com)
-	by mailhub.woodsoup.org with esmtp (Exim 1.92 #1)
-	for fgfs-devel@flightgear.org
-	id 10kSzq-0005SX-00; Thu, 20 May 1999 08:36:26 -0500
-Received: from issun5.hti.com ([130.210.202.3]) by issun6.hti.com
-          (Netscape Messaging Server 3.6)  with ESMTP id AAA3BC4
-          for ; Thu, 20 May 1999 08:35:55 -0500
-Received: from samantha.bgm.link.com ([130.210.66.11]) by issun5.hti.com
-          (Netscape Messaging Server 3.6)  with SMTP id AAA3FBA
-          for ; Thu, 20 May 1999 08:35:54 -0500
-X-Sender: steve@samantha.bgm.link.com
-In-Reply-To: <14147.454.803438.762388@pinky.infoplane.com>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: fgfs-devel@flightgear.org
-From: "Stephen J Baker" 
-Sender: owner-fgfs-devel@flightgear.org
-To: fgfs-devel@flightgear.org
-Subject: Re: [FGFS-Devel] Things to do list
-Date: Thu, 20 May 1999 08:35:37 -0500 (CDT)
-
-On Wed, 19 May 1999, Curtis L. Olson wrote:
-
-> Flight Gear world coordinate system:
-> 
-> (0, 0, 0) is at the center of the earth.  Z is up through the north
-> pole, X is out through point where the zero meridian intersects the
-> equator (somewhere in africa).  Y is out where the 90th meridian
-> intersects the equator (somewhere in the indian ocean.)  Here's a
-> picture:
-> 
->     http://www.flightgear.org/Docs/Scenery/CoordinateSystem/img8.gif
-> 
-> However, using this coordinate system directly to render the scenery
-> in OpenGL leads to all sorts of precision problems.  So, for actual
-> rendering in OpenGL, I use a coordinate system that is aligned exactly
-> the same, but is translated so that (0, 0, 0) is at the center of the
-> current tile's bounding sphere.  This means that all the coordinates
-> I'm feeding to opengl are "near" (0, 0, 0) within a couple thousand
-> meters.
-
-But each tile must have a translation matrix pushed on the OpenGL
-stack before it is rendered - right?  Does that translation
-operate:
-
-* Relative to ownship.
-* Relative to some arbitary origin (like the center of the 'current'
-  tile) that moves periodically (eg when you cross a tile boundary).
-* Some other way.
-
-> My "embarrassing problem" is that I don't understand enough about ssg
-> to know if it could be made to mesh well with the current flight gear
-> coordinate system.
- 
-Well, I think the problem of point features on the terrain is a different
-one from moving models like aircraft.
-
-For aircraft, we can have an SSG scene graph, with each aircraft
-model positioned under a ssgTransform node and an ssgSelector node.
-Something like this:
-
-                         o             ssgRoot for all of our
-                         |             moving models
-                _________|_________ 
-               |    |    |    |    |
-               o    o    o    o    o   ssgSelector nodes
-               |    |    |    |    |
-               o    o    o    o    o   ssgTransform nodes
-               |    |    |    |    |
-           cessna pitts C130 F16  747  Aircraft models loaded
-                                       from disk.
-
-(It would be more complex if - for example - we wanted three
-747's in the scenario - but wanted to use the same polygonal
-model for all three of them...still, it's not too bad)
-
-The ssgSelector nodes allow the planes to be turned on and off
-as needed in the scenario we are playing. The ssgTransform nodes
-let us position them relative to some arbitary origin.
-
-Each frame, we pick up the location of each model (Lat/Lon/Alt/
-Heading/Pitch/Roll) from some FGFS data structure somewhere.
-We do a very quick and dirty check to see if it is within (say)
-20 miles of the eyepoint (you can do that just be comparing lat/long
-with ownship lat/long using an approximate table to convert degrees
-longitude into meters depending on your latitude). 
-
-If the aircraft is too far away, use it's ssgSelector node to turn
-it off - this saves the expense of a costly LLA->XYZ conversion and
-makes culling cheaper for SSG when there are a lot of aircraft in
-the managed scene.
-
-We need to pick a 'current local origin'. This could be the center
-of the nearest terrain tile, it could be a point vertically below
-the ownship at sea level...somewhere close by.
-
-If the aircraft is reasonably close, compute the location of the aircraft
-relative to the current local origin. This entails some double-precision
-math but it's not all that hard - and it boils down to a 'float' 4x4 matrix.
-I imagine the math for this is already there to compute the eyepoint
-transform for the ownship.
-
-Put that matrix into the ssgTransform node and turn on the ssgSelector
-for that plane.
-
-At some point (probably after the terrain is rendered) you tell SSG
-where the ownship is relative to the current local origin and cull
-and draw the SSG scene.
-
-All done.
-
-At present, the aircraft models have to be in AC3D format - because
-that's the only file loader. However, there is work in progress
-(check the PLIB mailing list for details) to produce a VRML-2 loader,
-which should make it possible for anyone to build or convert aircraft
-models using a variety of modelling tools.
-
-For now, I think there is at least one AC3D format plane model on
-the AC3D demo distribution that will allow us to get all the
-FGFS code up and running.
-
-> Thinking about ground objects for instance (buildings, radio towers,
-> etc.)  Basically we'd need to be able to rotate these ssh objects so
-> that they are aligned with the up vector for where ever they are being
-> placed.  This rotation matrix can be generated directly from the
-> object's latitude and longitude.
- 
-There could be a separate SSG scene graph for each terrain tile.
-Placing an ssgTransform at the top of that scene graph would allow
-you to apply the same transform to all the features on the terrain
-tile as to the terrain itself. The objects beneath that transform
-could then be positioned on the tile using the same kinds of mechanisms
-that you use to create the terrain skin.
-
-I presume that you have some code to turn a lat/lon/alt/heading/pitch/roll
-into a matrix (I guess the ownship positioning code must need that).
-Using that routine to generate the location of objects on the skin
-(in your offline tools) would allow you to generate a terrain feature
-set from a pre-built library.
-
-So, you'd get this:
-
-In your source data:
-
-   There is a power plant at lat=L1, lon=L2, heading=H
-
-In your tools you'll need to figure out the height of the terrain skin
-at (L1,L2) and use that resulting Lat/Lon/Alt/Heading/0/0 to compute
-(in double-precision) the transform needed to position that object
-relative to the center of the earth. Subtract the origin of the terrain
-tile from the translation part of that - and you have something that
-you can reduce to 'float' precision.
-
-Also offline, decide which of a standard set of pre-built "library"
-models best represents a power plant.
-
-In your output terrain tile file:
-
-  There is an instance of object number 1234 at the location
-  described by [4x4 matrix] relative to the terrain tile's
-  local origin.
-
-There are four ways (I guess) we could do the next part:
-
- 1) We could use SSG to cull the entire scene (including
-    terrain skin) - discarding your existing culling routines
-    and creating new SSG nodes for your terrain skin.
-
- 2) We could build an SSG scene graph structure that has
-    an ssgTransform for each terrain tile - but have that
-    contain only the point features for that tile. You'd
-    render your terrain with the existing code and then
-    call SSG to cull and draw the point features.
-
- 3) We could build a separate SSG scene graph for each
-    terrain tile and call the cull and draw routine for
-    each tile only if the existing terrain tile passes
-    the terrain cull test.
-
- 4) Don't use SSG, just extend the existing terrain renderer
-    to do the point features.
-
-It seems to me that (2) is not very efficient since the
-culling process is happening twice for each terrain tile,
-once in the terrain renderer and again inside SSG.
-
-I'm not sure that SSG is mature enough to do (1) yet since
-it doesn't sort by material property yet. However, that is
-work that will ultimately need to be done anyway - so maybe
-we just live with the inefficiency for now. If SSG had
-existed before the existing terrain renderer had been
-written, we should certainly have gone this way.
-
-(3) is possible. It seems a little messy to have two sets
-of culling routines layered on top of each other - and I
-can concieve of a problem when a point feature object is
-on the very edge of a terrain tile...hanging just off
-the edge in fact...the terrain culling routines might
-discard the terrain tile - and hence the SSG scene
-graph would never be evaluated and the point feature
-would not be drawn - even though it might be partially
-on-screen.  That would be a bad problem for hand-built
-airfields for example.
-
-(4) might well turn out to be easiest - but Curt would
-have to write loaders for VRML and other file formats
-and considerably change the existing terrain rendering
-code. That would be pretty wasteful and writing good
-VRML loaders would duplicate the work already being
-done for SSG.
-
-Evidently this requires more thought and discussion
-between Curt and myself.
-
-> Can ssg do these sorts of things?
- 
-In principle. SSG can be changed if needed. It's my
-project and I'll do whatever it takes to make it useful.
-Whether I can do that to a schedule that suits FGFS
-is not certain.
-
-Steve Baker                (817)619-2657 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-2466 (Fax)
-Work: sjbaker@hti.com      http://www.hti.com
-Home: sjbaker1@airmail.net http://web2.airmail.net/sjbaker1
-
-
---
-Please visit the FGFS web page:  http://www.flightgear.org
-For help on using this list (especially unsubscribing), send a message to
-"fgfs-devel-request@flightgear.org" with a single line of text: "help".
-
diff --git a/Hints/stl-gcc-redhat b/Hints/stl-gcc-redhat
deleted file mode 100644
index fba450c70..000000000
--- a/Hints/stl-gcc-redhat
+++ /dev/null
@@ -1,153 +0,0 @@
-From: Bernie Bright 
-Sender: owner-fgfs-devel@flightgear.org
-To: fgfs-devel@flightgear.org
-Subject: Re: [FGFS-Devel] Another problem compiling Flightgear 0.55
-Date: Mon, 02 Nov 1998 14:31:05 +1100
-
-Arno Dabekaussen wrote:
-> 
-> Hi Curt,
-> 
-> Thanks for answerring my former post, but unfortunately the compilation
-> blew up again.
-> Here is the relevant information.
-> 
-> With kind regards,
-> 
-> Arno Dabekaussen
-> 
-> Making all in Time
-> make[2]: Entering directory
-> `/home/arno/applications/FlightGear-0.55/Simulator/Time'
-> c++ -DHAVE_CONFIG_H -I. -I../../././Simulator/Time -I../../Include
-> -DHAVE_DAYLIGHT -DHAVE_TIMEZONE -I../.. -I../../Lib -I../../Simulator
-> -I/usr/local/include -I/usr/X11R6/include -g -O2 -c event.cxx
-> In file included from /usr/include/g++/std/bastring.h:571,
->                  from /usr/include/g++/std/string.h:6,
->                  from /usr/include/g++/string:5,
->                  from event.hxx:42,
->                  from event.cxx:48:
-> /usr/include/g++/std/sinst.h:60: ambiguous template instantiation for
-> `operator !=(const char *, const
-> basic_string > &)' requested
-
-[snip]
-
-This is a known problem with the string class in g++ 2.7.x and is not
-limited to FG. I've attached an unofficial patch to that fixes the
-problem.  Note, you'll need root access to apply the patch.
-
-Cheers
-Bernie.>From khan@xraylith.wisc.edu Wed Mar 05 02:21:24 1997
-Path: news.mel.aone.net.au!news.mel.connect.com.au!munnari.OZ.AU!news.ecn.uoknor.edu!feed1.news.erols.com!newsfeeds.sol.net!uwm.edu!newsspool.doit.wisc.edu!news.doit.wisc.edu!khan
-From: khan@xraylith.wisc.edu (Mumit Khan)
-Newsgroups: gnu.g++.help
-Subject: Re: Compiling with strings & vectors
-Date: 4 Mar 1997 16:21:24 GMT
-Organization: Center for X-ray Lithography, UW-Madison
-Lines: 100
-Message-ID: <5fhi64$lsa@news.doit.wisc.edu>
-References: <5ffoh9$v2a$1@quartz.inquo.net>
-NNTP-Posting-Host: modi.xraylith.wisc.edu
-
-In article <5ffoh9$v2a$1@quartz.inquo.net>,
-Travis Jensen  wrote:
->I am trying to use a 'string' in a program compiled with 2.7.2.2
->and libg++ 2.7.2.  If I just 
->
->  #include  
->
->and use it, I have no problems.  However, if I 
->  
->  #include 
-   ^^^^^^^^^^^^^^^^^^^
-
-should be 
-   #include 
-
->  #include 
->
->Is there something special I have to do to use strings and vectors
->together?
->
-
-I've posted an unofficial patch to libstdc++ headers (no re-compilation
-necessary, so it's easy!) something like 19 times so far. Here is a copy
-of an old posting:
-
-=====================================================================
-
-If you're using GNU STL that comes with libg++-2.7.1, must apply the 
-following patch (no recompilation necessary):
-    
-    % cd /usr/local/lib/g++-include/std
-    % patch -s -p0 < /tmp/libg++-2.7.1-patch
-
-==== LIBG++ patch
-
-*** bastring.h.org	Sun Dec  3 10:51:44 1995
---- bastring.h	Sun Dec  3 10:51:43 1995
-***************
-*** 523,529 ****
-  }
-  
-  // Kludge this until g++ supports the new template overloading semantics.
-! #if !defined(FUNCTION_H)
-  template 
-  inline bool
-  operator!= (const basic_string & lhs,
---- 523,529 ----
-  }
-  
-  // Kludge this until g++ supports the new template overloading semantics.
-! #if !defined(FUNCTION_H) && !defined(OS_STL_FUNCTION_H)
-  template 
-  inline bool
-  operator!= (const basic_string & lhs,
-*** cinst.h.org	Sun Dec  3 10:51:48 1995
---- cinst.h	Sun Dec  3 10:51:47 1995
-***************
-*** 84,92 ****
---- 84,94 ----
-  __DO2(operator==,__B,__CCR,__CCR)
-  __DO2(operator==,__B,__CCR,__F)
-  __DO2(operator==,__B,__F,__CCR)
-+ #if !defined(FUNCTION_H) && !defined(OS_STL_FUNCTION_H)
-  __DO2(operator!=,__B,__CCR,__CCR)
-  __DO2(operator!=,__B,__CCR,__F)
-  __DO2(operator!=,__B,__F,__CCR)
-+ #endif
-  __DO1(abs,__F,__CCR)
-  __DO1(arg,__F,__CCR)
-  __DO2(polar,__C,__F,__F)
-*** sinst.h.org	Thu Feb 29 11:20:52 1996
---- sinst.h	Thu Feb 29 11:21:22 1996
-***************
-*** 57,67 ****
---- 57,71 ----
-  //  __DOPR (op, bool, wchar_t, __W)
-  
-  __DOB (==)
-+ #if !defined(FUNCTION_H) && !defined(OS_STL_FUNCTION_H)
-  __DOB (!=)
-+ #endif
-  __DOB (<)
-+ #if !defined(FUNCTION_H) && !defined(OS_STL_FUNCTION_H)
-  __DOB (>)
-  __DOB (<=)
-  __DOB (>=)
-+ #endif
-  
-  #undef __S
-  //#undef __W
-
-
-==== END LIBG++ patch
-
-Enjoy
-Mumit -- khan@xraylith.wisc.edu
-http://www.xraylith.wisc.edu/~khan/
-
-Cc: gnu.g++.help,
-    Travis Jensen  
-
diff --git a/Hints/strips-vs-fans b/Hints/strips-vs-fans
deleted file mode 100644
index 700de8058..000000000
--- a/Hints/strips-vs-fans
+++ /dev/null
@@ -1,251 +0,0 @@
-From fatcity!root@news.cts.com  Sun Apr 12 22:32:55 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["2122" "Sun" "12" "April" "1998" "19:50:31" "-0800" "Steve Baker" "sbaker@link.com" nil "47" "Re: Strips vs Fans ..." "^From:" nil nil "4" nil nil nil nil nil]
-	nil)
-Received: from mh2.cts.com (root@mh2.cts.com [205.163.24.68])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id WAA20847
-	for ; Sun, 12 Apr 1998 22:32:52 -0500 (CDT)
-Received: from king.cts.com (root@king.cts.com [198.68.168.21]) by mh2.cts.com (8.8.7/8.8.5) with ESMTP id UAA22193; Sun, 12 Apr 1998 20:31:45 -0700 (PDT)
-Received: from donews.cts.com (root@donews.cts.com [192.188.72.21])
-	by king.cts.com (8.8.7/8.8.7) with SMTP id UAA00319;
-	Sun, 12 Apr 1998 20:31:43 -0700 (PDT)
-Received: from fatcity by donews.cts.com with uucp
-	(Smail3.1.29.1 #5) id m0yOZX9-00000Wa; Sun, 12 Apr 98 20:03 PDT
-Received: by fatcity.com (10-Feb-1998/v1.0f-b64/bab) via UUCP id 0001C21E; Sun, 12 Apr 1998 19:50:31 -0800
-Message-ID: 
-X-Comment: OpenGL Game Developers Mailing List
-X-Sender: Steve Baker 
-Reply-To: OPENGL-GAMEDEV-L@fatcity.com
-Errors-To: ML-ERRORS@fatcity.com
-Organization: Fat City Network Services, San Diego, California
-X-ListServer: v1.0f, build 64; ListGuru (c) 1996-1998 Bruce A. Bergman
-Precedence: bulk
-Mime-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Content-Transfer-Encoding: 7bit
-From: Steve Baker 
-Sender: root@fatcity.com
-To: Multiple recipients of list OPENGL-GAMEDEV-L 
-Subject: Re: Strips vs Fans ...
-Date: Sun, 12 Apr 1998 19:50:31 -0800
-
-On Sat, 11 Apr 1998, Edward M Povazan wrote:
-
-> I've been following threads here about auto strip generation, and am
-> starting to wonder, why not do fans. I did a small paper test ... a regular
-> triangle grid.
->   case : transforms per case : percentage less than seperate triangles
->   seperate triangles : 144 : 0
->   fans : 77 : 53%
->   strips : 56 : 39%
-> 
-> OK so strips win here. But on a general mesh (especially one optimized for
-> rt3d) the strip runs are not as long. In fact, there are cases when fans
-> produce less transforms than strips (this is the case in my landscape
-> engine).
- 
-The other thing that leads me to get more excited about fans than
-strips is that they tend to be more compact - spatially that is -
-becuase they are all sharing that one vertex.
-
-This is useful for pre-OpenGL culling since it greatly increases the
-probablility that a fan will cleanly come out wither entirely inside
-or entirely outside the view frustum. If (like me) you are using a
-bounding sphere test to accept or reject entire strip/fan primitives
-then it's easy to visualise how fans fit better into a neat sphere
-than those long wandering strips.
-
-I'm still struggling to convert an old terrain system which was based
-around IRISGL primitives (alas, no fans) - and the wins for fans
-seem pretty significant.
-
-Steve Baker                (817)619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
--- 
-Author: Steve Baker
-  INET: sbaker@link.com
-
-Fat City Network Services    -- (619) 538-5051  FAX: (619) 538-5051
-San Diego, California        -- Public Internet access / Mailing Lists
---------------------------------------------------------------------
-To REMOVE yourself from this mailing list, send an E-Mail message
-to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
-the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
-(or the name of mailing list you want to be removed from).  You may
-also send the HELP command for other information (like subscribing).
-
-From sbaker@link.com  Sun Aug 16 00:55:44 1998
-X-VM-v5-Data: ([nil nil nil t t nil nil nil nil]
-	["1920" "Sun" "16" "August" "1998" "00:52:12" "-0500" "Steve Baker" "sbaker@link.com" "" "41" "Re: strips vs. fans" "^From:" nil nil "8" nil nil nil nil nil]
-	nil)
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id AAA14434
-	for ; Sun, 16 Aug 1998 00:55:43 -0500 (CDT)
-Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.63.22])
-          by lfkw10.bgm.link.com (8.8.6/RSC-RTI-1.0) with SMTP
-	  id AAA05219 for ; Sun, 16 Aug 1998 00:55:12 -0500 (CDT)
-X-Sender: steve@lechter.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199808152138.QAA27557@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: strips vs. fans
-Date: Sun, 16 Aug 1998 00:52:12 -0500 (CDT)
-
-On Sat, 15 Aug 1998, Curtis L. Olson wrote:
-
-> At one point did you suggest that I might have comperable performance
-> with fans vs. tri-strips?
- 
-Yes. We went down the path of changing our terrain tools to use
-fans - the performance was essentially unchanged.
-
-In the end, it depends on the average number of vertices per triangle.
-For very long tristrips, or for very large fans, the average tends
-towards 1 vertex per triangle. In this respect, there is no performance
-difference between strips and fans. However, there are two reasons
-to prefer strips and one reason to prefer fans:
-
-1) Strips are allegedly implemented in hardware for Voodoo-2, and
-   when Mesa supports that, there could be some savings to be had
-   in triangle setup times. I have not heard that the same is true
-   for tri-fans - but it's possible.
-
-2) Strips can potentially contain more triangles than fans because
-   they are not limited to having all their triangles share that
-   one start vertex. If you can actually make your strips longer
-   for practical data then strips should win. However, it's quite
-   hard to get an average strip strip length more than four or
-   five when your terrain has features like lakes, rivers, forest,
-   etc embedded in it.
-
-3) Fans have one theoretical advantage - since all the triangles
-   share that first vertex, fans tend to be spatially compact.
-   This means that crude bounding sphere culling will be more
-   effective at reducing the number of triangles sent to OpenGL
-   than it might be with tri-strips.
-
-My practical experience so far seems to suggest that these
-various effects are either so tiny as to make no difference - or
-somehow cancel out. However, it's work-in-progress.
-
-Steve Baker                (817)619-2657 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
-From sbaker@link.com  Tue Aug 18 08:57:29 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["4108" "Tue" "18" "August" "1998" "08:56:05" "-0500" "Steve Baker" "sbaker@link.com" nil "87" "Re: strips vs. fans" "^From:" nil nil "8" nil nil nil nil nil]
-	nil)
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id IAA10259
-	for ; Tue, 18 Aug 1998 08:57:27 -0500 (CDT)
-Received: from samantha.bgm.link.com (samantha.bgm.link.com [130.210.65.19])
-          by lfkw10.bgm.link.com (8.8.6/RSC-RTI-1.0) with SMTP
-	  id IAA11753 for ; Tue, 18 Aug 1998 08:56:48 -0500 (CDT)
-X-Sender: steve@samantha.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199808172109.QAA25296@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: strips vs. fans
-Date: Tue, 18 Aug 1998 08:56:05 -0500 (CDT)
-
-On Mon, 17 Aug 1998, Curtis L. Olson wrote:
-
-> So do just use a "greedy" algorithm to build fans, or do you do
-> something more sophisticated?
- 
-Well, we have to consider the larger issues.
-
-* From the point of view of OpenGL, the more triangles in the strip/fan
-  the better.
-* From the point of view of FOV culling, the more compact the strip/fan
-  the better.
-* From the point of view of intersection testing, the shorter the strip/fan
-  the better.
-
-We use a variety of stripping algorithms depending on the cicumstance.
-Sometimes we just do the 'greedy' algorithm, sometimes we impose a limit
-on the maximum strip length which tends to cut down on the number of
-single triangles (which are especially costly on SGI hardware for some
-reason). Sometimes we use an algorithm that has an estimate of the
-relative costs of transforming strips of length 1, 2, 3, 4, ... which
-tries many different ways to strip/fan until it finds one with a cost
-per-triangle that is less than some user-specified limit - and the
-ultimate algorithm simply does a totally exhaustive search for the cheapest
-overall set of strips.
-
-The last few algorithms can take days to run on even relatively simple
-objects - and we use those only for the simplest of objects when that object
-is re-used a gazillion times in the database. For example, we did a
-model of Yellowstone national park where the customer needed the highest
-possible density of single, individual trees. We built a set of tree
-cluster models and ran the tri-stripper at maximum optimisation on them
-all to get down the cost of transforming all those thousands of trees to
-the absolute minimum.
-
-However, when we have the whole of North America to tstrip, we can't
-afford the CPU hours to do anything much more than the very basic
-limited-length-greedy algorithm.
-
-Limiting the maximum strip length helps the FOV culling so much that
-we pretty much always limit the length to a dozen of so triangles.
-That's principally due to SGI hardware which gains performance as the
-strip length increases - up to about 10 triangles - beyond which it
-doesn't really help any.
-
-It's MUCH better (on SGI ONYX hardware) to generate two strips of 5
-triangles each than it is to generate one strip of 9 and one single
-triangle.
-
-For us, there are yet other considerations. We don't currently drive
-OpenGL directly - we use the Performer scene graph API as a layer on
-top. Performer can optimise the case where all the triangles in the
-strip share the same surface normal and/or colour. In that case, it
-generates just one glNormal and glColor command for each strip. These
-are called 'Flat-Tri-strips'. For man-made objects, we can often win
-by having shorter strips that are flat rather than longer strips that
-are non-flat because the cost of transforming the normals is not
-negligable.
-
-Some of the SGI machines also optimise for the case when there is only
-a single, infinite light source by only doing illumination per-normal
-rather than per-vertex - this also makes flat strips worth having.
-
-Some of these optimisations are actually pessimisations on some machines,
-so you have to optimise the database for the hardware.
-
-As you can see, this is another incredibly complicated issue if you
-want to get absolutely *ALL* the performance you can.
-
-It's unreasonable to expect FGFS to do this with the limited effort
-available. We have two or three full-time staff thinking about
-database tools - and we have been working with OpenGL for five
-years now.
-
-> > 1) Strips are allegedly implemented in hardware for Voodoo-2, and
-> >    when Mesa supports that, there could be some savings to be had in
-> >    triangle setup times. I have not heard that the same is true for
-> >    tri-fans - but it's possible.
-> 
-> I would think that if they did strips, they could easily do fans ...
- 
-I just asked the question on the 3Dfx newsgroup - we'll get a definitive
-answer there.
-
-Steve Baker                (817)619-2657 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
diff --git a/Hints/textures-free b/Hints/textures-free
deleted file mode 100644
index d311fb1f4..000000000
--- a/Hints/textures-free
+++ /dev/null
@@ -1,8 +0,0 @@
-"Christian Mayer" 
-  http://home.t-online.de/home/vader/internet.zip
-  http://home.t-online.de/home/vader/myones.zip
-  http://home.t-online.de/home/vader/nz_tex.zip
-
-Note: some of these textures may have specific copyrights and restrictions
-on their use.  Please view and follow the documentation/readme that comes 
-with these.
diff --git a/Hints/texturing b/Hints/texturing
deleted file mode 100644
index d4c53031a..000000000
--- a/Hints/texturing
+++ /dev/null
@@ -1,1073 +0,0 @@
-From sbaker@link.com  Mon Jan 12 09:03:37 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["11420" "Mon" "12" "January" "1998" "11:03:54" "-0600" "Steve Baker" "sbaker@link.com" "" "318" "[FGFS] Da-da-da (fwd)" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-X-VM-Message-Order:
-	(1 2 3 5 4 6 7 8 9 10 11 12 13 14 15
-	 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
-	 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
-	 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
-	 61 62 63)
-X-VM-Summary-Format: "%n %*%a %-17.17F %-3.3m %2d %4l/%-5c %I\"%s\"\n"
-X-VM-Labels: ("r")
-X-VM-VHeader: ("Resent-" "From:" "Sender:" "To:" "Apparently-To:" "Cc:" "Subject:" "Date:") nil
-X-VM-Bookmark: 4
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id JAA01094
-	for ; Mon, 12 Jan 1998 09:03:28 -0600 (CST)
-Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id JAA14248 for ; Mon, 12 Jan 1998 09:02:52 -0600 (CST)
-X-Sender: steve@lechter.bgm.link.com
-Reply-To: Steve Baker 
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: curt@me.umn.edu
-Subject: [FGFS] Da-da-da (fwd)
-Date: Mon, 12 Jan 1998 11:03:54 -0600 (CST)
-
-
-
-> I went with the wife to see "Titanic" tonight.  It was all sold out,
-
-It was a 'girl' movie - my Wife loved it - my kid and I zzzzz'd out.
-
-> and the only other movie that hadn't started yet was "007" which Ruth
-> didn't want see. :-(
-
-Now *that* was a 'boy' movie. Easily the best Bond movie so far (although
-the chase scene with the Tank in Goldeneye is still up there).
-
-> So I just generated a section of scenery in "ultra-high" detail and am
-> getting about 0.2 frames a second.
-
-Pretty neat ... but what it needs is:
-
-  ####### ####### #     # ####### #     # ######  #######
-     #    #        #   #     #    #     # #     # #
-     #    #         # #      #    #     # #     # #
-     #    #####      #       #    #     # ######  #####
-     #    #         # #      #    #     # #   #   #
-     #    #        #   #     #    #     # #    #  #
-     #    ####### #     #    #     #####  #     # #######
-
-(which is v.easy to add - and comes for free on a 3Dfx - although it'll
-*KILL* your frame rate on software-only Mesa).
-
-Could you do a screen dump of a wire-frame rendering of that so people can
-see the tesselation? Just set xglPolygonMode(GL_FRONT_AND_BACK,GL_LINE).
-
-> Anyone know anything about view frustum culling?
-
-Yep.
-
-Two issues:
-
-1) Scene hierarchy generation (offline).
-
-2) Runtime culling.
-
-
-
-Hierarchy:
-==========
-
-There are lots of ways to do this. I usually build an heirerchical description
-of each terrain tile. I typically build a tree structure that's organized
-as follows:
-
-                              |  The World.
-                              | 
-           ___________________|___   
-          |   |   |   |   |   |   |
-          *   *   *   *   *   *   *  Terrain tiles currently loaded
-          |   |   |   |   |   |   |
-                              |     
-                              |
-                         _____|_____
-                        |   |   |   |
-                        *   *   *   *   Quarter-tiles
-                        |   |   |   |
-                            |
-                            |
-                       _____|_____ 
-                      |   |   |   |
-                      *   *   *   *   Sixteenth-tiles
-                      |   |   |   |
-
-...and so on down until the number of polygons in each 'object' gets 'small enough'.
-
-When you do this, don't try to split polygons when they cross a quarter or a
-sixteenth tile boundary - just dump each polygon into the nearest 'bucket' to
-it's centroid.
-
-Do your tri-stripping on the leaf nodes of this tree - so that each tristrip
-is contained entirely within one bucket.
-
-Eventually, you will need to include buildings, roads, rivers, etc. Since these
-need to be culled by level of detail, it is often useful to put them into a separate
-tree structure that parallels the terrain 'skin' structure.
-
-Finally, compute a bounding sphere around each leaf node, find the best fit
-sphere by finding the maximum and minimim x, y and z of the tristrips in that
-leaf node, taking the mid-point and then finding the vertex that is furthest
-from that center point and using it as the radius.
-
-Compute the bounding sphere for each level in the tree (everywhere where there is
-a '*' in my diagram).
-
-Runtime:
-========
-
-At runtime, you walk that tree every frame, testing the bounding sphere against
-the view frustum.
-
-* If the sphere lies entirely outside the view frustum then stop traversal
-  for that node. There is no need to test any of the nodes beneath this one
-  (we know that none of their leaf tristrips are visible).
-
-* If the sphere lies entirely inside the view frustum then traverse immediately
-  to all of the leaves below this node without doing any more sphere testing
-  on them - draw all of the tristrips that are there. (We know they are all visible)
-
-* If the sphere straddles the view frustum then check each daughter node in
-  turn by applying this algorithm on them recursively. If a leaf node straddles
-  the view frustrum then it's bad luck, you just draw all the tristrips it
-  contains and let OpenGL do the work.
-
-You might also want to put a 'transition range' onto each node and if it
-lies beyond that range cull it. You can also use this to conveniently
-switch levels of detail by having multiple versions of each object in
-the tree.
-
-Testing a sphere against the View Frustum:
-==========================================
-
-In most cases, we can describe the volume of space that you can see
-through the little glass window on the front of your CRT using a
-Frustum (frequently mis-spelled as Frustrum or Fustrum even in some
-text books).
-
-A frustum is a truncated pyramid - which typically bounded by six
-planes called:
-
-  NEAR, FAR, LEFT, RIGHT, TOP, BOTTOM
-
-There are applications that require additional clipping planes (eg for
-non-rectangular screens) - extending the work described in this
-to cater for that is not hard).
-
-In principal, all six planes can be constructed as general plane
-equations:
-
-    A x + B y + C z + D == 0
-
-However, for most applications, NEAR and FAR are parallel to the
-screen, LEFT, RIGHT,TOP and BOTTOM all meet at the eye and the eye lies
-along a vector that extends out from the center of the screen and is
-perpendicular to it. This simplifies the equations considerably for
-practical applications.
-
-Transforms.
-~~~~~~~~~~~
-
-It is easiest to perform culling in a coordinate system where the
-eyepoint is at the origin and the line from the eye through the center
-of the screen lies along one major axis with the edges of the screen
-parallel to the remaining two axes. This coordinate system is called
-'Eye Space'.
-
-Testing a Sphere against a Frustum.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The most important thing to bear in mind about culling is that the
-first trivial-reject test you apply is by far the most time-critical.
-This test is always applied to more nodes than any of the subsequent
-tests.
-
-So, do the cheapest test first.
-
-This is typically the NEAR plane test. Everything behind the viewers
-head gets chopped out - and it's an especially cheap test.
-
-
-   if ( obj_sphere.center.z < near_plane - obj_sphere.radius )
-     REJECT!!
-
-
-...next do the second cheapest test (assuming you know that your
-database could possibly extend beyond the far clip plane)...
-
-
-   if ( obj_sphere.center.z - obj_sphere.radius > far_plane )
-     REJECT!!
-
-
-...and *then* (for each of the other 4 planes) do...
-
-
-   if ( distance( obj.position, plane ) <= obj_sphere.radius )
-     REJECT!!
-
-
-(The algorithm for computing that 'distance()' function is described
-below).
-
-It's also useful to know that in many applications, you cull more
-objects from the left and right faces of the frustum than you do from
-the top and bottom - so test left, then right, then bottom then top.
-
-Also, with bounding sphere tests, you shouldn't forget to do
-total-accept as well as total-reject tests. Once you know that an
-object's sphere is TOTALLY on screen, you don't have to descend into
-the daughter objects to cull-test them...you *know* they are all
-on-screen.
-
-Another way to look at that it to remember which of the six possible
-plane tests didn't even touch the sphere - as you work your way down
-the object hierarchy, you can accumulate those flags and avoid even
-testing those planes that a parent sphere has already cleanly passed.
-If you do this then a vast percentage of your spheres will only need to
-be tested against one plane.  However, for the normal case of a simple
-frustum - when you examine the fully optimised
-distance-of-point-from-plane code (below), you may well conclude that
-this additional logic doesn't justify the paltry amount of additional
-math that it might save.
-
-Computing the Distance from Sphere Center to Clipping Plane.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-A plane can be represented by the equation
-
-
-     Ax + By + Cz + D = 0 ;
-
-
-A,B,C is just the surface normal of the plane and D is the shortest
-distance from the origin to the plane.
-
-So, if you need to find the distance of a point from the plane, just
-imagine a new plane that goes through your test point and is parallel
-to the plane you want to test. The plane equation of that new plane
-would be:
-
-
-     A'x + B'y + C'z + D' = 0 ;
-
-
-Since the two planes are parallel, their surface normals are the same,
-so
-
-
-   A' == A B' == B C' == C D' == D + distance_between_the_two_planes
-
-
-...the only thing that's different is their D values - which differ by
-the distance of your test point from the original plane.
-
-So, for a point (x,y,z), the distance 'd' from the plane (A,B,C,D) is
-derived as:
-
-
-   d = D' - D
-     = -A'x - B'y - C'z - D
-     = -Ax - By - Cz - D
-     = -( [ABC]dot[xyz] + D )
-
-
-A dot-product of the point and the surface normal of the plane, plus
-the distance from the plane to the origin. Three multiplies, three
-additions and a negation.
-
-As an aside - if you consider the point (x,y,z) as a FOUR element
-homogeneous vector (x,y,z,w) then 'w' is 1.0 and you can compute the
-distance by simply taking the four element dot-product of (A,B,C,D)
-with (x,y,z,w). If you have fast 4x4 matrix math hardware in your
-machine then you can use it to compute the distance from a point to all
-four planes in a single operation!
-
-That's the general result for an arbitary plane - but culling to the
-view frustum is a very special case. If you are working in eye-relative
-coordinates (IMHO this is best), then since all TOP,BOTTOM,LEFT,RIGHT
-planes of the frustum meet at the eye - and since the eye is at the
-origin (by definition), then D is always zero for those planes and that
-saves you a subtract.
-
-If you are feeling even more in need of optimisation - then you can
-save one multiply per plane by realising that (for rectangular screens)
-one of the three components of the plane equation will always be zero.
-
-So, for the LEFT clip plane, the Y component of the normal of the plane
-is zero, so the distance to the left or right plane is just
-
-
-     d = -( Ax + Cz )
-
-
-...and to the top or bottom plane it's just:
-
-
-     d = -( By + Cz )
-
-
-Furthermore, we know that the A component for the LEFT plane is just
-the negation of the A component of the RIGHT plane, and the C component
-is the same for both LEFT and RIGHT (and similarly, the B component of
-the TOP plane, is the negation of the B component for the BOTTOM plane
-and the C component is the same for both TOP and BOTTOM). This means
-that you only need four multiplies and four additions to do the entire
-job. (Since you are only using this for culling, you don't need the
-minus sign - just reverse the conditional).
-
-The NEAR and FAR planes are typically parallel to the X/Y plane. That
-means that A and B are both zero and C is one (or minus-one) - but D is
-not zero, so the math boils down to an add and a negate:
-
-
-     d = -(z + D)
-
-
-Conclusions.
-~~~~~~~~~~~~
-
-Sphere-based culling can be extremely cost-effective. It's so cheap
-that even if you feel the need to use a bounding cubeoid (or even a yet
-more complex shape), it's still worth doing a sphere-based cull first
-just to get rid of the trivial accept and reject cases.
-
-
-Steve Baker                     817-619-8776 (Vox/Vox-Mail)
-Hughes Training Inc.            817-619-4028 (Fax)
-2200 Arlington Downs Road       SBaker@link.com (eMail)
-Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
-http://www.hti.com              http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
-From owner-flight-gear@me.umn.edu  Thu Jan 15 21:09:17 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["1752" "Thu" "15" "January" "1998" "22:08:56" "-0500" "Bob Kuehne" "rpk@sgi.com" nil "41" "Re: [FGFS] Status Update w/ Scenery" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-Received: (from majordom@localhost)
-	by meserv.me.umn.edu (8.8.8/8.8.6) id VAA10212
-	for flight-gear-outgoing; Thu, 15 Jan 1998 21:09:17 -0600 (CST)
-X-Authentication-Warning: meserv.me.umn.edu: majordom set sender to owner-flight-gear@me.umn.edu using -f
-Received: from sgi.sgi.com (SGI.COM [192.48.153.1])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with SMTP id VAA10205
-	for ; Thu, 15 Jan 1998 21:09:11 -0600 (CST)
-Received: from dataserv.detroit.sgi.com (relay.detroit.sgi.com [169.238.128.2]) by sgi.sgi.com (950413.SGI.8.6.12/970507) via ESMTP id TAA28641
-	for <@external-mail-relay.sgi.com:flight-gear@me.umn.edu>; Thu, 15 Jan 1998 19:09:07 -0800
-	env-from (rpk@sgi.com)
-Received: from applab3.detroit.sgi.com by dataserv.detroit.sgi.com via ESMTP (951211.SGI.8.6.12.PATCH1502/930416.SGI)
-	for <@dataserv.detroit.sgi.com:flight-gear@me.umn.edu> id WAA02541; Thu, 15 Jan 1998 22:09:00 -0500
-Received: from localhost (rpk@localhost) by applab3.detroit.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via SMTP id WAA04150 for ; Thu, 15 Jan 1998 22:08:56 -0500
-X-Sender: rpk@applab3.detroit.sgi.com
-In-Reply-To: <199801160204.UAA06347@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: flight-gear@me.umn.edu
-From: Bob Kuehne 
-Sender: owner-flight-gear@me.umn.edu
-To: flight-gear@me.umn.edu
-Subject: Re: [FGFS] Status Update w/ Scenery
-Date: Thu, 15 Jan 1998 22:08:56 -0500 (EST)
-
-On Thu, 15 Jan 1998, Curtis L. Olson wrote:
-
-> Eric Mitchell (from the MSFS world) sent me some really nice textures,
-> so I may just have to sit down and figure out how to texture a polygon
-> in OpenGL.  It looks like the hardest part will be deciding what image
-> format to use and figuring out how to read that into memory so OpenGL
-> can use it as a texture.
-
-1) load the texture (and mipmaps) via glTexImage2D. Ideally we'll want to
-use a bound texture (in 1.1, and in 1.0 as an extension) for efficency.
-
-2) enable texturing with glEnable( GL_TEXTURE_2D )
-
-3) Throw a 'glTexCoord2[*]' (your favorite variant of that call) next to
-each vertex you draw.
-
-> I have an example of how to do this with the JPEG format using
-> jpeglib.  IRIX RGB format seems like it might be the most
-> straightforward, but not the most space efficient.  I don't believe
-
-on disk - note that in memory the only type of image data that most OpenGL
-implementations can deal with is uncompressed.
-
-> it's pretty easy to convert amongst these formats, but not necessarily
-> as easy to read them into your program.
-> One of these day's I'm going to have to break down and buy an OpenGL
-> book ... I bet they tell you exactly how to do this stuff. :-)
-
-You, sir, are a candidate for the Red Book. :)
-
-Bob
-
-Bob Kuehne    |         There was coffee.           |    Applications
-rpk@sgi.com   |         Life would go on.           |     Consulting
-248/848-4465  |  William Gibson, The Winter Market  |  Silicon Graphics
-
--------------------------------------
-Please visit the Flight Gear web page:
-http://www.menet.umn.edu/~curt/fgfs/
-For help on using this list (especially unsubscribing), send a message to
-"flight-gear-request@me.umn.edu" with a single line of text: "help".
-
-From owner-flight-gear@me.umn.edu  Fri Jan 16 01:41:59 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["1477" "Fri" "16" "January" "1998" "03:42:36" "-0600" "Steve Baker" "sbaker@link.com" nil "38" "Re: [FGFS] Status Update w/ Scenery" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-Received: (from majordom@localhost)
-	by meserv.me.umn.edu (8.8.8/8.8.6) id BAA15817
-	for flight-gear-outgoing; Fri, 16 Jan 1998 01:41:59 -0600 (CST)
-X-Authentication-Warning: meserv.me.umn.edu: majordom set sender to owner-flight-gear@me.umn.edu using -f
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id BAA15813
-	for ; Fri, 16 Jan 1998 01:41:53 -0600 (CST)
-Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id BAA10510 for ; Fri, 16 Jan 1998 01:41:21 -0600 (CST)
-X-Sender: steve@lechter.bgm.link.com
-In-Reply-To: 
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: flight-gear@me.umn.edu
-From: Steve Baker 
-Sender: owner-flight-gear@me.umn.edu
-To: flight-gear@me.umn.edu
-Subject: Re: [FGFS] Status Update w/ Scenery
-Date: Fri, 16 Jan 1998 03:42:36 -0600 (CST)
-
-On Thu, 15 Jan 1998, Bob Kuehne wrote:
-
-> 1) load the texture (and mipmaps) via glTexImage2D. Ideally we'll want to
-> use a bound texture (in 1.1, and in 1.0 as an extension) for efficency.
- 
-Whether to load or compute the MIPmaps is an interesting question.
-
-The nice thing about loading the MIPmaps from disk is that you can
-use off-line tools to compute fancy MIPmaps in some special cases -
-notably for translucent textures.
-
-Talk to me off-line for an in-depth discussion sometime.
-
-> > One of these day's I'm going to have to break down and buy an OpenGL
-> > book ... I bet they tell you exactly how to do this stuff. :-)
-> 
-> You, sir, are a candidate for the Red Book. :)
-
-No question. Purchase (in this order):
-
-   Red    (make sure your bookstore doesn't stick you with V1.0!!)
-   Green
-   Blue   (but only if you dislike reading man pages off the screen)
-
-Steve Baker                     817-619-8776 (Vox/Vox-Mail)
-Hughes Training Inc.            817-619-4028 (Fax)
-2200 Arlington Downs Road       SBaker@link.com (eMail)
-Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
-http://www.hti.com              http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
--------------------------------------
-Please visit the Flight Gear web page:
-http://www.menet.umn.edu/~curt/fgfs/
-For help on using this list (especially unsubscribing), send a message to
-"flight-gear-request@me.umn.edu" with a single line of text: "help".
-
-From sbaker@link.com  Fri Jan 16 01:28:35 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["2966" "Fri" "16" "January" "1998" "03:29:18" "-0600" "Steve Baker" "sbaker@link.com" nil "74" "Re: [FGFS] Status Update w/ Scenery" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id BAA15513
-	for ; Fri, 16 Jan 1998 01:28:34 -0600 (CST)
-Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id BAA02053 for ; Fri, 16 Jan 1998 01:28:02 -0600 (CST)
-X-Sender: steve@lechter.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199801160204.UAA06347@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: [FGFS] Status Update w/ Scenery
-Date: Fri, 16 Jan 1998 03:29:18 -0600 (CST)
-
-On Thu, 15 Jan 1998, Curtis L. Olson wrote:
-
-> 5.  This allows me to generate very nice images with the one exception
->     which you can clearly see if you view the picture.  The shared vertices
->     aren't currently using shared normals, so the shading doesn't
->     transition smoothly across tile boundaries.
- 
-We cheat and point all the vertices along the edges of squares
-straight upwards.
-
-The reason for this is simple - it allows us to build each square
-independantly of the others - which is an important issue when
-databases are build by a number of different people at different
-times.
-
-The result is remarkably reasonable - you still can't really tell
-where the terrain tile edges are.
-
-> Eric Mitchell (from the MSFS world) sent me some really nice textures,
-> so I may just have to sit down and figure out how to texture a polygon
-> in OpenGL.  It looks like the hardest part will be deciding what image
-> format to use and figuring out how to read that into memory so OpenGL
-> can use it as a texture.
- 
-Consider using PNG as your image format - it's the future - it's very
-compact, the loader is freeware, it's not a "lossy" format.
-
-> I have an example of how to do this with the JPEG format using
-> jpeglib.
-
-JPEG is **NOT** a good choice - the data compression is "LOSSY" -
-when you compress an image and decompress it, what you end up with
-is different from what you started with. The compression scheme is
-designed to not be noticable to the human eye - but that doesn't
-hold up when the image is viewed in perspective. JPEG sucks.
-
-> IRIX RGB format seems like it might be the most
-> straightforward, but not the most space efficient.
-
-True - but for lossless compression (where compress+decompress == no-op)
-it's not far from optimal.
-
-> I don't believe GIF is a 24bit color format (only 8bit)
-
-That's true - there are also legal issues over it's copyright/patent.
-
-> BMP has "Bill" written all over it (enough said.) :-)
-
-Exactly.
-
-> But, it's pretty easy to convert amongst these formats,
-> but not necessarily as easy to read them into your program.
-
-PNG is easy bacuse there are is a standard (and really good)
-library available. It's also supported by both major web
-browsers. It's the official replacement for GIF on the web.
-
-> One of these day's I'm going to have to break down and buy an OpenGL
-> book ... I bet they tell you exactly how to do this stuff. :-)
-
-Yep - the example in the Red book is about all you need.
-
-I'm sure you could get what you need from one of the Mesa
-example programs though (in fact, aren't all the RedBook
-examples distributed with Mesa? - I forget).
-
-Steve Baker                     817-619-8776 (Vox/Vox-Mail)
-Hughes Training Inc.            817-619-4028 (Fax)
-2200 Arlington Downs Road       SBaker@link.com (eMail)
-Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
-http://www.hti.com              http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
-From owner-flight-gear@me.umn.edu  Thu Feb 19 12:34:42 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["3263" "Thu" "19" "February" "1998" "12:35:18" "-0600" "Steve Baker" "sbaker@link.com" "" "85" "Re: [FGFS] New HUD Screen Shots" "^From:" nil nil "2" nil nil (number " " mark "  R  Steve Baker       Feb 19   85/3263  " thread-indent "\"Re: [FGFS] New HUD Screen Shots\"\n") nil nil]
-	nil)
-Received: (from majordom@localhost)
-	by meserv.me.umn.edu (8.8.8/8.8.8) id MAA15262
-	for flight-gear-outgoing; Thu, 19 Feb 1998 12:34:42 -0600 (CST)
-X-Authentication-Warning: meserv.me.umn.edu: majordom set sender to owner-flight-gear@me.umn.edu using -f
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id MAA15258
-	for ; Thu, 19 Feb 1998 12:34:35 -0600 (CST)
-Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id MAA19280 for ; Thu, 19 Feb 1998 12:33:57 -0600 (CST)
-X-Sender: steve@lechter.bgm.link.com
-In-Reply-To: <199802191621.KAA09095@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: flight-gear@me.umn.edu
-From: Steve Baker 
-Sender: owner-flight-gear@me.umn.edu
-To: flight-gear@me.umn.edu
-Subject: Re: [FGFS] New HUD Screen Shots
-Date: Thu, 19 Feb 1998 12:35:18 -0600 (CST)
-
-On Thu, 19 Feb 1998, Curtis L. Olson wrote:
-
-> Here's where I'm at with textures.
-> 
-> 1.  I gleaned some "RGB" format texture loading code out of a GLUT
->     demo.
- 
-So you have the texture into OpenGL using glGenTextures/glBindTexture
-and you have a number for each texture? Does the routine generate
-the MIPmaps for you?
-
-> 2.  I have some reasonable terrain textures for starters that Eric
->     Mitchell from the MSFS world contributed.
- 
-Good start! (Could you post them to the Web site? I might be able
-to suggest a suitable scale factor for them)
-
-> So for anyone who's familiar with texturing, it would likely be a
-> simple matter to call the texture load routine and do all the
-> OpenGL-ese to setup the textures.
- 
-As a starter (just to get something going), you could simply divide the
-latitude and longitude of each terrain vertex by some suitable constant
-and use that as the texture coordinate. Alternatively, you could let
-OpenGL do the work using glTexGenf.
-
-Something like (off the top of my head):
-
-  glEnable        ( GL_TEXTURE_2D ) ;
-  glBindTexture   ( GL_TEXTURE_2D, texture_number ) ;
-  glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_WRAP_S    , GL_REPEAT ) ;
-  glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_WRAP_T    , GL_REPEAT ) ;
-  glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER, GL_LINEAR ) ;
-  glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ) ;
-  glTexEnvi       ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
-  glHint          ( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
-
-  {
-    Draw bunches of terrain
-    For each vertex, add a glTexCoord2f with your scaled lat/long
-    values
-  }
-
-  glDisable       ( GL_TEXTURE_2D ) ;
-
-> So, I guess I've been trying to make what I have be a bit more solid
-> before I charge forward again.
- 
-I guess that's a good thing.
-
-Adding texturing is *SO* easy though that you might want to just
-slip it in when you have an odd hour and feel like getting a 'WOW!'
-response!
-
-    :-)
-
-> > Have you checked the link ordering?
-> > 
-> > I see a couple of posts a day from people who have either failed to
-> > link with M$ OGL *as well as* SGI's OpenGL (SGI's OpenGL relies
-> > on some functions from M$ OpenGL) - or who have linked them in the
-> > wrong order or something.
-> 
-> Interesting, I'm not linking in opengl32 or glu32 ...  The compiler
-> never complains about unresolved symbols, and at runtime, I get no
-> complaint about missing dll's.
- 
-Hmmm - that's odd - I'm pretty sure you need them because SGI's
-OpenGL falls back to M$ opengl if it thinks that M$'s OpenGL has
-hardware accelleration. That suggests that it *must* link to it
-somehow.
-
-Steve Baker                     817-619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.           817-619-4028 (Fax)
-2200 Arlington Downs Road       SBaker@link.com (eMail)
-Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
-http://www.hti.com        http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
--------------------------------------
-Please visit the FGFS web page:  http://www.menet.umn.edu/~curt/fgfs/
-For help on using this list (especially unsubscribing), send a message to
-"flight-gear-request@me.umn.edu" with a single line of text: "help".
-
-From sbaker@link.com  Mon Apr 27 23:45:25 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["2532" "Mon" "27" "April" "1998" "23:43:38" "-0500" "Steve Baker" "sbaker@link.com" "" "58" "Re: texture coordinates" "^From:" nil nil "4" nil nil nil nil nil]
-	nil)
-X-VM-Message-Order:
-	(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-	 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
-	 31 32)
-X-VM-Summary-Format: "%n %*%a %-17.17F %-3.3m %2d %4l/%-5c %I\"%s\"\n"
-X-VM-Labels: ("r")
-X-VM-VHeader: ("Resent-" "From:" "Sender:" "To:" "Apparently-To:" "Cc:" "Subject:" "Date:") nil
-X-VM-Bookmark: 32
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id XAA19155
-	for ; Mon, 27 Apr 1998 23:45:24 -0500 (CDT)
-Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id XAA03828 for ; Mon, 27 Apr 1998 23:44:53 -0500 (CDT)
-X-Sender: steve@lechter.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199804272123.QAA19688@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: texture coordinates
-Date: Mon, 27 Apr 1998 23:43:38 -0500 (CDT)
-
-On Mon, 27 Apr 1998, Curtis L. Olson wrote:
-
-> I just thought I'd fire off a quick texture coordinate question while
-> things were fresh on my mind.  I was doing the quick hack of texture
-> coordinate = (lon, lat) * CONSTANT.  I'm using a value of 128.0 for
-> the constant, lat/lon are in degrees.  This is giving me a lot of
-> "swimming" of the textures, where each frame the texture gets aligned
-> differently.  I'm thinking that 128 * 180 = 23040 which isn't that big
-> of a number.
-> 
-> So then before "clicking the proverbial send button" I decided to
-> fmod() the result with something smaller like 10.0 and now everything
-> seems to work pretty well.
-> 
-> Does this all sound reasonable?
-
-Yes - regrettably, it does.
-
-Most OpenGL implementations (or any 3D API for that matter) have
-serious problems with texture precision when the numbers get
-large.
-
-As you must have realised, you really don't need all those large
-integer parts - all that really matters is the delta.
-
-I think the best thing to do is to use a different constant
-for lat and long (v.important near the poles), and to compute
-that "constant" for each terrain tile such as to get an integer
-number of map repeats across the tile - keeping the actual size
-of each texel reasonably close to what it was designed to be.
-That ensures that adjacent tiles will match up most of the time
-- and it will minimise the number of texture seams you get. The
-coordinates within each tile should be as small as possible -
-take the south-west corner of each tile as (0,0) in texture space.
-
-I don't know of any really solid ways to avoid *any* texture
-seams. It is after all a topological impossibility to tile
-a sphere with equal sized squares without getting seams - 
-and the alternative is to distort the textures very badly
-towards the poles - and that sucks even more than the
-seams IMHO.
-
-I had a plan once to tile the planet with a particular
-grid spacing for each major continent - with the texture
-seams appearing exactly at the Suez canal, Panama canal,
-Straits of Gibralta...etc.  I now believe that to be hard
-to implement, and it still causes far too much distortion
-in the larger continents.
-
-Even if I could have made *that* work - there would still
-be the problem of texturing the oceans.
-
-In the end - I think seams are inevitable. (sniffle, sob)
-
-Steve Baker                (817)619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
-From sbaker@link.com  Mon May  4 07:42:43 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["3088" "Mon" "4" "May" "1998" "07:40:58" "-0500" "Steve Baker" "sbaker@link.com" "" "75" "Re: texture coordinates" "^From:" nil nil "5" nil nil nil nil nil]
-	nil)
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id HAA28780
-	for ; Mon, 4 May 1998 07:42:42 -0500 (CDT)
-Received: from sutcliffe.bgm.link.com (sutcliffe.bgm.link.com [130.210.236.18])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id HAA08974 for ; Mon, 4 May 1998 07:42:10 -0500 (CDT)
-X-Sender: steve@sutcliffe.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199805011935.OAA12780@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: texture coordinates
-Date: Mon, 4 May 1998 07:40:58 -0500 (CDT)
-
-On Fri, 1 May 1998, Curtis L. Olson wrote:
-
-> (At this point I'm working in cartesian coordinates with all the
-> terrain points.)
-> 
-> I know a central point for a tile (average of min/max for x, y, z).
-> If I normalize (x, y, z) this gives me a nice normal.  So, I have a
-> nice point and a normal which is enough to define a plane that roughly
-> approximates the tile data points.  
-> 
-> Now, I could take each individual terrain point and project it onto
-> this plane.  This conceptually could be my texture coordinate.  But, I
-> would first have to rotate and translate the whole pile of projected
-> points so that they are at or near (0,0,0) at which point I could drop
-> the z dimension and (x,y) would be my real texture coordinate.
-> 
-> I'm pretty confident that I could do the math, but do you think it
-> would be worth the hassle?  It would all happen in the preprocessing
-> stage so I guess speed wouldn't be an issue.
- 
-The problem is that you would end up with a seam in the texture at the
-edge of every terrain tile. Since your tiles are not exact squares,
-and (from what you seems to be saying), your texture *is* a square,
-there are bound to be differences in texture coordinates at the
-edges of adjacent tiles. Imagine taking a lot of square post-it notes
-(the textures) and sticking them onto a globe. Towards the poles,
-they would overlap more and more - and that is what would happen
-to your textures.
-
-Using the original lat/long as the texture coordinate eliminates
-the ugly seams.
-
-   S = lon / k1 ;
-   T = lat / k2 ;
-
-(k1 & k2 are constants).
-
-This squishes the texture around so it wraps neatly onto the spherical
-surface.
-
-However, there are two problems with this:
-
-* The texture coordinates get very big and that causes texture
-  swimming, jitter, etc.
-
-* The texture will now get long and thin near the poles.
-
-The way I get around these two problems is firstly to say:
-
-   S = ( lon - tile_origin_lon ) / k1
-   T = ( lat - tile_origin_lat ) / k2
-
-Now the texture coordinates are small - but the texture
-seams come back unless k1 and k2 are exact submultiples of
-a terrain tile size (expressed in degrees latitude/longitude).
-
-So, I set k1/k2 to the exact submultiple of a terrain tile
-size that comes closest to the ideal scale that I want for
-my textures (expressed in meters per map repeat). Since the
-size of a degree of longitude changes over the surface of
-the earth, k1 is no longer a constant. Whenever k2 changes,
-you get a texture seam that runs east-west across the terrain.
-This is unavoidable - but a lot better than having seams at
-the edges of every terrain tile.
-
-Hence, k1 will equal k2 at the equator and gradually go to
-zero at the poles. It's easiest to take the longitudinal
-size of the terrain tile half way up the tile (rather than
-at the top or bottom edge) to avoid a divide by zero error
-at either the north or south pole.
-
-Steve Baker                (817)619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
-From owner-fgfs-devel@flightgear.org  Tue Sep 22 16:24:52 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["1870" "Tue" "22" "September" "1998" "16:23:23" "-0500" "Steve Baker" "sbaker@link.com" nil "43" "Re: [FGFS-Devel] vegetation / land use" "^From:" nil nil "9" nil nil nil nil nil]
-	nil)
-Received: from mailhub.woodsoup.org (IDENT:root@anduin.physics.iastate.edu [129.186.82.1])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id QAA05981
-	for ; Tue, 22 Sep 1998 16:24:52 -0500 (CDT)
-Received: from majordom by mailhub.woodsoup.org with local (Exim 1.92 #1)
-	for fgfs-devel-outgoing@flightgear.org
-	id 0zLZvM-0000ZG-00; Tue, 22 Sep 1998 16:24:40 -0500
-Received: from bgm.link.com ([130.210.2.10] helo=lfkw10.bgm.link.com)
-	by mailhub.woodsoup.org with esmtp (Exim 1.92 #1)
-	for fgfs-devel@flightgear.org
-	id 0zLZvK-0000ZA-00; Tue, 22 Sep 1998 16:24:38 -0500
-Received: from samantha.bgm.link.com (samantha.bgm.link.com [130.210.65.19])
-          by lfkw10.bgm.link.com (8.8.6/RSC-RTI-1.0) with SMTP
-	  id QAA23764 for ; Tue, 22 Sep 1998 16:24:08 -0500 (CDT)
-X-Sender: steve@samantha.bgm.link.com
-In-Reply-To: <3607FBD8.58FC@mars.ark.com>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: fgfs-devel@flightgear.org
-From: Steve Baker 
-Sender: owner-fgfs-devel@flightgear.org
-To: fgfs-devel@flightgear.org
-Subject: Re: [FGFS-Devel] vegetation / land use
-Date: Tue, 22 Sep 1998 16:23:23 -0500 (CDT)
-
-On Tue, 22 Sep 1998, Eric Mitchell wrote:
-
-> Sounds good. Can you tell me the (rough) dimensions of a single texture
-> square when it's rendered in FG? I'll need to know that to make the farm
-> fields look right.
- 
-I think we should be prepared to vary the size of the texels on the ground
-to fit the style of the map. (The technical term for "the size of the
-texels on the ground" is the "lambda" of the texture - measured in
-meters-per-texel).
-
-Also, it's going to be hard to pick a single lambda that looks good at
-all altitudes. There isn't a good solution for that - with big SGI machines,
-you can use a feature called "detail texture" - but there don't seem to
-be any efforts to implement that on PC boxes yet.
-
-Maybe we'll make use of the upcoming multitexture hardware (if 3Dfx
-and nVidia solve their lawsuits...) to apply two or more textures
-at differing lambdas.
-
-I think the preson who paints the map should have some idea of what
-altitudes it's going to look good at - and hence should be able to
-specify the lambda to the terrain generator software on a per-map
-basis.
-
-Clearly, for field patterns, we need a fairly small lambda to make it
-possible to see nice sharp field edges with the odd road or boundary
-hedge/treeline running between them. This makes the texture fairly
-repetitious, but for field patterns that may not be too bad.
-
-For fuzzier 'natural' textures, you can use a larger lambda's resulting
-in less obvious repetition.
-
-Steve Baker                (817)619-2657 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
-
-Please visit the FGFS web page:  http://www.flightgear.org
-For help on using this list (especially unsubscribing), send a message to
-"fgfs-devel-request@flightgear.org" with a single line of text: "help".
-
-From owner-fgfs-devel@flightgear.org  Tue Sep 22 16:28:28 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["1472" "Tue" "22" "September" "1998" "16:26:37" "-0500" "Steve Baker" "sbaker@link.com" nil "34" "Re: [FGFS-Devel] vegetation / land use" "^From:" nil nil "9" nil nil nil nil nil]
-	nil)
-Received: from mailhub.woodsoup.org (IDENT:root@anduin.physics.iastate.edu [129.186.82.1])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id QAA06106
-	for ; Tue, 22 Sep 1998 16:28:27 -0500 (CDT)
-Received: from majordom by mailhub.woodsoup.org with local (Exim 1.92 #1)
-	for fgfs-devel-outgoing@flightgear.org
-	id 0zLZyX-0000aT-00; Tue, 22 Sep 1998 16:27:57 -0500
-Received: from bgm.link.com ([130.210.2.10] helo=lfkw10.bgm.link.com)
-	by mailhub.woodsoup.org with esmtp (Exim 1.92 #1)
-	for fgfs-devel@flightgear.org
-	id 0zLZyW-0000a5-00; Tue, 22 Sep 1998 16:27:56 -0500
-Received: from samantha.bgm.link.com (samantha.bgm.link.com [130.210.65.19])
-          by lfkw10.bgm.link.com (8.8.6/RSC-RTI-1.0) with SMTP
-	  id QAA23910 for ; Tue, 22 Sep 1998 16:27:21 -0500 (CDT)
-X-Sender: steve@samantha.bgm.link.com
-In-Reply-To: <13831.64964.272599.402309@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: fgfs-devel@flightgear.org
-From: Steve Baker 
-Sender: owner-fgfs-devel@flightgear.org
-To: fgfs-devel@flightgear.org
-Subject: Re: [FGFS-Devel] vegetation / land use
-Date: Tue, 22 Sep 1998 16:26:37 -0500 (CDT)
-
-On Tue, 22 Sep 1998, Curtis L. Olson wrote:
-
-> Eric Mitchell writes:
-> > Sounds good. Can you tell me the (rough) dimensions of a single texture
-> > square when it's rendered in FG? I'll need to know that to make the farm
-> > fields look right.
-> 
-> This is a tough one I haven't really ironed out yet.  We can easily
-> change this in the code to suit our needs.  3dfx imposes a 256x256
-> limitation on texture dimensions.  What amount of ground could we
-> reasonably cover with a texture of this resolution.  Obviously this is
-> trade off city here ... :-(
- 
-Probably ought to paint the maps at better than 256x256 resolution - 3Dfx
-won't be the norm forever - and there is a definite trend to having much
-bigger maps - and more of them.
-
-All portable OpenGL code should use the "PROXY" texture trick to figure
-out if the texture is going to fit and automagically reduce the size
-(by dropping out the higher level MIPmaps) on less capable hardware.
-
-This will make the textures look fuzzier on 3Dfx hardware than on others,
-especially at low altitudes.
-
-
-Steve Baker                (817)619-2657 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
-
-Please visit the FGFS web page:  http://www.flightgear.org
-For help on using this list (especially unsubscribing), send a message to
-"fgfs-devel-request@flightgear.org" with a single line of text: "help".
-
-From mschaefe@MIT.EDU  Wed Sep 23 12:33:42 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["1083" "Wed" "23" "September" "1998" "13:30:37" "-0400" "mschaefe@MIT.EDU" "mschaefe@MIT.EDU" nil "34" "Re: [FGFS-Devel] vegitation / land use" "^From:" nil nil "9" nil nil nil nil nil]
-	nil)
-Received: from MIT.EDU (PACIFIC-CARRIER-ANNEX.MIT.EDU [18.69.0.28])
-	by meserv.me.umn.edu (8.9.1a/8.9.1) with SMTP id MAA22241
-	for ; Wed, 23 Sep 1998 12:33:42 -0500 (CDT)
-Received: from MIT.MIT.EDU by MIT.EDU with SMTP
-	id AA17918; Wed, 23 Sep 98 13:33:41 EDT
-Received: from LFM-IDAHO.MIT.EDU by MIT.MIT.EDU (5.61/4.7) id AA06057; Wed, 23 Sep 98 13:33:41 EDT
-Message-Id: <3.0.32.19980923133036.008fc440@po10.mit.edu>
-X-Sender: mschaefe@po10.mit.edu
-X-Mailer: Windows Eudora Pro Version 3.0 (32)
-Mime-Version: 1.0
-Content-Type: text/plain; charset="us-ascii"
-From: mschaefe@MIT.EDU
-To: "Curtis L. Olson" 
-Subject: Re: [FGFS-Devel] vegitation / land use
-Date: Wed, 23 Sep 1998 13:30:37 -0400
-
-	Curt,
-
-	I believe all of that data is contained on the 1:2mil CD, which I know to
-be in lat/long format.  It's FTP'able, or you can buy the CD for $20, with
-data from all the states (I'm not sure if AK and HI are included on 2mil).
-	
-	It doesn't, as far as I know, have building/smokestack/... data on the
-2mil CD.  It think that's much too detailed.
-
-Mark
-P.S. Check out
-ftp://mapping.usgs.gov/pub/ti/DLG/2mdlgguide/1994_Revision/2mdug95.txt
-for more info on what is contained on the CD.  The site has more
-information on how to decode the data as well.
-
->Mark,
->
->Is there lake, road, river, city outline data available on line that
->uses lat/lon coordinates?  The data sets I've seen have all been
->with the funky projected coordinate system relative to some reference
->point.
->
->What other things can you get out of this?  Is there smoke stack,
->powerline, tall building data available in these too?
->
->Thanks,
->
->Curt.
->-- 
->Curtis Olson                        University of MN, ME Dept.
->curt@me.umn.edu                     
->http://www.menet.umn.edu/~curt      Try Linux!
->
-
diff --git a/Hints/tile-gaps b/Hints/tile-gaps
deleted file mode 100644
index e0d743350..000000000
--- a/Hints/tile-gaps
+++ /dev/null
@@ -1,72 +0,0 @@
-From sbaker@link.com  Tue May 26 07:55:03 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["1540" "Tue" "26" "May" "1998" "07:54:04" "-0500" "Steve Baker" "sbaker@link.com" nil "40" "Re: Question" "^From:" nil nil "5" nil nil nil nil nil]
-	nil)
-X-VM-Last-Modified: (13793 54640 649954)
-X-VM-IMAP-Retrieved: nil
-X-VM-POP-Retrieved: nil
-X-VM-Message-Order:
-	(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-	 16 17 18 19 20 21 22 23 24 25 26)
-X-VM-Summary-Format: "%n %*%a %-17.17F %-3.3m %2d %4l/%-5c %I\"%s\"\n"
-X-VM-Labels: ("r")
-X-VM-VHeader: ("Resent-" "From:" "Sender:" "To:" "Apparently-To:" "Cc:" "Subject:" "Date:") nil
-X-VM-Bookmark: 20
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id HAA28563
-	for ; Tue, 26 May 1998 07:55:02 -0500 (CDT)
-Received: from borgus.bgm.link.com (borgus.bgm.link.com [130.210.236.13])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id HAA00068 for ; Tue, 26 May 1998 07:54:55 -0500 (CDT)
-X-Sender: steve@borgus.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199805230429.XAA10965@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: Question
-Date: Tue, 26 May 1998 07:54:04 -0500 (CDT)
-
-On Fri, 22 May 1998, Curtis L. Olson wrote:
-
-> I'm running into floating point problems again where my scenery tiles
-> sometimes have a pixel gap between them.  I was wondering if you had
-> any ideas ...
- 
-It's a problem that plagues us too.
-
-I can't say that I have a magic solution.
-
-One thing I have *considered* is to do everything in integers (for
-the terrain skin at least).
-
-This sounds counter-intuitive - but the source data for your
-terrain is certainly not accurate to better than a meter - and
-integers have the huge advantage that they don't suffer from
-roundoff error providing all you do is add and subtract them.
-
-However, I havn't had the nerve to try this yet - right now, we
-kludge the edges of each terrain tile to make it a teeny-tiny bit
-too big. The resulting overlap is very small - but enough to get
-rid of the cracks.
-
-> Anyways, what this forces me to do is for each tile I must
-> glTranslate() by center_of_tile_to_be_drawn - center_of_tile_I'm_in.
-> But, up until this point everything was done in double's so I was
-> hoping the final translate about which is on the order of 20,000 -
-> 30,000 meters would be ok.
- 
-But that translate could be done in integer meters. 
-
-> Anyways, I just thought I'd see if you had any brilliant thoughts on
-> the subject.
-
-Nope - it's a continual problem for me too.
-
-Steve Baker                (817)619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
diff --git a/Hints/timezone b/Hints/timezone
deleted file mode 100644
index f17fac9b0..000000000
--- a/Hints/timezone
+++ /dev/null
@@ -1,67 +0,0 @@
->-----Original Message-----
->From: Antoine Leca [mailto:Antoine.Leca@renault.fr] 
->Sent: Thursday, April 01, 1999 4:51 AM
->To: Lee Geoff
->Cc: tz@elsie.nci.nih.gov
->Subject: Re: storing timestamp data
->
->
->Lee Geoff wrote:
->> 
->> I'm interested in storing date/time data in Ingres
->> databases which are running on Unix servers. We are 
->recording timed events
->> on Unix servers as well as Windows 3.1 and NT PCs.  I have 
->had problems with
->> the apparent miss-handling of data when viewed before or after a DST
->> transition.
->
->We had this kind of problems when setting up a Internet 
->standard for exchanging
->calendars, agendas and schedules (it ends up in RFC2245, if you mind).
->
->The net result was: either use UTC, or local time + offset from UTC.
->Do not use local time without UTC offset, as no reliable method can be
->set up to correctly retrieve the exact point of time 
->afterwards (as you may
->have experienced).
->
->Using UTC times is native on Unix and NT (AFAIK), so this is 
->the basic choice
->there.  The problem comes with Windows non-NT PCs, since they 
->run local clocks.
->IMHO, and to be consistent with the above, no data that are 
->not tagged with
->the (best approximation of) UTC offset should leave the PC.
->
->Traditional way of finding the best approximation are (in order):
-> - search for an (up to date) Olson's package to interpret the 
->information,
->  perhaps by searching $(DJDIR)/zoneinfo/localtime in addition to 
->  $(TZDIR)/localtime
-> - if running on Windows 95/98, search the information in the registry
-> - setting a mechanism dedicated to it (but it will end with one more
->  mechanism, which tends to upset users)
-> - ask the TZ environment variable
-> - search the information on related softwares that may be 
->present on the PCs
->  (examples are mailing systems, e.g. Notes, and IP 
->connectivity packages)
->
->Do not use:
-> - tzset and timezone, as it defaults to PST8PDT or EST5EDT on 
->most compilers,
->  without being reliably accurate on most workstations by lack of TZ
-> - if your users are not Americans, do not rely on US-based 
->rules; they are
->  almost correct for Europeans (except that for example, this 
->week, my UTC
->  offset is wrong because my mail software is brocken on this 
->respect...)
->
->
->Hope it helps,
->
->Antoine
->
->
diff --git a/Hints/view-frustum-culling b/Hints/view-frustum-culling
deleted file mode 100644
index 3c7b90bc8..000000000
--- a/Hints/view-frustum-culling
+++ /dev/null
@@ -1,986 +0,0 @@
-From sbaker@link.com  Thu Jan 29 23:16:07 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["5377" "Thu" "29" "January" "1998" "23:16:36" "-0600" "Steve Baker" "sbaker@link.com" "" "139" "Re: View frustum culling" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id XAA03024
-	for ; Thu, 29 Jan 1998 23:16:06 -0600 (CST)
-Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id XAA18220 for ; Thu, 29 Jan 1998 23:15:35 -0600 (CST)
-X-Sender: steve@lechter.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199801292145.PAA04212@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: View frustum culling
-Date: Thu, 29 Jan 1998 23:16:36 -0600 (CST)
-
-On Thu, 29 Jan 1998, Curtis L. Olson wrote:
-
-> Questions ...
-> 
-> Let's say I know the following:
-> 
-> Eye pt. = (0, 0, 0)
-> "look at" vector
-> "view up" vector
-> field of view angle
-> Assume a "square" view volume cross section (i.e. the far clip plane
-> would be a square)
- 
-(That is almost never the case since you want the image to fit the
-screen shape - but OK - for argument's sake, same HFOV as VFOV).
-
-> I can calcuation the near and far clip planes pretty easily with this
-> info.
- 
-Assuming you know the near and far clip ranges - yes.
-
-> Now, to calculate the left and right planes I could rotate the look at
-> vector about the view up vector by -1/2 * fov and +1/2 * fov
-> respectively.  The view up vector already lies in both these planes,
-> so then I'd have two vectors in each plane and then I could calculate
-> the normals to get the equations of these planes
- 
-Yes, that would work.
-
-> Then to calculate the top and bottom planes I could rotate the view up
-> vector by 90 degrees about the look at vector to get a vector in both
-> these planes, then I could rotate the look at vector about this new
-> vector by -1/2 * fov and +1/2 * fov to get the second vector in each
-> of these planes, and crunch the math just like I did for the left and
-> right planes.
- 
-...or you could just rotate the left or right plane normal by 90 degrees
-about the lookat vector (but only for your hypothetical square FOV).
-
-> Does this sound reasonable, or am I missing some obvious tricks?
- 
-It's *reasonable* if you want the view planes in the coordinate system
-of the world. However, I'd argue about that premise.
-
-I did the opposite - I keep the view frustum in the coordinate system
-of the eye and rotate the world into that coordinate system. This
-costs at most one extra transform (by the inverse of the eye-rel-world
-matrix) per frame (at the root of the database tree).
-
-The advantages are *huge* in the clipping code (which is where I
-assume you are going with this question) since the plane equations
-for the near and far planes (in eye coordinates) are trivial:
-
-    General Equation of a Plane:
-
-              Ax + By + Cz + D == 0
-
-    Far clip plane:
-
-              A == 0 ;
-              B == 0 ;
-              C == -1 ;
-              D == far_clip_range ;
-
-    Near clip plane:
-
-              A == 0 ;
-              B == 0 ;
-              C == 1 ;
-              D == -near_clip_range ;
-
-Also, since the left and right clip planes are now vertical, we
-know that B==0 and for the top and bottom planes, A==0.
-
-In addition, because of symmetry about the Z axis, the A of
-the left plane is equal to -A for the right, and the B of
-the top plane is equal to -B of the bottom.
-
-Furthermore, since D is just the distance of the closest
-point of the plane to the origin - and all four planes
-go through the eyepoint - and that *is* the origin - that
-means that the 'D' component of all four edge equations is
-always zero.
-
-Notice that since the frustum is in eye coordinates,
-there is no need to worry about lookat or viewup vectors
-since these are 0,0,1 and 0,1,0 respectively - and the
-eye point is always at 0,0,0 by definition.  This also
-means that you only need to calculate those plane equations
-once - rather than once per frame as with your scheme.
-
-When you come to ask the question: "Is this bounding sphere
-cleanly inside the frustum, cleanly outside the frustum or
-(annoyingly) straddling it?", you will want to insert the
-x,y,z of the center of the sphere (relative to the eye
-in the 'eye' coordinate system) into each of the
-six plane equations in turn to compute the distance from the
-sphere center to the plane - and compare that to the radius
-of the sphere. When you write out the math for this, using
-the full plane equations (as you would have to do with your
-scheme), you find that all those zeros and symmetry effects
-result in some pretty amazing optimisations.
-
-Additionally, this is the OpenGL way. You stuff your frustum
-matrix into the 'PROJECTION_MATRIX', put the inverse of
-your eyepoint transform into the MODELVIEW_MATRIX and proceed
-to push/multiply/pop the transforms of each of the models onto
-that same matrix. Notice that the frustum is never transformed
-into world space.
-
-I suggest you go back and re-read the last L-O-N-G email I
-sent about clipping, I explain my suggested method there
-in more detail.
-
-Note that I'm not saying that what you propose is wrong -
-just that IMHO (and *only* IMHO), my way is going to be
-a lot simpler and cheaper to implement. However, there may
-be other reasons to want to do it your way.
-
-The complexity of MANY 3D graphics problems often depends
-critically on your choice of coordinate system. For
-clipping, doing the math in the eye coordinate system
-results in a *tiny* amount of math per sphere tested.
-
-If you ever need to do lighting calculations, then
-carrying them out in a coordinate system with the
-light source at the origin makes life a gazillion
-times easier too. The same kinds of things will also
-crop up in collision detection as well.
-
-
-Steve Baker                     817-619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.           817-619-4028 (Fax)
-2200 Arlington Downs Road       SBaker@link.com (eMail)
-Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
-http://www.hti.com        http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
-From sbaker@link.com  Fri Jan 30 14:08:05 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["4594" "Fri" "30" "January" "1998" "14:08:27" "-0600" "Steve Baker" "sbaker@link.com" "" "120" "Re: View frustum culling" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id OAA21393
-	for ; Fri, 30 Jan 1998 14:08:03 -0600 (CST)
-Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id OAA10811 for ; Fri, 30 Jan 1998 14:07:27 -0600 (CST)
-X-Sender: steve@lechter.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199801301948.NAA25718@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: View frustum culling
-Date: Fri, 30 Jan 1998 14:08:27 -0600 (CST)
-
-On Fri, 30 Jan 1998, Curtis L. Olson wrote:
-
-> Steve Baker writes:
-> > I did the opposite - I keep the view frustum in the coordinate
-> > system of the eye and rotate the world into that coordinate
-> > system. This costs at most one extra transform (by the inverse of
-> > the eye-rel-world matrix) per frame (at the root of the database
-> > tree).
-> >
-> > I suggest you go back and re-read the last L-O-N-G email I sent
-> > about clipping, I explain my suggested method there in more detail.
-> 
-> Yes I have that in front of me.  I guess it wasn't clear to me that
-> you were using this greatly simplifed view frustum specially placed in
-> eye coordinates.
- 
-That's the key to doing this stuff *quickly*.
-
-> > The complexity of MANY 3D graphics problems often depends critically
-> > on your choice of coordinate system. For clipping, doing the math in
-> > the eye coordinate system results in a *tiny* amount of math per
-> > sphere tested.
-> 
-> Yes ... your description all makes sense and looks like it makes view
-> frustum culling very simple to implement.
-> 
-> Ok, so now I'm going to try to zero in a bit more on the source of my
-> confusion, which involves getting from my world to your eye
-> coordinates.
- 
-Let's adopt a naming convention for matrices here:
-
-    A_rel_B
-
-      means the matrix that positions objects in A relative to
-      the object B.
-
-Some facts:
-
-    B_rel_A is just the inverse of A_rel_B.
-
-    A_rel_B * B_rel_C == A_rel_C
-
-Hence: (for a flat-earth world - just for the moment)
-
-    If the eyepoint is 10km east of the origin (eyepoint.x == 10,000)
-    then:
-
-    eye_rel_world is a matrix that translates by 10000m in the X
-    direction.
-
-    world_rel_eye is the inverse of eye_rel_world - which in this
-    case is just a matrix that translates by -10000m in X.
-
-Taking the inverse of a general matrix isn't nice - but for simple
-rotate/translate matrices it isn't too bad - and you only do it
-once per frame anyway.
-
-> Lets say that I have a bunch of scenery tiles that are properly
-> oriented, but translated to near (0, 0, 0) to avoid problems with
-> "float" precision.
-> 
-> I assume based on your previous message that you define your view
-> frustum once at the beginning of your program in eye coordinates to
-> simplify all this math.
-
-Yep - you *might* want to allow the user to change it sometimes - but
-basically, it's always the same number unless you resize the window,
-zoom the image, etc.
-
-> This moves the "hard" part to generating a transformation matrix that
-> maps world coordinates into eye coordinates.
- 
-But world_rel_eye is just the inverse of eye_rel_world - and that's
-just the rotation/translation of the eyepoint relative to some
-arbitary point.
-
-> You say ...
-> 
-> > Additionally, this is the OpenGL way. You stuff your frustum matrix
-> > into the 'PROJECTION_MATRIX', put the inverse of your eyepoint
-> > transform into the MODELVIEW_MATRIX and proceed to push/multiply/pop
-> > the transforms of each of the models onto that same matrix. Notice
-> > that the frustum is never transformed into world space.
-> 
-> Ok, so does this mean that every iteration I have to generate the
-> world -> eye transformation matrix by hand ... i.e. calculate the
-> first translation matrix, calculate the rotation matrix, calculate the
-> second translation matrix, calculate the shear matrix, calculate the
-> scaling matrix, and then combine all these together, then invert it
-> and stuff it on the MODELVIEW stack?
-
-Yes - except that the eye_rel_world isn't usually scaled or sheared or
-anything. Just heading/pitch/roll/x/y/z.
-
-> Or is there a way to get OpenGL to do this work for me?
-
-No - not really - there is no glInvertMatrix (AFAIK) - and in any
-case, on machines with geometry accelleration doing a glGetMatrix
-is *death* to performance.
-
->  If not, can I at least use OpenGL's rotates,
-> and transformations to avoid spending two weeks debugging picky math
-> routines?
- 
-No - don't debug new math routines either - let me find some out on the
-web for you.  I'm sure I know of a good set. I'll email you from home
-tonight - I'm a bit busy right now.
-
-Flight Gear will definitely need a good, robust set of math routines -
-better to have a solid library than to try to kludge something in OpenGL.
-
-Steve Baker                     817-619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.           817-619-4028 (Fax)
-2200 Arlington Downs Road       SBaker@link.com (eMail)
-Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
-http://www.hti.com        http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
-From sbaker@link.com  Fri Jan 30 22:51:59 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["4301" "Fri" "30" "January" "1998" "22:52:31" "-0600" "Steve Baker" "sbaker@link.com" nil "103" "Re: View frustum culling" "^From:" nil nil "1" nil nil nil nil nil]
-	nil)
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id WAA03743
-	for ; Fri, 30 Jan 1998 22:51:58 -0600 (CST)
-Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id WAA08997 for ; Fri, 30 Jan 1998 22:51:26 -0600 (CST)
-X-Sender: steve@lechter.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199801302035.OAA26234@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: View frustum culling
-Date: Fri, 30 Jan 1998 22:52:31 -0600 (CST)
-
-On Fri, 30 Jan 1998, Curtis L. Olson wrote:
-
-> Steve Baker writes:
-> > But world_rel_eye is just the inverse of eye_rel_world - and that's
-> > just the rotation/translation of the eyepoint relative to some
-> > arbitary point.
-> 
-> Ok, from what you are saying, if I think about it, I've probably
-> already got a suitable matrix or something close to it laying around
-> someplace.  I have a matrix that does the proper rotations to align
-> world coordinates with the local "up" for the aircraft.  I'd probably
-> just need to pre-multiply the proper translation matrix with that
-> rotate matrix, then invert it, and stuff it onto the MODELVIEW stack.
- 
-You *must* be doing the right thing at the start of the frame - or
-how else would the graphics be coming out right? (Oh - unless you
-are using that weird OpenGL 'lookat' function or something).
-
-> > No - don't debug new math routines either - let me find some out on
-> > the web for you.  I'm sure I know of a good set. I'll email you from
-> > home tonight - I'm a bit busy right now.
-> >
-> > Flight Gear will definitely need a good, robust set of math routines
-> > - better to have a solid library than to try to kludge something in
-> > OpenGL.
-> 
-> You may scream when you hear this, or not, I'm not sure ... but I've
-> been using the matrix and vector routines from SRGP and SPHIGS.
- 
-I don't know these - but it's hard to imagine how anyone could screw
-up the implementation of a matrix math library - so they are probably OK.
-
-I have accumulated by own matrix/quaternion library that I've used
-for the last 10 years - every new project starts with it - and adds to
-it, so now I don't even have to think about how to drive it. That's
-a very liberating thing.
-
-Another good source for a matrix lib is inside the Mesa sources. These
-are particularly interesting because the latest Beta release has
-super-optimised machine code for Intel CPU's under Linux as a conditional
-compiled option.  You'd need to copy and change the names of the routines
-though to avoid the names clashing with the real Mesa routines.
-
-One *IMPORTANT* thing is that when you invert the eye_rel_world matrix
-to get world_rel_eye, don't use a general purpose matrix invert routine
-since those are *REALLY* inefficient bits of code for matrices that
-are guaranteed to be pure rotate/translate. Instead, just do this:
-
-  /*
-    This definition of a matrix is
-    easier to deal with than a float[16] -
-    but you can safely pass this kind
-    of matrix directly to OpenGL routines
-    like glMultMatrix and glLoadMatrix.
-  */
-
-  typedef float fgMat [ 4 ][ 4 ] ;
-   
-  /*
-    Transpose/Negate is a poor man's invert.
-    It can *only* be used when matrix is a
-    simple rotate-translate - but it's a
-    gazillion times faster than a full-blown
-    invert.
-  */
-   
-  void fgTransposeNegateMat( fgMat dst, fgMat src )
-  {
-    /* Transpose the 3x3 rotation sub-matrix */
-
-    dst[0][0] = src[0][0] ; dst[0][1] = src[1][0] ; dst[0][2] = src[2][0] ;
-    dst[1][0] = src[0][1] ; dst[1][1] = src[1][1] ; dst[1][2] = src[2][1] ;
-    dst[2][0] = src[0][2] ; dst[2][1] = src[1][2] ; dst[2][2] = src[2][2] ;
-
-    /* Negate the translate part */
-
-    dst[3][0] = -src[3][0] ; dst[3][1] = -src[3][1] ; dst[3][2] = -src[3][2] ;
-
-    /* Populate the rest */
-
-    dst[0][3] = dst[1][3] = dst[2][3] = 0.0f ; dst[3][3] = 1.0f ;
-  }
-
-> Debugging the low level routines, though, is sometimes the easy part,
-> debugging the usage of them is where it can often get hairy ... :-)
- 
-I agree - matrices are truly horrible to get your head around. Have
-you looked into Quaternions yet?  They are v.interesting for the
-flight dynamics people because they don't suffer from 'gymbal lock'
-like H,P,R angles and are easier to renormalize than matrices.
-
-You don't want to use Quaternions for the main graphics code - but
-it's easy to form a Matrix from a Quaternion - and Quaternions are
-a much better way to represent rotation than the usual three angles.
-
-Steve Baker                     817-619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.           817-619-4028 (Fax)
-2200 Arlington Downs Road       SBaker@link.com (eMail)
-Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
-http://www.hti.com        http://web2.airmail.net/sjbaker1 (personal)
-
-** Beware of Geeks bearing GIF's. **
-
-
-From owner-flight-gear@me.umn.edu  Tue May 19 07:45:59 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["4413" "Tue" "19" "May" "1998" "07:44:47" "-0500" "Steve Baker" "sbaker@link.com" nil "116" "Re: [FGFS] View Frustum Culling" "^From:" nil nil "5" nil nil nil nil nil]
-	nil)
-Received: (from majordom@localhost)
-	by meserv.me.umn.edu (8.8.8/8.8.8) id HAA04944
-	for flight-gear-outgoing; Tue, 19 May 1998 07:45:59 -0500 (CDT)
-X-Authentication-Warning: meserv.me.umn.edu: majordom set sender to owner-flight-gear@me.umn.edu using -f
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id HAA04940
-	for ; Tue, 19 May 1998 07:45:55 -0500 (CDT)
-Received: from borgus.bgm.link.com (borgus.bgm.link.com [130.210.236.13])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id HAA29586 for ; Tue, 19 May 1998 07:45:23 -0500 (CDT)
-X-Sender: steve@borgus.bgm.link.com
-In-Reply-To: <199805182119.QAA04388@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: flight-gear@me.umn.edu
-From: Steve Baker 
-Sender: owner-flight-gear@me.umn.edu
-To: flight-gear@me.umn.edu
-Subject: Re: [FGFS] View Frustum Culling
-Date: Tue, 19 May 1998 07:44:47 -0500 (CDT)
-
-On Mon, 18 May 1998, Curtis L. Olson wrote:
-
-> Steve Baker writes:
-> > Are you only planning to cull at the tile level?  You probably ought
-> > to cull at the triangle strip level (at least on machines without
-> > geometry hardware).
-> 
-> You are always trying to make things more complicated ... :-)
- 
-It's my experience that things are perfectly capable of getting
-more complicated without any help from me :-)
-
-> > You can check a bounding sphere against the view frustum in about 4
-> > multiplies and four additions - and you only need to do that for
-> > spheres inside tiles that straddle the frustum. Each test that
-> > excludes a tstrip will save a bunch of vertex transforms - so you
-> > should get another big win in doing that.
-> 
-> Ok, a couple of questions.  Do you recommend pre-calculating and
-> storing the bounding sphere info for each tri-strip in the data file,
-> or should I calculate it at load time?
-
-Well, since you only have one CPU to use for both rendering and
-realtime database paging, you'll want to minimise the amount of
-calculations when loading. The bounding sphere calculation
-that most people do is very simple - you probably would want to do it
-offline eventually - but you can probably do it on loading the database
-for now just so you can get the culling stuff finished. So long as you
-don't do it every frame you'll be OK in the short term.
-
-The basic bounding sphere algorithm that most people (including me)
-use is v.simple. Just find the maximum and minimum x, y and z values
-in the data set, position the center of the sphere halfway between
-the minimum and maximum in each axis - then go through the points
-to find the one thats furthest from that center point - that distance
-is the radius. (You can compare the square of the ranges to get the
-longest range - so you only need to do one sqrt per sphere when you
-need to compute the actual radius).
-
-There has been some discussion of 'better' algorithms that (presumable)
-produce tighter spheres than the simple method described above. On
-my 'to do' list here at work is to evaluate these various algorithms to
-see which actually produces the tightest spheres.
-
-   tighter spheres == better culling == lower polygon counts.
-
-I'm pretty sceptical about these algorithms being *significantly*
-better than the simple one - but even a few percent improvement
-is worth having if I can do it offline and steal the code from
-someone who can do 'math'.
-
-This one looks interesting:
-
-   http://vision.ucsd.edu/~dwhite/ball.html
-
-...although being iterative, I wouldn't want to do it in my
-database loader code.
-
-Same applies to this one:
-
-   http://cm.bell-labs.com/who/clarkson/center.html
-
-Both have source code - which is just as well since I can't understand
-the math behind either of them!
-
-If your culling math starts to take too much time then you'll want to
-do a hierarchical cull. If I were you though I'd probably just
-do this:
-
-  for each terrain tile
-  {
-    if ( outside the frustum )
-      continue ;
-
-    if ( inside the frustum )
-      draw all the tristrips
-    else /* straddling the frustum */
-    {
-      for each tristrip
-        if ( inside or straddling the frustum )
-          draw the tristrip
-    }
-  }
-
-(Of course 'draw the tristrip' might actually mean 'add the tristrip to
-the appropriate bucket so we can draw it later')
-
->  To impliment this sort of
-> scheme I suppose I would need to keep each tri-strip in it's own
-> display list.
-
-Yep - but you need to do that so that you can....
-
-> ...sort the objects into buckets by material properties.
-
-Definitely. Switching material properties (especially texture map)
-is very costly on most hardware OpenGL's. Sorting is an absolute
-must once you start you use more than one kind of texture on the
-terrain skin.
-
->  I suppose this would entail defining material properties in the data
-> file and otherwise sprucing up the data file format (and internal data
-> structures) a bit.
-
-Eventually.
-
-
-Steve Baker                (817)619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
--------------------------------------
-Please visit the FGFS web page:  http://www.menet.umn.edu/~curt/fgfs/
-For help on using this list (especially unsubscribing), send a message to
-"flight-gear-request@me.umn.edu" with a single line of text: "help".
-
-From sbaker@link.com  Mon May 18 07:39:58 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["10518" "Mon" "18" "May" "1998" "07:39:06" "-0500" "Steve Baker" "sbaker@link.com" nil "295" "Re: view frustum culling" "^From:" nil nil "5" nil nil nil nil nil]
-	nil)
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id HAA01318
-	for ; Mon, 18 May 1998 07:39:57 -0500 (CDT)
-Received: from sutcliffe.bgm.link.com (sutcliffe.bgm.link.com [130.210.236.18])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id HAA03232 for ; Mon, 18 May 1998 07:39:26 -0500 (CDT)
-X-Sender: steve@sutcliffe.bgm.link.com
-Reply-To: Steve Baker 
-In-Reply-To: <199805152113.QAA12303@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-From: Steve Baker 
-To: "Curtis L. Olson" 
-Subject: Re: view frustum culling
-Date: Mon, 18 May 1998 07:39:06 -0500 (CDT)
-
-On Fri, 15 May 1998, Curtis L. Olson wrote:
-
-> I was just planning to work out the math myself, but it's not coming
-> out nearly as simple as what you had.  The near/far clipping plane is
-> trivial, but I was working through the sides and started to see a few
-> sqrt()'s and such start to creep in, and I don't remember seeing this
-> with your pseudo-code.
- 
-Certainly shouldn't need sqrt's.
-
-How about this:
-
-You said:
-
-> Anyone know anything about view frustum culling?
-
-Yep.
-
-Two issues:
-
-1) Scene hierarchy generation (offline).
-
-2) Runtime culling.
-
-Hierarchy:
-==========
-
-There are lots of ways to do this. I usually build an heirerchical description
-of each terrain tile. I typically build a tree structure that's organized
-as follows:
-
-                              |  The World.
-                              | 
-           ___________________|___   
-          |   |   |   |   |   |   |
-          *   *   *   *   *   *   *  Terrain tiles currently loaded
-          |   |   |   |   |   |   |
-                              |     
-                              |
-                         _____|_____
-                        |   |   |   |
-                        *   *   *   *   Quarter-tiles
-                        |   |   |   |
-                            |
-                            |
-                       _____|_____ 
-                      |   |   |   |
-                      *   *   *   *   Sixteenth-tiles
-                      |   |   |   |
-
-...and so on down until the number of polygons in each 'object' gets 'small enough'.
-
-When you do this, don't try to split polygons when they cross a quarter or a
-sixteenth tile boundary - just dump each polygon into the nearest 'bucket' to
-it's centroid.
-
-Do your tri-stripping on the leaf nodes of this tree - so that each tristrip
-is contained entirely within one bucket.
-
-Eventually, you will need to include buildings, roads, rivers, etc. Since these
-need to be culled by level of detail, it is often useful to put them into a separate
-tree structure that parallels the terrain 'skin' structure.
-
-Finally, compute a bounding sphere around each leaf node, find the best fit
-sphere by finding the maximum and minimim x, y and z of the tristrips in that
-leaf node, taking the mid-point and then finding the vertex that is furthest
-from that center point and using it as the radius.
-
-Compute the bounding sphere for each level in the tree (everywhere where there is
-a '*' in my diagram).
-
-Runtime:
-========
-
-At runtime, you walk that tree every frame, testing the bounding sphere against
-the view frustum.
-
-* If the sphere lies entirely outside the view frustum then stop traversal
-  for that node. There is no need to test any of the nodes beneath this one
-  (we know that none of their leaf tristrips are visible).
-
-* If the sphere lies entirely inside the view frustum then traverse immediately
-  to all of the leaves below this node without doing any more sphere testing
-  on them - draw all of the tristrips that are there. (We know they are all visible)
-
-* If the sphere straddles the view frustum then check each daughter node in
-  turn by applying this algorithm on them recursively. If a leaf node straddles
-  the view frustrum then it's bad luck, you just draw all the tristrips it
-  contains and let OpenGL do the work.
-
-You might also want to put a 'transition range' onto each node and if it
-lies beyond that range cull it. You can also use this to conveniently
-switch levels of detail by having multiple versions of each object in
-the tree.
-
-Testing a sphere against the View Frustum:
-==========================================
-
-In most cases, we can describe the volume of space that you can see
-through the little glass window on the front of your CRT using a
-Frustum (frequently mis-spelled as Frustrum or Fustrum even in some
-text books).
-
-A frustum is a truncated pyramid - which typically bounded by six
-planes called:
-
-  NEAR, FAR, LEFT, RIGHT, TOP, BOTTOM
-
-There are applications that require additional clipping planes (eg for
-non-rectangular screens) - extending the work described in this
-to cater for that is not hard).
-
-In principal, all six planes can be constructed as general plane
-equations:
-
-    A x + B y + C z + D == 0
-
-However, for most applications, NEAR and FAR are parallel to the
-screen, LEFT, RIGHT,TOP and BOTTOM all meet at the eye and the eye lies
-along a vector that extends out from the center of the screen and is
-perpendicular to it. This simplifies the equations considerably for
-practical applications.
-
-Transforms.
-~~~~~~~~~~~
-
-It is easiest to perform culling in a coordinate system where the
-eyepoint is at the origin and the line from the eye through the center
-of the screen lies along one major axis with the edges of the screen
-parallel to the remaining two axes. This coordinate system is called
-'Eye Space'.
-
-Testing a Sphere against a Frustum.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The most important thing to bear in mind about culling is that the
-first trivial-reject test you apply is by far the most time-critical.
-This test is always applied to more nodes than any of the subsequent
-tests.
-
-So, do the cheapest test first.
-
-This is typically the NEAR plane test. Everything behind the viewers
-head gets chopped out - and it's an especially cheap test.
-
-
-   if ( obj_sphere.center.z < near_plane - obj_sphere.radius )
-     REJECT!!
-
-
-...next do the second cheapest test (assuming you know that your
-database could possibly extend beyond the far clip plane)...
-
-
-   if ( obj_sphere.center.z - obj_sphere.radius > far_plane )
-     REJECT!!
-
-
-...and *then* (for each of the other 4 planes) do...
-
-
-   if ( distance( obj.position, plane ) <= obj_sphere.radius )
-     REJECT!!
-
-
-(The algorithm for computing that 'distance()' function is described
-below).
-
-It's also useful to know that in many applications, you cull more
-objects from the left and right faces of the frustum than you do from
-the top and bottom - so test left, then right, then bottom then top.
-
-Also, with bounding sphere tests, you shouldn't forget to do
-total-accept as well as total-reject tests. Once you know that an
-object's sphere is TOTALLY on screen, you don't have to descend into
-the daughter objects to cull-test them...you *know* they are all
-on-screen.
-
-Another way to look at that it to remember which of the six possible
-plane tests didn't even touch the sphere - as you work your way down
-the object hierarchy, you can accumulate those flags and avoid even
-testing those planes that a parent sphere has already cleanly passed.
-If you do this then a vast percentage of your spheres will only need to
-be tested against one plane.  However, for the normal case of a simple
-frustum - when you examine the fully optimised
-distance-of-point-from-plane code (below), you may well conclude that
-this additional logic doesn't justify the paltry amount of additional
-math that it might save.
-
-Computing the Distance from Sphere Center to Clipping Plane.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-A plane can be represented by the equation
-
-
-     Ax + By + Cz + D = 0 ;
-
-
-A,B,C is just the surface normal of the plane and D is the shortest
-distance from the origin to the plane.
-
-So, if you need to find the distance of a point from the plane, just
-imagine a new plane that goes through your test point and is parallel
-to the plane you want to test. The plane equation of that new plane
-would be:
-
-
-     A'x + B'y + C'z + D' = 0 ;
-
-
-Since the two planes are parallel, their surface normals are the same,
-so
-
-
-   A' == A B' == B C' == C D' == D + distance_between_the_two_planes
-
-
-...the only thing that's different is their D values - which differ by
-the distance of your test point from the original plane.
-
-So, for a point (x,y,z), the distance 'd' from the plane (A,B,C,D) is
-derived as:
-
-
-   d = D' - D
-     = -A'x - B'y - C'z - D
-     = -Ax - By - Cz - D
-     = -( [ABC]dot[xyz] + D )
-
-
-A dot-product of the point and the surface normal of the plane, plus
-the distance from the plane to the origin. Three multiplies, three
-additions and a negation.
-
-As an aside - if you consider the point (x,y,z) as a FOUR element
-homogeneous vector (x,y,z,w) then 'w' is 1.0 and you can compute the
-distance by simply taking the four element dot-product of (A,B,C,D)
-with (x,y,z,w). If you have fast 4x4 matrix math hardware in your
-machine then you can use it to compute the distance from a point to all
-four planes in a single operation!
-
-That's the general result for an arbitary plane - but culling to the
-view frustum is a very special case. If you are working in eye-relative
-coordinates (IMHO this is best), then since all TOP,BOTTOM,LEFT,RIGHT
-planes of the frustum meet at the eye - and since the eye is at the
-origin (by definition), then D is always zero for those planes and that
-saves you a subtract.
-
-If you are feeling even more in need of optimisation - then you can
-save one multiply per plane by realising that (for rectangular screens)
-one of the three components of the plane equation will always be zero.
-
-So, for the LEFT clip plane, the Y component of the normal of the plane
-is zero, so the distance to the left or right plane is just
-
-
-     d = -( Ax + Cz )
-
-
-...and to the top or bottom plane it's just:
-
-
-     d = -( By + Cz )
-
-
-Furthermore, we know that the A component for the LEFT plane is just
-the negation of the A component of the RIGHT plane, and the C component
-is the same for both LEFT and RIGHT (and similarly, the B component of
-the TOP plane, is the negation of the B component for the BOTTOM plane
-and the C component is the same for both TOP and BOTTOM). This means
-that you only need four multiplies and four additions to do the entire
-job. (Since you are only using this for culling, you don't need the
-minus sign - just reverse the conditional).
-
-The NEAR and FAR planes are typically parallel to the X/Y plane. That
-means that A and B are both zero and C is one (or minus-one) - but D is
-not zero, so the math boils down to an add and a negate:
-
-
-     d = -(z + D)
-
-
-Conclusions.
-~~~~~~~~~~~~
-
-Sphere-based culling can be extremely cost-effective. It's so cheap
-that even if you feel the need to use a bounding cubeoid (or even a yet
-more complex shape), it's still worth doing a sphere-based cull first
-just to get rid of the trivial accept and reject cases.
-
-
-Steve Baker                (817)619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
-From owner-flight-gear@me.umn.edu  Tue May 26 08:43:36 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["2090" "Tue" "26" "May" "1998" "08:42:09" "-0500" "Steve Baker" "sbaker@link.com" nil "69" "Re: [FGFS] View frustum culling" "^From:" nil nil "5" nil nil nil nil nil]
-	nil)
-Received: (from majordom@localhost)
-	by meserv.me.umn.edu (8.8.8/8.8.8) id IAA29744
-	for flight-gear-outgoing; Tue, 26 May 1998 08:43:36 -0500 (CDT)
-X-Authentication-Warning: meserv.me.umn.edu: majordom set sender to owner-flight-gear@me.umn.edu using -f
-Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id IAA29740
-	for ; Tue, 26 May 1998 08:43:31 -0500 (CDT)
-Received: from borgus.bgm.link.com (borgus.bgm.link.com [130.210.236.13])
-          by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
-	  id IAA02170 for ; Tue, 26 May 1998 08:43:01 -0500 (CDT)
-X-Sender: steve@borgus.bgm.link.com
-In-Reply-To: <199805240245.VAA00603@kenai.me.umn.edu>
-Message-ID: 
-MIME-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Precedence: bulk
-Reply-To: flight-gear@me.umn.edu
-From: Steve Baker 
-Sender: owner-flight-gear@me.umn.edu
-To: flight-gear@me.umn.edu
-Subject: Re: [FGFS] View frustum culling
-Date: Tue, 26 May 1998 08:42:09 -0500 (CDT)
-
-On Sat, 23 May 1998, Curtis L. Olson wrote:
-
-> Gene Buckle writes:
-> > If you want to email me a cygnus/mesa binary, I'd be happy to give
-> > you new speed figures.
-> 
-> Gene,
-> 
-> The new binaries expect a modified scenery format.  My impression for
-> now based on culled vs. drawn percentages is that there was a much
-> bigger jump between no culling and tile culling, than between tile
-> culling and fragment culling.
- 
-That's to be expected...
-
-(The eye is in the center of the diagram - looking up:
-
-No Culling - draw this much:
-
-   ________\_____________/________
-  |       | \     |     / |       |
-  |       |  \    |    /  |       |
-  |_______|___\___|___/___|_______|
-  |       |    \  |  /    |       |
-  |       |     \ | /     |       |
-  |_______|______\|/______|_______|
-  |       |       |       |       |
-  |       |       |       |       |
-  |_______|_______|_______|_______|
-  |       |       |       |       |
-  |       |       |       |       |
-  |_______|_______|_______|_______|
-
-
-Tile culling - draw this much:
-
-          _\_____________/_
-          | \     |     / |
-          |  \    |    /  |
-          |___\___|___/___|
-          |    \  |  /    |
-          |     \ | /     |
-          |______\|/______|
-
-
-Tile *and* tstrip culling - draw maybe this much:
-
-           \_____________/_
-          |_\     |     /_|
-           |_\    |    / |
-            |_\___|___/__|
-              |\  |  /_|
-              |_\ | /_|
-                |\|/|
-
-Clearly most of the savings were in the tile culling, but providing the
-culling itself is done reasonably efficiently, the tstrip culling is
-still worth-while.
-
-
-Steve Baker                (817)619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
--------------------------------------
-Please visit the FGFS web page:  http://www.menet.umn.edu/~curt/fgfs/
-For help on using this list (especially unsubscribing), send a message to
-"flight-gear-request@me.umn.edu" with a single line of text: "help".
-
diff --git a/Hints/view-projection b/Hints/view-projection
deleted file mode 100644
index 15cc6b09e..000000000
--- a/Hints/view-projection
+++ /dev/null
@@ -1,86 +0,0 @@
-From fatcity!root@news.cts.com  Mon Apr 20 10:54:32 1998
-X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
-	["2073" "Mon" "20" "April" "1998" "07:50:34" "-0800" "Steve Baker" "sbaker@link.com" nil "54" "Re: How To Q: Off-screen object culling." "^From:" nil nil "4" nil nil nil nil nil]
-	nil)
-Received: from mh2.cts.com (root@mh2.cts.com [205.163.24.68])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id KAA05163
-	for ; Mon, 20 Apr 1998 10:54:29 -0500 (CDT)
-Received: from king.cts.com (root@king.cts.com [198.68.168.21]) by mh2.cts.com (8.8.7/8.8.5) with ESMTP id IAA15636; Mon, 20 Apr 1998 08:51:20 -0700 (PDT)
-Received: from donews.cts.com (root@donews.cts.com [192.188.72.21])
-	by king.cts.com (8.8.7/8.8.7) with SMTP id IAA29983;
-	Mon, 20 Apr 1998 08:51:19 -0700 (PDT)
-Received: from fatcity by donews.cts.com with uucp
-	(Smail3.1.29.1 #5) id m0yRI5D-00000Xa; Mon, 20 Apr 98 08:02 PDT
-Received: by fatcity.com (10-Feb-1998/v1.0f-b64/bab) via UUCP id 0001F042; Mon, 20 Apr 1998 07:50:34 -0800
-Message-ID: 
-X-Comment: OpenGL Game Developers Mailing List
-X-Sender: Steve Baker 
-Reply-To: OPENGL-GAMEDEV-L@fatcity.com
-Errors-To: ML-ERRORS@fatcity.com
-Organization: Fat City Network Services, San Diego, California
-X-ListServer: v1.0f, build 64; ListGuru (c) 1996-1998 Bruce A. Bergman
-Precedence: bulk
-Mime-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-Content-Transfer-Encoding: 7bit
-From: Steve Baker 
-Sender: root@fatcity.com
-To: Multiple recipients of list OPENGL-GAMEDEV-L 
-Subject: Re: How To Q: Off-screen object culling.
-Date: Mon, 20 Apr 1998 07:50:34 -0800
-
-On Sat, 18 Apr 1998, Jason Maskell wrote:
-
-> This is probably an FAQ, but I'm to the point now where I need to be
-> able to tell when one of my objects is offscreen and not even send it
-> down the pipe. This would be pretty simple if I was using glFrustum,
-> but I'm not at the moment. I could switch, but I haven't quite got my
-> head around how to get the same results as I get using glPerspective..
-> If someone can point me to some code that does some simple pre-culling,
-> I would be most grateful..  >
-
-Well, if you can do it with glFrustum then you can do it with
-gluPerspective. Note that gluPerspective simply calls glFrustum.
-
-It's like this:
-
-void APIENTRY gluPerspective( GLdouble fovy, GLdouble aspect,
-                              GLdouble zNear, GLdouble zFar )
-{
-   GLdouble xmin, xmax, ymin, ymax;
-
-   ymax = zNear * tan( fovy * M_PI / 360.0 );
-   ymin = -ymax;
-
-   xmin = ymin * aspect;
-   xmax = ymax * aspect;
-
-   glFrustum( xmin, xmax, ymin, ymax, zNear, zFar );
-}
-
-[This is actually the source code for gluPerspective from the Mesa
-library - but since it only involves regular OpenGL API, it should
-work on any OpenGL implementation]
-
-> BTW, I've bought the red book finally...
-
-Always a good move. I have yet to hear anyone who regretted it.
-
-Steve Baker                (817)619-8776 (Vox/Vox-Mail)
-Raytheon Systems Inc.      (817)619-4028 (Fax)
-Work: SBaker@link.com      http://www.hti.com
-Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
-
--- 
-Author: Steve Baker
-  INET: sbaker@link.com
-
-Fat City Network Services    -- (619) 538-5051  FAX: (619) 538-5051
-San Diego, California        -- Public Internet access / Mailing Lists
---------------------------------------------------------------------
-To REMOVE yourself from this mailing list, send an E-Mail message
-to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
-the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
-(or the name of mailing list you want to be removed from).  You may
-also send the HELP command for other information (like subscribing).
-
diff --git a/Hints/win32-time-funcs b/Hints/win32-time-funcs
deleted file mode 100644
index 7a9448309..000000000
--- a/Hints/win32-time-funcs
+++ /dev/null
@@ -1,112 +0,0 @@
-From nhv@laserplot.com  Mon Mar 16 14:16:34 1998
-X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
-	["1740" "Mon" "16" "March" "1998" "15:11:22" "-0500" "Norman Vine" "nhv@laserplot.com" "<01BD50EE.348AEBC0.nhv@laserplot.com>" "84" "RE: Today's patches" "^From:" nil nil "3" nil nil nil nil nil]
-	nil)
-Received: from mail-out-0.tiac.net (mail-out-0.tiac.net [199.0.65.247])
-	by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id OAA21951
-	for ; Mon, 16 Mar 1998 14:16:33 -0600 (CST)
-Received: from mail-out-2.tiac.net (mail-out-2.tiac.net [199.0.65.13])
-	by mail-out-0.tiac.net (8.8.8/8.8.8) with ESMTP id PAA20462
-	for ; Mon, 16 Mar 1998 15:16:26 -0500 (EST)
-	(envelope-from nhv@laserplot.com)
-Received: from nhv (p1.gw1.mashp.MA.tiac.com [206.119.240.34])
-	by mail-out-2.tiac.net (8.8.7/8.8.7) with SMTP id PAA26460
-	for ; Mon, 16 Mar 1998 15:17:02 -0500 (EST)
-	(envelope-from nhv@laserplot.com)
-Received: by localhost with Microsoft MAPI; Mon, 16 Mar 1998 15:14:25 -0500
-Message-ID: <01BD50EE.348AEBC0.nhv@laserplot.com>
-Reply-To: "nhv@laserplot.com" 
-X-Mailer: Microsoft Internet E-mail/MAPI - 8.0.0.4211
-MIME-Version: 1.0
-Content-Type: text/plain; charset="us-ascii"
-Content-Transfer-Encoding: 7bit
-From: Norman Vine 
-To: "'Curtis L. Olson'" 
-Subject: RE: Today's patches
-Date: Mon, 16 Mar 1998 15:11:22 -0500
-
-On Monday, March 16, 1998 2:31 PM, Curtis L. Olson [SMTP:curt@me.umn.edu] wrote:
-> Norm,
-> 
-> I got both your patches.  Thanks!  The first one looks good, I'll
-> forward that over to the HUD guys.
-> 
-> For the second one, could you try a little bit different fix?  It
-> seemed to work for me anyways.  Somewhere in fg_time.c you'll see the
-> following four lines:
-> 
-> #ifdef WIN32
->     int daylight;
->     long int timezone;
-> #endif /* WIN32 */
-> 
-> Could you just try moving them to the top of the file (outside of any
-> functions) so they have a "global" scope?  I put 'em right before
-> fgTimeInit().
-
-Seems to work :-)
-
-> 
-> I just did a quick test of this and I didn't see the sun jumping
-> around.  I really wish I knew how to get the real daylight savings
-> time info out of a win32 machine ...
-
-following time related stuff from CygWin headers
-
-
-
-typedef struct _TIME_ZONE_INFORMATION { 
-  LONG       Bias; 
-  WCHAR      StandardName[ 32 ]; 
-  SYSTEMTIME StandardDate; 
-  LONG       StandardBias; 
-  WCHAR      DaylightName[ 32 ]; 
-  SYSTEMTIME DaylightDate; 
-  LONG       DaylightBias; 
-} TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION; 
-
-typedef struct _SYSTEMTIME {  
-  WORD wYear; 
-  WORD wMonth; 
-  WORD wDayOfWeek; 
-  WORD wDay; 
-  WORD wHour; 
-  WORD wMinute; 
-  WORD wSecond; 
-  WORD wMilliseconds; 
-} SYSTEMTIME, *LPSYSTEMTIME; 
-
-!!!!!!!!!!!!!!!!!!!!!!
-
-
-
-DWORD
-STDCALL
-GetTimeZoneInformation(
-		       LPTIME_ZONE_INFORMATION lpTimeZoneInformation
-		       );
-
-VOID
-STDCALL
-GetSystemTime(
-	      LPSYSTEMTIME lpSystemTime
-	      );
-
-VOID
-STDCALL
-GetLocalTime(
-	     LPSYSTEMTIME lpSystemTime
-	     );
-
-
-DWORD
-STDCALL
-GetTickCount(
-	     VOID
-	     ); 
-
-See Ya
-
-Norman
-
-
diff --git a/Lib/Bucket/Makefile.am b/Lib/Bucket/Makefile.am
deleted file mode 100644
index 4551fe9b3..000000000
--- a/Lib/Bucket/Makefile.am
+++ /dev/null
@@ -1,13 +0,0 @@
-noinst_LIBRARIES = libBucket.a
-
-libBucket_a_SOURCES = newbucket.cxx newbucket.hxx
-
-# bin_PROGRAMS = testbucket
-
-# testbucket_SOURCES = testbucket.cxx
-
-# testbucket_LDADD = \
-# 	$(top_builddir)/Lib/Bucket/libBucket.a \
-# 	$(top_builddir)/Lib/Misc/libMisc.a
-
-INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib
diff --git a/Lib/Bucket/newbucket.cxx b/Lib/Bucket/newbucket.cxx
deleted file mode 100644
index 20d980b92..000000000
--- a/Lib/Bucket/newbucket.cxx
+++ /dev/null
@@ -1,155 +0,0 @@
-/**************************************************************************
- * newbucket.hxx -- new bucket routines for better world modeling
- *
- * Written by Curtis L. Olson, started February 1999.
- *
- * Copyright (C) 1999  Curtis L. Olson - curt@flightgear.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id$
- **************************************************************************/
-
-
-#ifdef HAVE_CONFIG_H
-#  include "config.h"
-#endif
-
-
-#include 
-
-#include 
-
-#include "newbucket.hxx"
-
-
-// Build the path name for this bucket
-string FGBucket::gen_base_path() const {
-    // long int index;
-    int top_lon, top_lat, main_lon, main_lat;
-    char hem, pole;
-    char raw_path[256];
-
-    top_lon = lon / 10;
-    main_lon = lon;
-    if ( (lon < 0) && (top_lon * 10 != lon) ) {
-	top_lon -= 1;
-    }
-    top_lon *= 10;
-    if ( top_lon >= 0 ) {
-	hem = 'e';
-    } else {
-	hem = 'w';
-	top_lon *= -1;
-    }
-    if ( main_lon < 0 ) {
-	main_lon *= -1;
-    }
-    
-    top_lat = lat / 10;
-    main_lat = lat;
-    if ( (lat < 0) && (top_lat * 10 != lat) ) {
-	top_lat -= 1;
-    }
-    top_lat *= 10;
-    if ( top_lat >= 0 ) {
-	pole = 'n';
-    } else {
-	pole = 's';
-	top_lat *= -1;
-    }
-    if ( main_lat < 0 ) {
-	main_lat *= -1;
-    }
-
-    sprintf(raw_path, "%c%03d%c%02d/%c%03d%c%02d", 
-	    hem, top_lon, pole, top_lat, 
-	    hem, main_lon, pole, main_lat);
-
-    FGPath path( raw_path );
-
-    return path.str();
-}
-
-
-// find the bucket which is offset by the specified tile units in the
-// X & Y direction.  We need the current lon and lat to resolve
-// ambiguities when going from a wider tile to a narrower one above or
-// below.  This assumes that we are feeding in
-FGBucket fgBucketOffset( double dlon, double dlat, int dx, int dy ) {
-    FGBucket result( dlon, dlat );
-    double clat = result.get_center_lat() + dy * FG_BUCKET_SPAN;
-
-    // walk dy units in the lat direction
-    result.set_bucket( dlon, clat );
-
-    // find the lon span for the new latitude
-    double span = bucket_span( clat );
-
-    // walk dx units in the lon direction
-    double tmp = dlon + dx * span;
-    while ( tmp < -180.0 ) {
-	tmp += 360.0;
-    }
-    while ( tmp >= 180.0 ) {
-	tmp -= 360.0;
-    }
-    result.set_bucket( tmp, clat );
-
-    return result;
-}
-
-
-// calculate the offset between two buckets
-void fgBucketDiff( const FGBucket& b1, const FGBucket& b2, int *dx, int *dy ) {
-
-    // Latitude difference
-    double c1_lat = b1.get_center_lat();
-    double c2_lat = b2.get_center_lat();
-    double diff_lat = c2_lat - c1_lat;
-
-#ifdef HAVE_RINT
-    *dy = (int)rint( diff_lat / FG_BUCKET_SPAN );
-#else
-    if ( diff_lat > 0 ) {
-	*dy = (int)( diff_lat / FG_BUCKET_SPAN + 0.5 );
-    } else {
-	*dy = (int)( diff_lat / FG_BUCKET_SPAN - 0.5 );
-    }
-#endif
-
-    // longitude difference
-    double c1_lon = b1.get_center_lon();
-    double c2_lon = b2.get_center_lon();
-    double diff_lon = c2_lon - c1_lon;
-    double span;
-    if ( bucket_span(c1_lat) <= bucket_span(c2_lat) ) {
-	span = bucket_span(c1_lat);
-    } else {
-	span = bucket_span(c2_lat);
-    }
-
-#ifdef HAVE_RINT
-    *dx = (int)rint( diff_lon / span );
-#else
-    if ( diff_lon > 0 ) {
-	*dx = (int)( diff_lon / span + 0.5 );
-    } else {
-	*dx = (int)( diff_lon / span - 0.5 );
-    }
-#endif
-}
-
-
diff --git a/Lib/Bucket/newbucket.hxx b/Lib/Bucket/newbucket.hxx
deleted file mode 100644
index c4f32e549..000000000
--- a/Lib/Bucket/newbucket.hxx
+++ /dev/null
@@ -1,351 +0,0 @@
-/**************************************************************************
- * newbucket.hxx -- new bucket routines for better world modeling
- *
- * Written by Curtis L. Olson, started February 1999.
- *
- * Copyright (C) 1999  Curtis L. Olson - curt@flightgear.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id$
- **************************************************************************/
-
-
-#ifndef _NEWBUCKET_HXX
-#define _NEWBUCKET_HXX
-
-#include 
-
-#ifdef FG_HAVE_STD_INCLUDES
-#  include 
-#  include  // sprintf()
-#  include 
-#else
-#  include 
-#  include  // sprintf()
-#  include 
-#endif
-
-// I don't understand ...  or  should be included
-// already depending on how you defined FG_HAVE_STD_INCLUDES, but I
-// can go ahead and add this -- CLO
-#ifdef __MWERKS__
-#  include  // needed fabs()
-#endif
-
-#include STL_STRING
-
-FG_USING_STD(string);
-
-#if ! defined( FG_HAVE_NATIVE_SGI_COMPILERS )
-FG_USING_STD(ostream);
-#endif
-
-#include 
-
-
-#define FG_BUCKET_SPAN      0.125   // 1/8 of a degree
-#define FG_HALF_BUCKET_SPAN 0.0625  // 1/2 of 1/8 of a degree = 1/16 = 0.0625
-
-class FGBucket;
-ostream& operator<< ( ostream&, const FGBucket& );
-bool operator== ( const FGBucket&, const FGBucket& );
-
-class FGBucket {
-
-private:
-    double cx, cy;  // centerpoint (lon, lat) in degrees of bucket
-    int lon;        // longitude index (-180 to 179)
-    int lat;        // latitude index (-90 to 89)
-    int x;          // x subdivision (0 to 7)
-    int y;          // y subdivision (0 to 7)
-
-public:
-    
-    // default constructor
-    FGBucket();
-
-    // create a bucket which would contain the specified lon/lat
-    FGBucket(const double lon, const double lat);
-
-    // create a bucket based on "long int" index
-    FGBucket(const long int bindex);
-
-    // create an impossible bucket if false
-    FGBucket(const bool is_good);
-
-    ~FGBucket();
-
-    // Set the bucket params for the specified lat and lon
-    void set_bucket( double dlon, double dlat );
-    void make_bad ( void );
-
-    // Generate the unique scenery tile index for this bucket
-    long int gen_index();
-    string gen_index_str() const;
-
-    // Build the path name for this bucket
-    string gen_base_path() const;
-
-    // return the center lon of a tile
-    double get_center_lon() const;
-
-    // return width of the tile
-    double get_width() const;
-
-    // return the center lat of a tile
-    double get_center_lat() const;
-
-    // return height of the tile
-    double get_height() const;
-
-    // Informational methods
-    inline int get_lon() const { return lon; }
-    inline int get_lat() const { return lat; }
-    inline int get_x() const { return x; }
-    inline int get_y() const { return y; }
-
-    // friends
-    friend ostream& operator<< ( ostream&, const FGBucket& );
-    friend bool operator== ( const FGBucket&, const FGBucket& );
-};
-
-
-// return the horizontal tile span factor based on latitude
-inline double bucket_span( double l ) {
-    if ( l >= 89.0 ) {
-	return 360.0;
-    } else if ( l >= 88.0 ) {
-	return 8.0;
-    } else if ( l >= 86.0 ) {
-	return 4.0;
-    } else if ( l >= 83.0 ) {
-	return 2.0;
-    } else if ( l >= 76.0 ) {
-	return 1.0;
-    } else if ( l >= 62.0 ) {
-	return 0.5;
-    } else if ( l >= 22.0 ) {
-	return 0.25;
-    } else if ( l >= -22.0 ) {
-	return 0.125;
-    } else if ( l >= -62.0 ) {
-	return 0.25;
-    } else if ( l >= -76.0 ) {
-	return 0.5;
-    } else if ( l >= -83.0 ) {
-	return 1.0;
-    } else if ( l >= -86.0 ) {
-	return 2.0;
-    } else if ( l >= -88.0 ) {
-	return 4.0;
-    } else if ( l >= -89.0 ) {
-	return 8.0;
-    } else {
-	return 360.0;
-    }
-}
-
-
-// Set the bucket params for the specified lat and lon
-inline void FGBucket::set_bucket( double dlon, double dlat ) {
-    //
-    // latitude first
-    //
-    double span = bucket_span( dlat );
-    double diff = dlon - (double)(int)dlon;
-
-    // cout << "diff = " << diff << "  span = " << span << endl;
-
-    if ( (dlon >= 0) || (fabs(diff) < FG_EPSILON) ) {
-	lon = (int)dlon;
-    } else {
-	lon = (int)dlon - 1;
-    }
-
-    // find subdivision or super lon if needed
-    if ( span < FG_EPSILON ) {
-	// polar cap
-	lon = 0;
-	x = 0;
-    } else if ( span <= 1.0 ) {
-	x = (int)((dlon - lon) / span);
-    } else {
-	if ( (dlon >= 0) || (fabs(diff) < FG_EPSILON) ) {
-	    lon = (int)( (int)(lon / span) * span);
-	} else {
-	    // cout << " lon = " << lon 
-	    //  << "  tmp = " << (int)((lon-1) / span) << endl;
-	    lon = (int)( (int)((lon + 1) / span) * span - span);
-	    if ( lon < -180 ) {
-		lon = -180;
-	    }
-	}
-	x = 0;
-    }
-
-    //
-    // then latitude
-    //
-    diff = dlat - (double)(int)dlat;
-
-    if ( (dlat >= 0) || (fabs(diff) < FG_EPSILON) ) {
-	lat = (int)dlat;
-    } else {
-	lat = (int)dlat - 1;
-    }
-    y = (int)((dlat - lat) * 8);
-}
-
-
-// default constructor
-inline FGBucket::FGBucket() {}
-
-
-// constructor for specified location
-inline FGBucket::FGBucket(const double dlon, const double dlat) {
-    set_bucket(dlon, dlat);
-}
-
-
-// create an impossible bucket if false
-inline FGBucket::FGBucket(const bool is_good) {
-    set_bucket(0.0, 0.0);
-    if ( !is_good ) {
-	lon = -1000;
-    }
-}
-    
-
-// Parse a unique scenery tile index and find the lon, lat, x, and y
-inline FGBucket::FGBucket(const long int bindex) {
-    long int index = bindex;
-
-    lon = index >> 14;
-    index -= lon << 14;
-    lon -= 180;
-    
-    lat = index >> 6;
-    index -= lat << 6;
-    lat -= 90;
-    
-    y = index >> 3;
-    index -= y << 3;
-
-    x = index;
-}
-
-
-// default destructor
-inline FGBucket::~FGBucket() {}
-
-
-// Generate the unique scenery tile index for this bucket
-// 
-// The index is constructed as follows:
-// 
-// 9 bits - to represent 360 degrees of longitude (-180 to 179)
-// 8 bits - to represent 180 degrees of latitude (-90 to 89)
-//
-// Each 1 degree by 1 degree tile is further broken down into an 8x8
-// grid.  So we also need:
-//
-// 3 bits - to represent x (0 to 7)
-// 3 bits - to represent y (0 to 7)
-
-inline long int FGBucket::gen_index() {
-    return ((lon + 180) << 14) + ((lat + 90) << 6) + (y << 3) + x;
-}
-
-inline string FGBucket::gen_index_str() const {
-    char tmp[20];
-    sprintf(tmp, "%ld", 
-	    (((long)lon + 180) << 14) + ((lat + 90) << 6) + (y << 3) + x);
-    return (string)tmp;
-}
-
-
-// return the center lon of a tile
-inline double FGBucket::get_center_lon() const {
-    double span = bucket_span( lat + y / 8.0 + FG_HALF_BUCKET_SPAN );
-
-    if ( span >= 1.0 ) {
-	return lon + span / 2.0;
-    } else {
-	return lon + x * span + span / 2.0;
-    }
-}
-
-
-// return the center lat of a tile
-inline double FGBucket::get_center_lat() const {
-    return lat + y / 8.0 + FG_HALF_BUCKET_SPAN;
-}
-
-
-// return width of the tile
-inline double FGBucket::get_width() const {
-    return bucket_span( get_center_lat() );
-}
-
-
-// return height of the tile
-inline double FGBucket::get_height() const {
-    return FG_BUCKET_SPAN;
-}
-
-
-// create an impossible bucket
-inline void FGBucket::make_bad( void ) {
-    set_bucket(0.0, 0.0);
-	lon = -1000;
-}
-    
-
-// offset a bucket struct by the specified tile units in the X & Y
-// direction
-FGBucket fgBucketOffset( double dlon, double dlat, int x, int y );
-
-
-// calculate the offset between two buckets
-void fgBucketDiff( const FGBucket& b1, const FGBucket& b2, int *dx, int *dy );
-
-
-/*
-// Given a lat/lon, fill in the local tile index array
-void fgBucketGenIdxArray(fgBUCKET *p1, fgBUCKET *tiles, int width, int height);
-*/
-
-
-inline ostream&
-operator<< ( ostream& out, const FGBucket& b )
-{
-    return out << b.lon << ":" << b.x << ", " << b.lat << ":" << b.y;
-}
-
-
-inline bool
-operator== ( const FGBucket& b1, const FGBucket& b2 )
-{
-    return ( b1.lon == b2.lon &&
-	     b1.lat == b2.lat &&
-	     b1.x == b2.x &&
-	     b1.y == b2.y );
-}
-
-
-#endif // _NEWBUCKET_HXX
-
-
diff --git a/Lib/Bucket/testbucket.cxx b/Lib/Bucket/testbucket.cxx
deleted file mode 100644
index 0ffbf5d1a..000000000
--- a/Lib/Bucket/testbucket.cxx
+++ /dev/null
@@ -1,32 +0,0 @@
-// test new bucket routines
-
-#include "newbucket.cxx"
-
-main() {
-    double lat = 21.9625;
-    double lon = -110.0 + 0.0625;
-
-    /*
-    while ( lon < 180 ) {
-	FGBucket b1( lon, lat );
-	long int index = b1.gen_index();
-	FGBucket b2( index );
-
-	cout << lon << "," << lat << "  ";
-	cout << b2 << " " << b2.get_center_lon() << "," 
-	     << b2.get_center_lat() << endl;
-
-	lon += 0.125;
-    }
-    */
-
-    FGBucket b1;
-
-    for ( int j = 2; j >= -2; j-- ) {
-	for ( int i = -2; i < 3; i++ ) {
-	    b1 = fgBucketOffset(lon, lat, i, j);
-	    cout << "(" << i << "," << j << ")" << b1 << "\t";
-	}
-	cout << endl;
-    }
-}
diff --git a/Lib/Debug/Makefile.am b/Lib/Debug/Makefile.am
deleted file mode 100644
index f45c0bde7..000000000
--- a/Lib/Debug/Makefile.am
+++ /dev/null
@@ -1,11 +0,0 @@
-EXTRA_DIST = logtest.cxx
-
-noinst_LIBRARIES = libDebug.a
-
-libDebug_a_SOURCES = \
-	debug_types.h \
-	logstream.cxx logstream.hxx
-
-#	fg_debug.c fg_debug.h \
-
-INCLUDES += -I$(top_builddir)
diff --git a/Lib/Debug/debug_types.h b/Lib/Debug/debug_types.h
deleted file mode 100644
index 8be6350c1..000000000
--- a/Lib/Debug/debug_types.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// NB: To add a dbg_class, add it here, and add it to the structure in
-// fg_debug.c
-
-typedef enum {
-    FG_NONE      = 0x00000000,
-
-    FG_TERRAIN   = 0x00000001,
-    FG_ASTRO     = 0x00000002,
-    FG_FLIGHT    = 0x00000004,
-    FG_INPUT     = 0x00000008,
-    FG_GL        = 0x00000010,
-    FG_VIEW      = 0x00000020,
-    FG_COCKPIT   = 0x00000040,
-    FG_GENERAL   = 0x00000080,
-    FG_MATH      = 0x00000100,
-    FG_EVENT     = 0x00000200,
-    FG_AIRCRAFT  = 0x00000400,
-    FG_AUTOPILOT = 0x00000800,
-    FG_SERIAL    = 0x00001000,
-    FG_CLIPPER   = 0x00002000,
-    FG_UNDEFD    = 0x00004000, // For range checking
-
-    FG_ALL     = 0xFFFFFFFF
-} fgDebugClass;
-
-
-// NB: To add a priority, add it here.
-typedef enum {
-    FG_BULK,	    // For frequent messages
-    FG_DEBUG, 	    // Less frequent debug type messages
-    FG_INFO,        // Informatory messages
-    FG_WARN,	    // Possible impending problem
-    FG_ALERT       // Very possible impending problem
-    // FG_EXIT,        // Problem (no core)
-    // FG_ABORT        // Abandon ship (core)
-} fgDebugPriority;
-
diff --git a/Lib/Debug/fg_debug.c b/Lib/Debug/fg_debug.c
deleted file mode 100644
index 24d2552f3..000000000
--- a/Lib/Debug/fg_debug.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/* -*- Mode: C++ -*-
- *
- * fg_debug.c -- Flight Gear debug utility functions
- *
- * Written by Paul Bleisch, started January 1998. 
- *
- * Copyright (C) 1998 Paul Bleisch, pbleisch@acm.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id$
- **************************************************************************/
-
-
-#include 
-#include 
-#include 
-#include 
-
-#include  // Line to command line arguments
-
-#include "fg_debug.h"
-
-
-static int             fg_DebugSem      = 1;
-fgDebugClass           fg_DebugClass    = FG_NONE;  // Need visibility for
-fgDebugPriority        fg_DebugPriority = FG_INFO; // command line processing.
-static fgDebugCallback fg_DebugCallback = NULL;
-
-FILE *fg_DebugOutput = NULL;  // Visibility needed for command line processor.
-                              // This can be set to a FILE from the command
-                              // line. If not, it will be set to stderr.
-
-/* TODO: Actually make this thing thread safe */
-#ifdef USETHREADS
-#define FG_GRABDEBUGSEM  while( --fg_DebugSem < 0 ) { fg_DebugSem++; }
-#define FG_RELEASEDEBUGSEM fg_DebugSem++;
-#else
-#define FG_GRABDEBUGSEM
-#define FG_RELEASEDEBUGSEM
-#endif
-
-/* Used for convienence initialization from env variables.
- */
-static struct {
-    char *str;
-    fgDebugClass dbg_class;
-} fg_DebugClasses[] = {
-    { "FG_NONE",      0x00000000 },
-    { "FG_TERRAIN",   0x00000001 },
-    { "FG_ASTRO",     0x00000002 },
-    { "FG_FLIGHT",    0x00000004 },
-    { "FG_INPUT",     0x00000008 },
-    { "FG_GL",        0x00000010 },
-    { "FG_VIEW",      0x00000020 },
-    { "FG_COCKPIT",   0x00000040 },
-    { "FG_GENERAL",   0x00000080 },
-    { "FG_MATH",      0x00000100 },
-    { "FG_EVENT",     0x00000200 },
-    { "FG_AIRCRAFT",  0x00000400 },
-    { "FG_AUTOPILOT", 0x00000800 },
-
-    /* Do not edit below here, last entry should be null */
-    { "FG_ALL",       0xFFFFFFFF },
-    { NULL, 0 } 
-};
-
-static fgDebugClass fgDebugStrToClass( char *str );
-
-
-/* fgInitDebug =============================================================*/
-void fgInitDebug( void ) {
-    char *pszClass, *pszPrio, *pszFile;
-
-    // Support for log file/alt debug output via command line, environment or
-    // reasonable default.
-
-    /*
-    if( strlen( logArgbuf ) > 3) {   // First check for command line option
-	// Assumed that we will append.
-	fg_DebugOutput = fopen(logArgbuf, "a+" );
-    }
-    */
-
-    if( !fg_DebugOutput ) {          // If not set on command line, environment?
-	pszFile = getenv( "FG_DEBUGFILE" );
-	if( pszFile ) {          // There is such an environmental variable.
-	    fg_DebugOutput = fopen( pszFile, "a+" );
-	}
-    }
-
-    if( !fg_DebugOutput ) {         // If neither command line nor environment
-	fg_DebugOutput = stderr;      // then we use the fallback position
-    }
-    
-    FG_GRABDEBUGSEM;
-    fg_DebugSem = fg_DebugSem;  /* shut up GCC */
-
-    // Test command line option overridge of debug priority. If the value
-    // is in range (properly optioned) the we will override both defaults
-    // and the environmental value.
-
-    /*
-    if ((priorityArgValue >= FG_BULK) && (priorityArgValue <= FG_ABORT)) {
-	fg_DebugPriority = priorityArgValue;
-    } else {  // Either not set or out of range. We will not warn the user.
-    */
-	pszPrio = getenv( "FG_DEBUGPRIORITY" );
-	if( pszPrio ) {
-	    fg_DebugPriority = atoi( pszPrio );
-	    fprintf( stderr,
-		     "fg_debug.c: Environment overrides default debug priority (%d)\n",
-		     fg_DebugPriority );
-	}
-    /* } */
-
-
-    /*
-    if ((debugArgValue >= FG_ALL) && (debugArgValue < FG_UNDEFD)) {
-	fg_DebugPriority = priorityArgValue;
-    } else {  // Either not set or out of range. We will not warn the user.
-    */
-	pszClass = getenv( "FG_DEBUGCLASS" );
-	if( pszClass ) {
-	    fg_DebugClass = fgDebugStrToClass( pszClass );
-	    fprintf( stderr,
-		     "fg_debug.c: Environment overrides default debug class (0x%08X)\n",
-		     fg_DebugClass );
-	}
-    /* } */
-
-    FG_RELEASEDEBUGSEM;
-}
-
-/* fgDebugStrToClass ======================================================*/
-fgDebugClass fgDebugStrToClass( char *str ) {
-    char *hex = "0123456789ABCDEF";
-    char *hexl = "0123456789abcdef";
-    char *pt, *p, *ph, ps = 1;
-    unsigned int val = 0, i;
-  
-    if( str == NULL ) {
-	return 0;
-    }
-
-    /* Check for 0xXXXXXX notation */
-    p = strstr( str, "0x");
-    if( p ) {
-	p++; p++;
-	while (*p) {
-	    ph = strchr(hex,*p);
-	    if ( ph ) {
- 		val <<= 4;
-		val += ph-hex;
-		p++;
-	    } else {
-		ph = strchr(hexl,*p);
-		if ( ph ) {
-		    val <<= 4;
-		    val += ph-hex;
-		    p++;
-		} else {
-		    // fprintf( stderr, "Error in hex string '%s'\n", str ); 
-		    return FG_NONE;
-		}
-	    }
-	}
-    } else {
-	/* Must be in string format */
-	p = str;
-	ps = 1;
-	while( ps ) {
-	    while( *p && (*p==' ' || *p=='\t') ) p++; /* remove whitespace */
-	    pt = p; /* mark token */
-	    while( *p && (*p!='|') ) p++; /* find OR or EOS */
-	    ps = *p; /* save value at p so we can attempt to be bounds safe */
-	    *p++ = 0; /* terminate token */
-	    /* determine value for token */
-	    i=0; 
-	    while( fg_DebugClasses[i].str && 
-		   strncmp( fg_DebugClasses[i].str, pt, 
-			    strlen(fg_DebugClasses[i].str)) ) i++;
-	    if( fg_DebugClasses[i].str == NULL ) {
-		fprintf( stderr,
-			 "fg_debug.c: Could not find message class '%s'\n",
-			 pt ); 
-	    } else {
-		val |= fg_DebugClasses[i].dbg_class;
-	    }
-	}
-    }
-    return (fgDebugClass)val;
-}
-
-
-/* fgSetDebugOutput =======================================================*/
-void fgSetDebugOutput( FILE *out ) {
-    FG_GRABDEBUGSEM;
-    fflush( fg_DebugOutput );
-    fg_DebugOutput = out;
-    FG_RELEASEDEBUGSEM;
-}
-
-
-/* fgSetDebugLevels =======================================================*/
-void fgSetDebugLevels( fgDebugClass dbg_class, fgDebugPriority prio ) {
-    FG_GRABDEBUGSEM;
-    fg_DebugClass = dbg_class;
-    fg_DebugPriority = prio;
-    FG_RELEASEDEBUGSEM;
-}
-
-
-/* fgRegisterDebugCallback ================================================*/
-fgDebugCallback fgRegisterDebugCallback( fgDebugCallback callback ) {
-    fgDebugCallback old;
-    FG_GRABDEBUGSEM;
-    old = fg_DebugCallback;
-    fg_DebugCallback = callback;
-    FG_RELEASEDEBUGSEM;
-    return old;
-}
-
-
-/* fgPrintf ===============================================================*/
-int fgPrintf( fgDebugClass dbg_class, fgDebugPriority prio, char *fmt, ... ) {
-    char szOut[1024+1];
-    va_list ap;
-    int ret = 0;
-
-    // If no action to take, then don't bother with the semaphore
-    // activity Slight speed benefit.
-
-    // printf("dbg_class = %d  fg_DebugClass = %d\n", dbg_class, fg_DebugClass);
-    // printf("prio = %d  fg_DebugPriority = %d\n", prio, fg_DebugPriority);
-
-    if( !(dbg_class & fg_DebugClass) ) {
-	// Failed to match a specific debug class
-	if ( prio < fg_DebugPriority ) {
-	    // priority is less than requested
-
-	    // "ret" is zero anyway. But we might think about changing
-	    // it upon some error condition?
-	    return ret;
-	}
-    }
-
-    FG_GRABDEBUGSEM;
-
-    /* ret = vsprintf( szOut, fmt, (&fmt+1)); (but it didn't work, thus ... */
-    va_start (ap, fmt);
-    ret = vsprintf( szOut, fmt, ap);
-    va_end (ap);
-
-    if( fg_DebugCallback!=NULL && fg_DebugCallback(dbg_class, prio, szOut) ) {
-	FG_RELEASEDEBUGSEM;
-	return ret;
-    } else {
-	fprintf( fg_DebugOutput, szOut );
-	FG_RELEASEDEBUGSEM;
-	if( prio == FG_EXIT ) {
-	    exit(0);
-	} else if( prio == FG_ABORT ) {
-	    abort();
-	}
-    }
-    return ret;  
-}
-
-
diff --git a/Lib/Debug/fg_debug.h b/Lib/Debug/fg_debug.h
deleted file mode 100644
index 2e6c490f9..000000000
--- a/Lib/Debug/fg_debug.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/* -*- Mode: C++ -*-
- *
- * fg_debug.h -- Flight Gear debug utility functions
- *
- * Written by Paul Bleisch, started January 1998. 
- *
- * Copyright (C) 1998 Paul Bleisch, pbleisch@acm.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- **************************************************************************/
-
-#error "use logstream"
-
-#ifndef _FG_DEBUG_H
-#define _FG_DEBUG_H
-
-#ifdef __cplusplus                                                          
-extern "C" {                            
-#endif                                   
-
-
-#include 
-
-/* NB: To add a dbg_class, add it here, and add it to the structure in
-   fg_debug.c */
-typedef enum {
-    FG_NONE      = 0x00000000,
-
-    FG_TERRAIN   = 0x00000001,
-    FG_ASTRO     = 0x00000002,
-    FG_FLIGHT    = 0x00000004,
-    FG_INPUT     = 0x00000008,
-    FG_GL        = 0x00000010,
-    FG_VIEW      = 0x00000020,
-    FG_COCKPIT   = 0x00000040,
-    FG_GENERAL   = 0x00000080,
-    FG_MATH      = 0x00000100,
-    FG_EVENT     = 0x00000200,
-    FG_AIRCRAFT  = 0x00000400,
-    FG_AUTOPILOT = 0x00000800,
-    FG_UNDEFD    = 0x00001000, // For range checking
-
-    FG_ALL     = 0xFFFFFFFF
-} fgDebugClass;
-
-/* NB: To add a priority, add it here. */
-typedef enum  {
-    FG_BULK,	    /* For frequent messages */
-    FG_DEBUG, 	    /* Less frequent debug type messages */
-    FG_INFO,          /* Informatory messages */
-    FG_WARN,	    /* Possible impending problem */
-    FG_ALERT,         /* Very possible impending problem */
-    FG_EXIT,          /* Problem (no core) */
-    FG_ABORT          /* Abandon ship (core) */
-} fgDebugPriority;
-
-
-/* Initialize the debuggin stuff. */
-void fgInitDebug( void );
-
-
-/* fgPrintf
-
-   Expects:
-   class      fgDebugClass mask for this message.
-   prio       fgDebugPriority of this message.
-   fmt        printf like string format
-   ...        var args for fmt
-
-   Returns:
-   number of items in fmt handled.
-
-   This function works like the standard C library function printf() with
-   the addition of message classes and priorities (see fgDebugClasses
-   and fgDebugPriorities).  These additions allow us to classify messages
-   and disable sets of messages at runtime.  Only messages with a prio
-   greater than or equal to fg_DebugPriority and in the current debug class 
-   (fg_DebugClass) are printed.
-*/
-int fgPrintf( fgDebugClass dbg_class, fgDebugPriority prio, char *fmt, ... ); 
-
-
-/* fgSetDebugLevels()
-
-   Expects:
-   dbg_class      Bitmask representing classes to display.
-   prio       Minimum priority of messages to display.
-*/
-void fgSetDebugLevels( fgDebugClass dbg_class, fgDebugPriority prio );
-
-/* fgSetDebugOutput()
-
-   Expects:
-   file       A FILE* to a stream to send messages to.  
-
-   It is assumed the file stream is open and writable.  The system
-   defaults to stderr.  The current stream is flushed but not
-   closed.
-*/
-void fgSetDebugOutput( FILE *out );
-
-
-/* fgRegisterDebugCallback
-
-   Expects:
-   callback   A function that takes parameters as defined by the 
-              fgDebugCallback type.
-
-   Returns:
-   a pointer to the previously registered callback (if any)
-  
-   Install a user defined debug log callback.   This callback is called w
-   whenever fgPrintf is called.  The parameters passed to the callback are
-   defined above by fgDebugCallback.  outstr is the string that is to be
-   printed.  If callback returns nonzero, it is assumed that the message
-   was handled fully by the callback and **fgPrintf need do no further 
-   processing of the message.**  Only one callback may be installed at a 
-   time.
-*/
-
-//typedef int (*fgDebugCallback)(fgDebugClass, fgDebugPriority, char *outstr);
-//fgDebugCallback fgRegisterDebugCallback( fgDebugCallback callback );
-
-typedef int (*fgDebugCallback)( int DebugClass, int DebugPriority, char *outstr);
-fgDebugCallback fgRegisterDebugCallback( fgDebugCallback callback );
-
-
-// Leave these alone. Access intended for fg_debug and command line processing.
-//
-extern fgDebugClass    fg_DebugClass;
-extern fgDebugPriority fg_DebugPriority;
-
-extern FILE *          fg_DebugOutput;
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* _FG_DEBUG_H */
-
diff --git a/Lib/Debug/logstream.cxx b/Lib/Debug/logstream.cxx
deleted file mode 100644
index 669406292..000000000
--- a/Lib/Debug/logstream.cxx
+++ /dev/null
@@ -1,63 +0,0 @@
-// Stream based logging mechanism.
-//
-// Written by Bernie Bright, 1998
-//
-// Copyright (C) 1998  Bernie Bright - bbright@c031.aone.net.au
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-#include "logstream.hxx"
-
-bool            logbuf::logging_enabled = true;
-fgDebugClass    logbuf::logClass        = FG_NONE;
-fgDebugPriority logbuf::logPriority     = FG_INFO;
-streambuf*      logbuf::sbuf            = NULL;
-
-logbuf::logbuf()
-{
-//     if ( sbuf == NULL )
-// 	sbuf = cerr.rdbuf();
-}
-
-logbuf::~logbuf()
-{
-    if ( sbuf )
-	    sync();
-}
-
-void
-logbuf::set_sb( streambuf* sb )
-{
-    if ( sbuf )
-	    sync();
-
-    sbuf = sb;
-}
-
-void
-logbuf::set_log_level( fgDebugClass c, fgDebugPriority p )
-{
-    logClass = c;
-    logPriority = p;
-}
-
-void
-logstream::setLogLevels( fgDebugClass c, fgDebugPriority p )
-{
-    logbuf::set_log_level( c, p );
-}
-
diff --git a/Lib/Debug/logstream.hxx b/Lib/Debug/logstream.hxx
deleted file mode 100644
index d55ff5629..000000000
--- a/Lib/Debug/logstream.hxx
+++ /dev/null
@@ -1,220 +0,0 @@
-// Stream based logging mechanism.
-//
-// Written by Bernie Bright, 1998
-//
-// Copyright (C) 1998  Bernie Bright - bbright@c031.aone.net.au
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-#ifndef _LOGSTREAM_H
-#define _LOGSTREAM_H
-
-#ifdef HAVE_CONFIG_H
-#  include 
-#endif
-
-
-#include 
-
-#ifdef FG_HAVE_STD_INCLUDES
-# include 
-# include 
-#else
-# include 
-# include "Include/fg_traits.hxx"
-#endif
-
-#include "debug_types.h"
-
-#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
-FG_USING_STD(streambuf);
-FG_USING_STD(ostream);
-FG_USING_STD(cerr);
-FG_USING_STD(endl);
-#endif
-
-#ifdef __MWERKS__
-#  define cerr std::cerr
-#  define endl std::endl
-FG_USING_STD(iostream);
-#endif
-
-//
-// TODO:
-//
-// 1. Change output destination. Done.
-// 2. Make logbuf thread safe.
-// 3. Read environment for default debugClass and debugPriority.
-//
-
-//-----------------------------------------------------------------------------
-//
-// logbuf is an output-only streambuf with the ability to disable sets of
-// messages at runtime. Only messages with priority >= logbuf::logPriority
-// and debugClass == logbuf::logClass are output.
-//
-class logbuf : public streambuf
-{
-public:
-
-#ifndef FG_HAVE_STD_INCLUDES
-    typedef char_traits           traits_type;
-    typedef char_traits::int_type int_type;
-    typedef char_traits::pos_type pos_type;
-    typedef char_traits::off_type off_type;
-#endif
-//     logbuf( streambuf* sb ) : sbuf(sb) {}
-    logbuf();
-    ~logbuf();
-
-    // Is logging enabled?
-    bool enabled() { return logging_enabled; }
-
-    // Set the logging level of subsequent messages.
-    void set_log_state( fgDebugClass c, fgDebugPriority p );
-
-    // Set the global logging level.
-    static void set_log_level( fgDebugClass c, fgDebugPriority p );
-
-    //
-    void set_sb( streambuf* sb );
-
-protected:
-
-    inline virtual int sync();
-    int_type overflow( int ch );
-//     int xsputn( const char* s, istreamsize n );
-
-private:
-
-    // The streambuf used for actual output. Defaults to cerr.rdbuf().
-    static streambuf* sbuf;
-
-    static bool logging_enabled;
-    static fgDebugClass logClass;
-    static fgDebugPriority logPriority;
-
-private:
-
-    // Not defined.
-    logbuf( const logbuf& );
-    void operator= ( const logbuf& );
-};
-
-inline int
-logbuf::sync()
-{
-#ifdef FG_HAVE_STD_INCLUDES
-	return sbuf->pubsync();
-#else
-	return sbuf->sync();
-#endif
-}
-
-inline void
-logbuf::set_log_state( fgDebugClass c, fgDebugPriority p )
-{
-    logging_enabled = ((c & logClass) != 0 && p >= logPriority);
-}
-
-inline logbuf::int_type
-logbuf::overflow( int c )
-{
-    return logging_enabled ? sbuf->sputc(c) : (EOF == 0 ? 1: 0);
-}
-
-//-----------------------------------------------------------------------------
-//
-// logstream manipulator for setting the log level of a message.
-//
-struct loglevel
-{
-    loglevel( fgDebugClass c, fgDebugPriority p )
-	: logClass(c), logPriority(p) {}
-
-    fgDebugClass logClass;
-    fgDebugPriority logPriority;
-};
-
-//-----------------------------------------------------------------------------
-//
-// A helper class that ensures a streambuf and ostream are constructed and
-// destroyed in the correct order.  The streambuf must be created before the
-// ostream but bases are constructed before members.  Thus, making this class
-// a private base of logstream, declared to the left of ostream, we ensure the
-// correct order of construction and destruction.
-//
-struct logstream_base
-{
-//     logstream_base( streambuf* sb ) : lbuf(sb) {}
-    logstream_base() {}
-
-    logbuf lbuf;
-};
-
-//-----------------------------------------------------------------------------
-//
-// 
-//
-class logstream : private logstream_base, public ostream
-{
-public:
-    // The default is to send messages to cerr.
-    logstream( ostream& out )
-// 	: logstream_base(out.rdbuf()),
-	: logstream_base(),
-	  ostream(&lbuf) { lbuf.set_sb(out.rdbuf());}
-
-    void set_output( ostream& out ) { lbuf.set_sb( out.rdbuf() ); }
-
-    // Set the global log class and priority level.
-     void setLogLevels( fgDebugClass c, fgDebugPriority p );
-
-    // Output operator to capture the debug level and priority of a message.
-    inline ostream& operator<< ( const loglevel& l );
-};
-
-inline ostream&
-logstream::operator<< ( const loglevel& l )
-{
-    lbuf.set_log_state( l.logClass, l.logPriority );
-    return *this;
-}
-
-//-----------------------------------------------------------------------------
-//
-// Return the one and only logstream instance.
-// We use a function instead of a global object so we are assured that cerr
-// has been initialised.
-//
-inline logstream&
-fglog()
-{
-    static logstream logstrm( cerr );
-    return logstrm;
-}
-
-#ifdef FG_NDEBUG
-# define FG_LOG(C,P,M)
-#elif defined( __MWERKS__ )
-# define FG_LOG(C,P,M) ::fglog() << ::loglevel(C,P) << M << std::endl
-#else
-# define FG_LOG(C,P,M) fglog() << loglevel(C,P) << M << endl
-#endif
-
-#endif // _LOGSTREAM_H
-
diff --git a/Lib/Debug/logtest.cxx b/Lib/Debug/logtest.cxx
deleted file mode 100644
index b02c6b086..000000000
--- a/Lib/Debug/logtest.cxx
+++ /dev/null
@@ -1,34 +0,0 @@
-#include 
-#include "Debug/logstream.hxx"
-
-int
-main( int argc, char* argv[] )
-{
-    fglog().setLogLevels( FG_ALL, FG_INFO );
-
-    FG_LOG( FG_TERRAIN, FG_BULK,  "terrain::bulk" ); // shouldnt appear
-    FG_LOG( FG_TERRAIN, FG_DEBUG, "terrain::debug" ); // shouldnt appear
-    FG_LOG( FG_TERRAIN, FG_INFO,  "terrain::info" );
-    FG_LOG( FG_TERRAIN, FG_WARN,  "terrain::warn" );
-    FG_LOG( FG_TERRAIN, FG_ALERT, "terrain::alert" );
-
-    int i = 12345;
-    long l = 54321L;
-    double d = 3.14159;
-    string s = "Hello world!";
-
-    FG_LOG( FG_EVENT, FG_INFO, "event::info "
-				 << "i=" << i
-				 << ", l=" << l
-				 << ", d=" << d
-	                         << ", d*l=" << d*l
-				 << ", s=\"" << s << "\"" );
-
-    // This shouldn't appear in log output:
-    FG_LOG( FG_EVENT, FG_DEBUG, "event::debug "
-	    << "- this should be seen - "
-	    << "d=" << d
-	    << ", s=\"" << s << "\"" );
-
-    return 0;
-}
diff --git a/Lib/Makefile.am b/Lib/Makefile.am
deleted file mode 100644
index 840df71f1..000000000
--- a/Lib/Makefile.am
+++ /dev/null
@@ -1,14 +0,0 @@
-if ENABLE_UNIX_SERIAL
-SERIAL_DIRS = Serial
-else
-SERIAL_DIRS =
-endif
-
-SUBDIRS = \
-	Bucket \
-	Debug \
-	Math \
-	Misc \
-	$(SERIAL_DIRS) \
-	XGL\
-	zlib
diff --git a/Lib/Math/MAT3geom.c b/Lib/Math/MAT3geom.c
deleted file mode 100644
index 93e754b12..000000000
--- a/Lib/Math/MAT3geom.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* #include "HEADERS.h" */
-/* Copyright 1988, Brown Computer Graphics Group.  All Rights Reserved. */
-
-/* --------------------------------------------------------------------------
- * This file contains routines that perform geometry-related operations
- * on matrices.
- * -------------------------------------------------------------------------*/
-
-#include 
-
-/* --------------------------  Static Routines	---------------------------- */
-
-/* -------------------------  Internal Routines  --------------------------- */
-
-/* --------------------------  Public Routines	---------------------------- */
-
-/*
- * This takes a matrix used to transform points, and returns a corresponding
- * matrix that can be used to transform direction vectors (between points).
- */
-
-void
-MAT3direction_matrix(register double (*result_mat)[4], register double (*mat)[4])
-{
-   register int i;
-
-   MAT3copy(result_mat, mat);
-
-   for (i = 0; i < 4; i++) result_mat[i][3] = result_mat[3][i] = 0.0;
-
-   result_mat[3][3] = 1.0;
-}
-
-/*
- * This takes a matrix used to transform points, and returns a corresponding
- * matrix that can be used to transform vectors that must remain perpendicular
- * to planes defined by the points.  It is useful when you are transforming
- * some object that has both points and normals in its definition, and you
- * only have the transformation matrix for the points.	This routine returns
- * FALSE if the normal matrix is uncomputable.	Otherwise, it returns TRUE.
- *
- * Spike sez: "This is the adjoint for the non-homogeneous part of the
- *	       transformation."
- */
-
-int
-MAT3normal_matrix(register double (*result_mat)[4], register double (*mat)[4])
-{
-   register int ret;
-   MAT3mat	tmp_mat;
-
-   MAT3direction_matrix(result_mat, mat);
-
-   if ( (ret = MAT3invert(tmp_mat, tmp_mat)) ) {
-       MAT3transpose(result_mat, tmp_mat);
-   }
-
-   return(ret);
-}
-
-/*
- * Sets the given matrix to be a scale matrix for the given vector of
- * scale values.
- */
-
-void
-MAT3scale(double (*result_mat)[4], double *scale)
-{
-   MAT3identity(result_mat);
-
-   result_mat[0][0] = scale[0];
-   result_mat[1][1] = scale[1];
-   result_mat[2][2] = scale[2];
-}
-
-/*
- * Sets up a matrix for a rotation about an axis given by the line from
- * (0,0,0) to axis, through an angle (in radians).
- * Looking along the axis toward the origin, the rotation is counter-clockwise.
- */
-
-#define SELECT	.7071	/* selection constant (roughly .5*sqrt(2) */
-
-void
-MAT3rotate(double (*result_mat)[4], double *axis, double angle_in_radians)
-{
-   MAT3vec	naxis,	/* Axis of rotation, normalized 		*/
-		base2,	/* 2nd unit basis vec, perp to axis		*/
-		base3;	/* 3rd unit basis vec, perp to axis & base2	*/
-   double	dot;
-   MAT3mat	base_mat,	/* Change-of-basis matrix		*/
-		base_mat_trans; /* Inverse of c-o-b matrix		*/
-   register int i;
-
-   /* Step 1: extend { axis } to a basis for 3-space: { axis, base2, base3 }
-    * which is orthonormal (all three have unit length, and all three are
-    * mutually orthogonal). Also should be oriented, i.e. axis cross base2 =
-    * base3, rather than -base3.
-    *
-    * Method: Find a vector linearly independent from axis. For this we
-    * either use the y-axis, or, if that is too close to axis, the
-    * z-axis. 'Too close' means that the dot product is too near to 1.
-    */
-
-   MAT3_COPY_VEC(naxis, axis);
-   MAT3_NORMALIZE_VEC(naxis, dot);
-
-   if (dot == 0.0) {
-       /* ERR_ERROR(MAT3_errid, ERR_SEVERE,
-		   (ERR_S, "Zero-length axis vector given to MAT3rotate")); */
-      return;
-   }
-
-   MAT3perp_vec(base2, naxis, TRUE);
-   MAT3cross_product(base3, naxis, base2);
-
-   /* Set up the change-of-basis matrix, and its inverse */
-   MAT3identity(base_mat);
-   MAT3identity(base_mat_trans);
-   MAT3identity(result_mat);
-
-   for (i = 0; i < 3; i++){
-      base_mat_trans[i][0] = base_mat[0][i] = naxis[i];
-      base_mat_trans[i][1] = base_mat[1][i] = base2[i];
-      base_mat_trans[i][2] = base_mat[2][i] = base3[i];
-   }
-
-   /* If T(u) = uR, where R is base_mat, then T(x-axis) = naxis,
-    * T(y-axis) = base2, and T(z-axis) = base3. The inverse of base_mat is
-    * its transpose.  OK?
-    */
-
-   result_mat[1][1] =	result_mat[2][2] = cos(angle_in_radians);
-   result_mat[2][1] = -(result_mat[1][2] = sin(angle_in_radians));
-
-   MAT3mult(result_mat, base_mat_trans, result_mat);
-   MAT3mult(result_mat, result_mat,	base_mat);
-}
-
-/*
- * Sets the given matrix to be a translation matrix for the given vector of
- * translation values.
- */
-
-void
-MAT3translate(double (*result_mat)[4], double *trans)
-{
-   MAT3identity(result_mat);
-
-   result_mat[3][0] = trans[0];
-   result_mat[3][1] = trans[1];
-   result_mat[3][2] = trans[2];
-}
-
-/*
- * Sets the given matrix to be a shear matrix for the given x and y shear
- * values.
- */
-
-void
-MAT3shear(double (*result_mat)[4], double xshear, double yshear)
-{
-   MAT3identity(result_mat);
-
-   result_mat[2][0] = xshear;
-   result_mat[2][1] = yshear;
-}
-
diff --git a/Lib/Math/MAT3inv.c b/Lib/Math/MAT3inv.c
deleted file mode 100644
index 874b2f3b0..000000000
--- a/Lib/Math/MAT3inv.c
+++ /dev/null
@@ -1,311 +0,0 @@
-/* Copyright 1988, Brown Computer Graphics Group.  All Rights Reserved. */
-
-/* --------------------------------------------------------------------------
- * This file contains routines that operate solely on matrices.
- * -------------------------------------------------------------------------*/
-
-#include 
-
-/* --------------------------  Static Routines	---------------------------- */
-
-#define SMALL 1e-20		/* Small enough to be considered zero */
-
-/*
- * Shuffles rows in inverse of 3x3.  See comment in MAT3_inv3_second_col().
- */
-
-static void
-MAT3_inv3_swap( register double inv[3][3], int row0, int row1, int row2)
-{
-   register int i, tempi;
-   double	temp;
-
-#define SWAP_ROWS(a, b) \
-   for (i = 0; i < 3; i++) SWAP(inv[a][i], inv[b][i], temp); \
-   SWAP(a, b, tempi)
-
-   if (row0 != 0){
-      if (row1 == 0) {
-	 SWAP_ROWS(row0, row1);
-      }
-      else {
-	 SWAP_ROWS(row0, row2);
-      }
-   }
-
-   if (row1 != 1) {
-      SWAP_ROWS(row1, row2);
-   }
-}
-
-/*
- * Does Gaussian elimination on second column.
- */
-
-static int
-MAT3_inv3_second_col (register double source[3][3], register double inv[3][3], int row0)
-{
-   register int row1, row2, i1, i2, i;
-   double	temp;
-   double	a, b;
-
-   /* Find which row to use */
-   if	   (row0 == 0)	i1 = 1, i2 = 2;
-   else if (row0 == 1)	i1 = 0, i2 = 2;
-   else 		i1 = 0, i2 = 1;
-
-   /* Find which is larger in abs. val.:the entry in [i1][1] or [i2][1]	*/
-   /* and use that value for pivoting.					*/
-
-   a = source[i1][1]; if (a < 0) a = -a;
-   b = source[i2][1]; if (b < 0) b = -b;
-   if (a > b) 	row1 = i1;
-   else		row1 = i2;
-   row2 = (row1 == i1 ? i2 : i1);
-
-   /* Scale row1 in source */
-   if ((source[row1][1] < SMALL) && (source[row1][1] > -SMALL)) return(FALSE);
-   temp = 1.0 / source[row1][1];
-   source[row1][1]  = 1.0;
-   source[row1][2] *= temp;	/* source[row1][0] is zero already */
-
-   /* Scale row1 in inv */
-   inv[row1][row1]  = temp;	/* it used to be a 1.0 */
-   inv[row1][row0] *= temp;
-
-   /* Clear column one, source, and make corresponding changes in inv */
-
-   for (i = 0; i < 3; i++) if (i != row1) {	/* for i = all rows but row1 */
-   temp = -source[i][1];
-      source[i][1]  = 0.0;
-      source[i][2] += temp * source[row1][2];
-
-      inv[i][row1]  = temp * inv[row1][row1];
-      inv[i][row0] += temp * inv[row1][row0];
-   }
-
-   /* Scale row2 in source */
-   if ((source[row2][2] < SMALL) && (source[row2][2] > -SMALL)) return(FALSE);
-   temp = 1.0 / source[row2][2];
-   source[row2][2] = 1.0;	/* source[row2][*] is zero already */
-
-   /* Scale row2 in inv */
-   inv[row2][row2]  = temp;	/* it used to be a 1.0 */
-   inv[row2][row0] *= temp;
-   inv[row2][row1] *= temp;
-
-   /* Clear column one, source, and make corresponding changes in inv */
-   for (i = 0; i < 3; i++) if (i != row2) {	/* for i = all rows but row2 */
-   temp = -source[i][2];
-      source[i][2] = 0.0;
-      inv[i][row0] += temp * inv[row2][row0];
-      inv[i][row1] += temp * inv[row2][row1];
-      inv[i][row2] += temp * inv[row2][row2];
-   }
-
-   /*
-    * Now all is done except that the inverse needs to have its rows shuffled.
-    * row0 needs to be moved to inv[0][*], row1 to inv[1][*], etc.
-    *
-    * We *didn't* do the swapping before the elimination so that we could more
-    * easily keep track of what ops are needed to be done in the inverse.
-    */
-   MAT3_inv3_swap(inv, row0, row1, row2);
-
-   return(TRUE);
-}
-
-/*
- * Fast inversion routine for 3 x 3 matrices.	- Written by jfh.
- *
- * This takes 30 multiplies/divides, as opposed to 39 for Cramer's Rule.
- * The algorithm consists of performing fast gaussian elimination, by never
- * doing any operations where the result is guaranteed to be zero, or where
- * one operand is guaranteed to be zero. This is done at the cost of clarity,
- * alas.
- *
- * Returns 1 if the inverse was successful, 0 if it failed.
- */
-
-static int
-MAT3_invert3 (register double source[3][3], register double inv[3][3])
-{
-   register int i, row0;
-   double	temp;
-   double	a, b, c;
-
-   inv[0][0] = inv[1][1] = inv[2][2] = 1.0;
-   inv[0][1] = inv[0][2] = inv[1][0] = inv[1][2] = inv[2][0] = inv[2][1] = 0.0;
-
-   /* attempt to find the largest entry in first column to use as pivot */
-   a = source[0][0]; if (a < 0) a = -a;
-   b = source[1][0]; if (b < 0) b = -b;
-   c = source[2][0]; if (c < 0) c = -c;
-
-   if (a > b) {
-      if (a > c) row0 = 0;
-      else row0 = 2;
-   }
-   else { 
-      if (b > c) row0 = 1;
-      else row0 = 2;
-   }
-
-   /* Scale row0 of source */
-   if ((source[row0][0] < SMALL) && (source[row0][0] > -SMALL)) return(FALSE);
-   temp = 1.0 / source[row0][0];
-   source[row0][0]  = 1.0;
-   source[row0][1] *= temp;
-   source[row0][2] *= temp;
-
-   /* Scale row0 of inverse */
-   inv[row0][row0] = temp;	/* other entries are zero -- no effort	*/
-
-   /* Clear column zero of source, and make corresponding changes in inverse */
-
-   for (i = 0; i < 3; i++) if (i != row0) {	/* for i = all rows but row0 */
-      temp = -source[i][0];
-      source[i][0]  = 0.0;
-      source[i][1] += temp * source[row0][1];
-      source[i][2] += temp * source[row0][2];
-      inv[i][row0]  = temp * inv[row0][row0];
-   }
-
-   /*
-    * We've now done gaussian elimination so that the source and
-    * inverse look like this:
-    *
-    *	1 * *		* 0 0
-    *	0 * *		* 1 0
-    *	0 * *		* 0 1
-    *
-    * We now proceed to do elimination on the second column.
-    */
-   if (! MAT3_inv3_second_col(source, inv, row0)) return(FALSE);
-
-   return(TRUE);
-}
-
-/*
- * Finds a new pivot for a non-simple 4x4.  See comments in MAT3invert().
- */
-
-static int
-MAT3_inv4_pivot (register MAT3mat src, MAT3vec r, double *s, int *swap)
-{
-   register int i, j;
-   double	temp, max;
-
-   *swap = -1;
-
-   if (MAT3_IS_ZERO(src[3][3])) {
-
-      /* Look for a different pivot element: one with largest abs value */
-      max = 0.0;
-
-      for (i = 0; i < 4; i++) {
-	 if	 (src[i][3] >  max) max =  src[*swap = i][3];
-	 else if (src[i][3] < -max) max = -src[*swap = i][3];
-      }
-
-      /* No pivot element available ! */
-      if (*swap < 0) return(FALSE);
-
-      else for (j = 0; j < 4; j++) SWAP(src[*swap][j], src[3][j], temp);
-   }
-
-   MAT3_SET_VEC (r, -src[0][3], -src[1][3], -src[2][3]);
-
-   *s = 1.0 / src[3][3];
-
-   src[0][3] = src[1][3] = src[2][3] = 0.0;
-   src[3][3]			     = 1.0;
-
-   MAT3_SCALE_VEC(src[3], src[3], *s);
-
-   for (i = 0; i < 3; i++) {
-      src[0][i] += r[0] * src[3][i];
-      src[1][i] += r[1] * src[3][i];
-      src[2][i] += r[2] * src[3][i];
-   }
-
-   return(TRUE);
-}
-
-/* -------------------------  Internal Routines  --------------------------- */
-
-/* --------------------------  Public Routines	---------------------------- */
-
-/*
- * This returns the inverse of the given matrix.  The result matrix
- * may be the same as the one to invert.
- *
- * Fast inversion routine for 4 x 4 matrices, written by jfh.
- *
- * Returns 1 if the inverse was successful, 0 if it failed.
- *
- * This routine has been specially tweaked to notice the following:
- * If the matrix has the form
- *	  * * * 0
- *	  * * * 0
- *	  * * * 0
- *	  * * * 1
- *
- * (as do many matrices in graphics), then we compute the inverse of
- * the upper left 3x3 matrix and use this to find the general inverse.
- *
- *   In the event that the right column is not 0-0-0-1, we do gaussian
- * elimination to make it so, then use the 3x3 inverse, and then do
- * our gaussian elimination.
- */
-
-int
-MAT3invert(double (*result_mat)[4], double (*mat)[4])
-{
-   MAT3mat		src, inv;
-   register int 	i, j, simple;
-   double		m[3][3], inv3[3][3], s, temp;
-   MAT3vec		r, t;
-   int			swap;
-
-   MAT3copy(src, mat);
-   MAT3identity(inv);
-
-   /* If last column is not (0,0,0,1), use special code */
-   simple = (mat[0][3] == 0.0 && mat[1][3] == 0.0 &&
-	     mat[2][3] == 0.0 && mat[3][3] == 1.0);
-
-   if (! simple && ! MAT3_inv4_pivot(src, r, &s, &swap)) return(FALSE);
-
-   MAT3_COPY_VEC(t, src[3]);	/* Translation vector */
-
-   /* Copy upper-left 3x3 matrix */
-   for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) m[i][j] = src[i][j];
-
-   if (! MAT3_invert3(m, inv3)) return(FALSE);
-
-   for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) inv[i][j] = inv3[i][j];
-
-   for (i = 0; i < 3; i++) for (j = 0; j < 3; j++)
-      inv[3][i] -= t[j] * inv3[j][i];
-
-   if (! simple) {
-
-      /* We still have to undo our gaussian elimination from earlier on */
-      /* add r0 * first col to last col */
-      /* add r1 * 2nd	col to last col */
-      /* add r2 * 3rd	col to last col */
-
-      for (i = 0; i < 4; i++) {
-	 inv[i][3] += r[0] * inv[i][0] + r[1] * inv[i][1] + r[2] * inv[i][2];
-	 inv[i][3] *= s;
-      }
-
-      if (swap >= 0)
-	 for (i = 0; i < 4; i++) SWAP(inv[i][swap], inv[i][3], temp);
-   }
-
-   MAT3copy(result_mat, inv);
-
-   return(TRUE);
-}
diff --git a/Lib/Math/MAT3mat.c b/Lib/Math/MAT3mat.c
deleted file mode 100644
index 2054f7731..000000000
--- a/Lib/Math/MAT3mat.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/* #include "HEADERS.h" */
-/* Copyright 1988, Brown Computer Graphics Group.  All Rights Reserved. */
-
-/* --------------------------------------------------------------------------
- * This file contains routines that operate solely on matrices.
- * -------------------------------------------------------------------------*/
-
-
-#ifdef HAVE_CONFIG_H
-#  include 
-#endif
-
-#ifdef WIN32
-#  ifndef HAVE_STL_SGI_PORT
-#    ifdef __BORLANDC__
-#      include 
-#    else
-#      include       /* required for memset() and memcpy() */
-#    endif
-#  endif
-#endif
-
-#include 
-#include 
-
-MAT3mat identityMatrix = {
-    { 1.0, 0.0, 0.0, 0.0 },
-    { 0.0, 1.0, 0.0, 0.0 },
-    { 0.0, 0.0, 1.0, 0.0 },
-    { 0.0, 0.0, 0.0, 1.0 }
-};
-
-/* #include "macros.h" */
-
-/* --------------------------  Static Routines	---------------------------- */
-
-/* -------------------------  Internal Routines  --------------------------- */
-
-/* --------------------------  Public Routines	---------------------------- */
-
-
-#if !defined( USE_XTRA_MAT3_INLINES )
-
-/*
- * This multiplies two matrices, producing a third, which may the same as
- * either of the first two.
- */
-
-void
-MAT3mult (double (*result_mat)[4], register double (*mat1)[4], register double (*mat2)[4])
-{
-   register int i, j;
-   MAT3mat	tmp_mat;
-
-   for (i = 0; i < 4; i++)
-      for (j = 0; j < 4; j++)
-         tmp_mat[i][j] = (mat1[i][0] * mat2[0][j] +
-		       mat1[i][1] * mat2[1][j] +
-		       mat1[i][2] * mat2[2][j] +
-		       mat1[i][3] * mat2[3][j]);
-   MAT3copy (result_mat, tmp_mat);
-}
-#endif // !defined( USE_XTRA_MAT3_INLINES )
-
-/*
- * This returns the transpose of a matrix.  The result matrix may be
- * the same as the one to transpose.
- */
-
-void
-MAT3transpose (double (*result_mat)[4], register double (*mat)[4])
-{
-   register int i, j;
-   MAT3mat	tmp_mat;
-
-   for (i = 0; i < 4; i++) 
-      for (j = 0; j < 4; j++) 
-         tmp_mat[i][j] = mat[j][i];
-
-   MAT3copy (result_mat, tmp_mat);
-}
-
-
-/*
- * This prints the given matrix to the given file pointer.
- */
-
-void
-MAT3print(double (*mat)[4], FILE *fp)
-{
-   MAT3print_formatted(mat, fp, CNULL, CNULL, CNULL, CNULL);
-}
-
-/*
- * This prints the given matrix to the given file pointer.
- * use the format string to pass to fprintf.  head and tail
- * are printed at the beginning and end of each line.
- */
-
-void
-MAT3print_formatted(double (*mat)[4], FILE *fp, char *title, char *head, char *format, char *tail)
-{
-   register int i, j;
-
-   /* This is to allow this to be called easily from a debugger */
-   if (fp == NULL) fp = stderr;
-
-   if (title  == NULL)	title  = "MAT3 matrix:\n";
-   if (head   == NULL)	head   = "  ";
-   if (format == NULL)	format = "%#8.4lf  ";
-   if (tail   == NULL)	tail   = "\n";
-
-   (void) fprintf(fp, title);
-
-   for (i = 0; i < 4; i++) {
-      (void) fprintf(fp, head);
-      for (j = 0; j < 4; j++) (void) fprintf(fp, format, mat[i][j]);
-      (void) fprintf(fp, tail);
-   }
-}
diff --git a/Lib/Math/MAT3vec.c b/Lib/Math/MAT3vec.c
deleted file mode 100644
index d760add5f..000000000
--- a/Lib/Math/MAT3vec.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* Copyright 1988, Brown Computer Graphics Group.  All Rights Reserved. */
-
-/* --------------------------------------------------------------------------
- * This file contains routines that operate on matrices and vectors, or
- * vectors and vectors.
- * -------------------------------------------------------------------------*/
-
-/* #include "sphigslocal.h" */
-
-/* --------------------------  Static Routines	---------------------------- */
-
-/* -------------------------  Internal Routines  --------------------------- */
-
-/* --------------------------  Public Routines	---------------------------- */
-
-/*
- * Multiplies a vector by a matrix, setting the result vector.
- * It assumes all homogeneous coordinates are 1.
- * The two vectors involved may be the same.
- */
-
-#include 
-
-#ifndef TRUE
-#  define TRUE 1
-#endif
-
-#ifndef FALSE
-#  define FALSE 0
-#endif
-
-#if !defined( USE_XTRA_MAT3_INLINES )
-
-void
-MAT3mult_vec(double *result_vec, register double *vec, register double (*mat)[4])
-{
-   MAT3vec		tempvec;
-   register double	*temp = tempvec;
-
-   temp[0] =	vec[0] * mat[0][0] + vec[1] * mat[1][0] +
-		vec[2] * mat[2][0] +	      mat[3][0];
-   temp[1] =	vec[0] * mat[0][1] + vec[1] * mat[1][1] +
-		vec[2] * mat[2][1] +	      mat[3][1];
-   temp[2] =	vec[0] * mat[0][2] + vec[1] * mat[1][2] +
-		vec[2] * mat[2][2] +	      mat[3][2];
-
-   MAT3_COPY_VEC(result_vec, temp);
-}
-#endif // !defined( USE_XTRA_MAT3_INLINES )
-
-/*
- * Multiplies a vector of size 4 by a matrix, setting the result vector.
- * The fourth element of the vector is the homogeneous coordinate, which
- * may or may not be 1.  If the "normalize" parameter is TRUE, then the
- * result vector will be normalized so that the homogeneous coordinate is 1.
- * The two vectors involved may be the same.
- * This returns zero if the vector was to be normalized, but couldn't be.
- */
-
-int
-MAT3mult_hvec(double *result_vec, register double *vec, register double (*mat)[4], int normalize)
-{
-   MAT3hvec             tempvec;
-   double		norm_fac;
-   register double	*temp = tempvec;
-   register int 	ret = TRUE;
-
-   temp[0] =	vec[0] * mat[0][0] + vec[1] * mat[1][0] +
-		vec[2] * mat[2][0] + vec[3] * mat[3][0];
-   temp[1] =	vec[0] * mat[0][1] + vec[1] * mat[1][1] +
-		vec[2] * mat[2][1] + vec[3] * mat[3][1];
-   temp[2] =	vec[0] * mat[0][2] + vec[1] * mat[1][2] +
-		vec[2] * mat[2][2] + vec[3] * mat[3][2];
-   temp[3] =	vec[0] * mat[0][3] + vec[1] * mat[1][3] +
-		vec[2] * mat[2][3] + vec[3] * mat[3][3];
-
-   /* Normalize if asked for, possible, and necessary */
-   if (normalize) {
-      if (MAT3_IS_ZERO(temp[3])) {
-#ifndef THINK_C
-	 fprintf (stderr,
-		  "Can't normalize vector: homogeneous coordinate is 0");
-#endif
-	 ret = FALSE;
-      }
-      else {
-	 norm_fac = 1.0 / temp[3];
-	 MAT3_SCALE_VEC(result_vec, temp, norm_fac);
-	 result_vec[3] = 1.0;
-      }
-   }
-   else MAT3_COPY_HVEC(result_vec, temp);
-
-   return(ret);
-}
-
-#if !defined( USE_XTRA_MAT3_INLINES )
-
-/*
- * Sets the first vector to be the cross-product of the last two vectors.
- */
-
-void
-MAT3cross_product(double *result_vec, register double *vec1, register double *vec2)
-{
-   MAT3vec		tempvec;
-   register double	*temp = tempvec;
-
-   temp[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1];
-   temp[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2];
-   temp[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0];
-
-   MAT3_COPY_VEC(result_vec, temp);
-}
-#endif // !defined( USE_XTRA_MAT3_INLINES )
-
-/*
- * Finds a vector perpendicular to vec and stores it in result_vec.
- * Method:  take any vector (we use <0,1,0>) and subtract the
- * portion of it pointing in the vec direction.  This doesn't
- * work if vec IS <0,1,0> or is very near it.  So if this is
- * the case, use <0,0,1> instead.
- * If "is_unit" is TRUE, the given vector is assumed to be unit length.
- */
-
-#define SELECT	.7071	/* selection constant (roughly .5*sqrt(2) */
-
-void
-MAT3perp_vec(double *result_vec, double *vec, int is_unit)
-{
-   MAT3vec	norm;
-   double	dot;
-
-   MAT3_SET_VEC(result_vec, 0.0, 1.0, 0.0);
-
-   MAT3_COPY_VEC(norm, vec);
-
-   if (! is_unit) MAT3_NORMALIZE_VEC(norm, dot);
-
-   /* See if vector is too close to <0,1,0>.  If so, use <0,0,1> */
-   if ((dot = MAT3_DOT_PRODUCT(norm, result_vec)) > SELECT || dot < -SELECT) {
-      result_vec[1] = 0.0;
-      result_vec[2] = 1.0;
-      dot = MAT3_DOT_PRODUCT(norm, result_vec);
-   }
-
-   /* Subtract off non-perpendicular part */
-   result_vec[0] -= dot * norm[0];
-   result_vec[1] -= dot * norm[1];
-   result_vec[2] -= dot * norm[2];
-
-   /* Make result unit length */
-   MAT3_NORMALIZE_VEC(result_vec, dot);
-}
diff --git a/Lib/Math/Makefile.am b/Lib/Math/Makefile.am
deleted file mode 100644
index eda2bc005..000000000
--- a/Lib/Math/Makefile.am
+++ /dev/null
@@ -1,17 +0,0 @@
-noinst_LIBRARIES = libMath.a
-
-libMath_a_SOURCES = \
-	MAT3geom.c \
-	MAT3inv.c \
-	MAT3mat.c \
-	MAT3vec.c \
-	fg_geodesy.cxx fg_geodesy.hxx \
-	fg_random.c fg_random.h \
-	interpolater.cxx interpolater.hxx \
-	leastsqs.cxx leastsqs.hxx \
-	mat3.h mat3defs.h mat3err.h \
-	point3d.hxx \
-	polar3d.cxx polar3d.hxx \
-	vector.cxx vector.hxx
-
-INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib -I$(top_builddir)/Simulator
diff --git a/Lib/Math/fg_geodesy.cxx b/Lib/Math/fg_geodesy.cxx
deleted file mode 100644
index 2b426502c..000000000
--- a/Lib/Math/fg_geodesy.cxx
+++ /dev/null
@@ -1,211 +0,0 @@
-// fg_geodesy.cxx -- routines to convert between geodetic and geocentric 
-//                   coordinate systems.
-//
-// Copied and adapted directly from LaRCsim/ls_geodesy.c
-//
-// See below for the complete original LaRCsim comments.
-//
-// $Id$
-
-#include "Include/compiler.h"
-#ifdef FG_HAVE_STD_INCLUDES
-# include 
-# include 
-#else
-# include 
-# include 
-#endif
-
-#include 
-#include 
-#include 
-#include 
-
-#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
-FG_USING_STD(cout);
-#endif
-
-// ONE_SECOND is pi/180/60/60, or about 100 feet at earths' equator
-#define ONE_SECOND 4.848136811E-6
-
-
-// fgGeocToGeod(lat_geoc, radius, *lat_geod, *alt, *sea_level_r)
-//     INPUTS:	
-//         lat_geoc	Geocentric latitude, radians, + = North
-//         radius	C.G. radius to earth center (meters)
-//
-//     OUTPUTS:
-//         lat_geod	Geodetic latitude, radians, + = North
-//         alt		C.G. altitude above mean sea level (meters)
-//         sea_level_r	radius from earth center to sea level at
-//                      local vertical (surface normal) of C.G. (meters)
-
-
-void fgGeocToGeod( double lat_geoc, double radius, double
-		   *lat_geod, double *alt, double *sea_level_r )
-{
-    double t_lat, x_alpha, mu_alpha, delt_mu, r_alpha, l_point, rho_alpha;
-    double sin_mu_a, denom,delt_lambda, lambda_sl, sin_lambda_sl;
-
-    if( ( (FG_PI_2 - lat_geoc) < ONE_SECOND )        // near North pole
-	|| ( (FG_PI_2 + lat_geoc) < ONE_SECOND ) )   // near South pole
-    {
-	*lat_geod = lat_geoc;
-	*sea_level_r = EQUATORIAL_RADIUS_M*E;
-	*alt = radius - *sea_level_r;
-    } else {
-	t_lat = tan(lat_geoc);
-	x_alpha = E*EQUATORIAL_RADIUS_M/sqrt(t_lat*t_lat + E*E);
-	double tmp = RESQ_M - x_alpha * x_alpha;
-	if ( tmp < 0.0 ) { tmp = 0.0; }
-	mu_alpha = atan2(sqrt(tmp),E*x_alpha);
-	if (lat_geoc < 0) mu_alpha = - mu_alpha;
-	sin_mu_a = sin(mu_alpha);
-	delt_lambda = mu_alpha - lat_geoc;
-	r_alpha = x_alpha/cos(lat_geoc);
-	l_point = radius - r_alpha;
-	*alt = l_point*cos(delt_lambda);
-
-	// check for domain error
-	if ( errno == EDOM ) {
-	    FG_LOG( FG_GENERAL, FG_ALERT, "Domain ERROR in fgGeocToGeod!!!!" );
-	    *alt = 0.0;
-	}
-
-	denom = sqrt(1-EPS*EPS*sin_mu_a*sin_mu_a);
-	rho_alpha = EQUATORIAL_RADIUS_M*(1-EPS)/
-	    (denom*denom*denom);
-	delt_mu = atan2(l_point*sin(delt_lambda),rho_alpha + *alt);
-	*lat_geod = mu_alpha - delt_mu;
-	lambda_sl = atan( E*E * tan(*lat_geod) ); // SL geoc. latitude
-	sin_lambda_sl = sin( lambda_sl );
-	*sea_level_r = 
-	    sqrt(RESQ_M / (1 + ((1/(E*E))-1)*sin_lambda_sl*sin_lambda_sl));
-
-	// check for domain error
-	if ( errno == EDOM ) {
-	    FG_LOG( FG_GENERAL, FG_ALERT, "Domain ERROR in fgGeocToGeod!!!!" );
-	    *sea_level_r = 0.0;
-	}
-    }
-
-}
-
-
-// fgGeodToGeoc( lat_geod, alt, *sl_radius, *lat_geoc )
-//     INPUTS:	
-//         lat_geod	Geodetic latitude, radians, + = North
-//         alt		C.G. altitude above mean sea level (meters)
-//
-//     OUTPUTS:
-//         sl_radius	SEA LEVEL radius to earth center (meters)
-//                      (add Altitude to get true distance from earth center.
-//         lat_geoc	Geocentric latitude, radians, + = North
-//
-
-
-void fgGeodToGeoc( double lat_geod, double alt, double *sl_radius,
-		      double *lat_geoc )
-{
-    double lambda_sl, sin_lambda_sl, cos_lambda_sl, sin_mu, cos_mu, px, py;
-    
-    lambda_sl = atan( E*E * tan(lat_geod) ); // sea level geocentric latitude
-    sin_lambda_sl = sin( lambda_sl );
-    cos_lambda_sl = cos( lambda_sl );
-    sin_mu = sin(lat_geod);                  // Geodetic (map makers') latitude
-    cos_mu = cos(lat_geod);
-    *sl_radius = 
-	sqrt(RESQ_M / (1 + ((1/(E*E))-1)*sin_lambda_sl*sin_lambda_sl));
-    py = *sl_radius*sin_lambda_sl + alt*sin_mu;
-    px = *sl_radius*cos_lambda_sl + alt*cos_mu;
-    *lat_geoc = atan2( py, px );
-}
-
-
-/***************************************************************************
-
-	TITLE:	ls_geodesy
-	
-----------------------------------------------------------------------------
-
-	FUNCTION:	Converts geocentric coordinates to geodetic positions
-
-----------------------------------------------------------------------------
-
-	MODULE STATUS:	developmental
-
-----------------------------------------------------------------------------
-
-	GENEALOGY:	Written as part of LaRCSim project by E. B. Jackson
-
-----------------------------------------------------------------------------
-
-	DESIGNED BY:	E. B. Jackson
-	
-	CODED BY:	E. B. Jackson
-	
-	MAINTAINED BY:	E. B. Jackson
-
-----------------------------------------------------------------------------
-
-	MODIFICATION HISTORY:
-	
-	DATE	PURPOSE						BY
-	
-	930208	Modified to avoid singularity near polar region.	EBJ
-	930602	Moved backwards calcs here from ls_step.		EBJ
-	931214	Changed erroneous Latitude and Altitude variables to 
-		*lat_geod and *alt in routine ls_geoc_to_geod.		EBJ
-	940111	Changed header files from old ls_eom.h style to ls_types, 
-		and ls_constants.  Also replaced old DATA type with new
-		SCALAR type.						EBJ
-
-	CURRENT RCS HEADER:
-
-$Header$
- * Revision 1.5  1994/01/11  18:47:05  bjax
- * Changed include files to use types and constants, not ls_eom.h
- * Also changed DATA type to SCALAR type.
- *
- * Revision 1.4  1993/12/14  21:06:47  bjax
- * Removed global variable references Altitude and Latitude.   EBJ
- *
- * Revision 1.3  1993/06/02  15:03:40  bjax
- * Made new subroutine for calculating geodetic to geocentric; changed name
- * of forward conversion routine from ls_geodesy to ls_geoc_to_geod.
- *
-
-----------------------------------------------------------------------------
-
-	REFERENCES:
-
-		[ 1]	Stevens, Brian L.; and Lewis, Frank L.: "Aircraft 
-			Control and Simulation", Wiley and Sons, 1992.
-			ISBN 0-471-61397-5		      
-
-
-----------------------------------------------------------------------------
-
-	CALLED BY:	ls_aux
-
-----------------------------------------------------------------------------
-
-	CALLS TO:
-
-----------------------------------------------------------------------------
-
-	INPUTS:	
-		lat_geoc	Geocentric latitude, radians, + = North
-		radius		C.G. radius to earth center, ft
-
-----------------------------------------------------------------------------
-
-	OUTPUTS:
-		lat_geod	Geodetic latitude, radians, + = North
-		alt		C.G. altitude above mean sea level, ft
-		sea_level_r	radius from earth center to sea level at
-				local vertical (surface normal) of C.G.
-
---------------------------------------------------------------------------*/
-
-
diff --git a/Lib/Math/fg_geodesy.hxx b/Lib/Math/fg_geodesy.hxx
deleted file mode 100644
index c740cb5fd..000000000
--- a/Lib/Math/fg_geodesy.hxx
+++ /dev/null
@@ -1,162 +0,0 @@
-// fg_geodesy.hxx -- routines to convert between geodetic and geocentric 
-//                   coordinate systems.
-//
-// Copied and adapted directly from LaRCsim/ls_geodesy.c
-//
-// See below for the complete original LaRCsim comments.
-//
-// $Id$
-
-
-#ifndef _FG_GEODESY_HXX
-#define _FG_GEODESY_HXX
-
-
-#ifndef __cplusplus                                                          
-# error This library requires C++
-#endif                                   
-
-
-#include 
-#include 
-
-
-// fgGeocToGeod(lat_geoc, radius, *lat_geod, *alt, *sea_level_r)
-//     INPUTS:	
-//         lat_geoc	Geocentric latitude, radians, + = North
-//         radius	C.G. radius to earth center (meters)
-//
-//     OUTPUTS:
-//         lat_geod	Geodetic latitude, radians, + = North
-//         alt		C.G. altitude above mean sea level (meters)
-//         sea_level_r	radius from earth center to sea level at
-//                      local vertical (surface normal) of C.G. (meters)
-
-void fgGeocToGeod( double lat_geoc, double radius, double
-		   *lat_geod, double *alt, double *sea_level_r );
-
-
-// fgGeodToGeoc( lat_geod, alt, *sl_radius, *lat_geoc )
-//     INPUTS:	
-//         lat_geod	Geodetic latitude, radians, + = North
-//         alt		C.G. altitude above mean sea level (meters)
-//
-//     OUTPUTS:
-//         sl_radius	SEA LEVEL radius to earth center (meters)
-//                      (add Altitude to get true distance from earth center.
-//         lat_geoc	Geocentric latitude, radians, + = North
-//
-
-void fgGeodToGeoc( double lat_geod, double alt, double *sl_radius,
-		      double *lat_geoc );
-
-
-// convert a geodetic point lon(radians), lat(radians), elev(meter) to
-// a cartesian point
-
-inline Point3D fgGeodToCart(const Point3D& geod) {
-    double gc_lon, gc_lat, sl_radius;
-
-    // printf("A geodetic point is (%.2f, %.2f, %.2f)\n", 
-    //        geod[0], geod[1], geod[2]);
-
-    gc_lon = geod.lon();
-    fgGeodToGeoc(geod.lat(), geod.radius(), &sl_radius, &gc_lat);
-
-    // printf("A geocentric point is (%.2f, %.2f, %.2f)\n", gc_lon, 
-    //        gc_lat, sl_radius+geod[2]);
-
-    Point3D pp = Point3D( gc_lon, gc_lat, sl_radius + geod.radius());
-    return fgPolarToCart3d(pp);
-}
-
-
-/***************************************************************************
-
-	TITLE:	ls_geodesy
-	
-----------------------------------------------------------------------------
-
-	FUNCTION:	Converts geocentric coordinates to geodetic positions
-
-----------------------------------------------------------------------------
-
-	MODULE STATUS:	developmental
-
-----------------------------------------------------------------------------
-
-	GENEALOGY:	Written as part of LaRCSim project by E. B. Jackson
-
-----------------------------------------------------------------------------
-
-	DESIGNED BY:	E. B. Jackson
-	
-	CODED BY:	E. B. Jackson
-	
-	MAINTAINED BY:	E. B. Jackson
-
-----------------------------------------------------------------------------
-
-	MODIFICATION HISTORY:
-	
-	DATE	PURPOSE						BY
-	
-	930208	Modified to avoid singularity near polar region.	EBJ
-	930602	Moved backwards calcs here from ls_step.		EBJ
-	931214	Changed erroneous Latitude and Altitude variables to 
-		*lat_geod and *alt in routine ls_geoc_to_geod.		EBJ
-	940111	Changed header files from old ls_eom.h style to ls_types, 
-		and ls_constants.  Also replaced old DATA type with new
-		SCALAR type.						EBJ
-
-	CURRENT RCS HEADER:
-
-$Header$
-
- * Revision 1.5  1994/01/11  18:47:05  bjax
- * Changed include files to use types and constants, not ls_eom.h
- * Also changed DATA type to SCALAR type.
- *
- * Revision 1.4  1993/12/14  21:06:47  bjax
- * Removed global variable references Altitude and Latitude.   EBJ
- *
- * Revision 1.3  1993/06/02  15:03:40  bjax
- * Made new subroutine for calculating geodetic to geocentric; changed name
- * of forward conversion routine from ls_geodesy to ls_geoc_to_geod.
- *
-
-----------------------------------------------------------------------------
-
-	REFERENCES:
-
-		[ 1]	Stevens, Brian L.; and Lewis, Frank L.: "Aircraft 
-			Control and Simulation", Wiley and Sons, 1992.
-			ISBN 0-471-61397-5		      
-
-
-----------------------------------------------------------------------------
-
-	CALLED BY:	ls_aux
-
-----------------------------------------------------------------------------
-
-	CALLS TO:
-
-----------------------------------------------------------------------------
-
-	INPUTS:	
-		lat_geoc	Geocentric latitude, radians, + = North
-		radius		C.G. radius to earth center, ft
-
-----------------------------------------------------------------------------
-
-	OUTPUTS:
-		lat_geod	Geodetic latitude, radians, + = North
-		alt		C.G. altitude above mean sea level, ft
-		sea_level_r	radius from earth center to sea level at
-				local vertical (surface normal) of C.G.
-
---------------------------------------------------------------------------*/
-
-
-#endif // _FG_GEODESY_HXX
diff --git a/Lib/Math/fg_random.c b/Lib/Math/fg_random.c
deleted file mode 100644
index d6c13c303..000000000
--- a/Lib/Math/fg_random.c
+++ /dev/null
@@ -1,71 +0,0 @@
-// fg_random.c -- routines to handle random number generation
-//
-// Written by Curtis Olson, started July 1997.
-//
-// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifdef HAVE_CONFIG_H
-#  include 
-#endif
-
-#include 
-#include          // for random(), srandom()
-#include            // for time() to seed srandom()        
-
-#include "fg_random.h"
-
-#ifndef HAVE_RAND
-#  ifdef sgi
-#    undef RAND_MAX
-#    define RAND_MAX 2147483647
-#  endif
-#endif
-
-#ifdef __SUNPRO_CC
-    extern "C" {
-	long int random(void);
-	void srandom(unsigned int seed);
-    }
-#endif
-
-
-// Seed the random number generater with time() so we don't see the
-// same sequence every time
-void fg_srandom(void) {
-    // fgPrintf( FG_MATH, FG_INFO, "Seeding random number generater\n");
-
-#ifdef HAVE_RAND
-    srand(time(NULL));
-#else
-    srandom(time(NULL));
-#endif                                       
-}
-
-
-// return a random number between [0.0, 1.0)
-double fg_random(void) {
-#ifdef HAVE_RAND
-    return(rand() / (double)RAND_MAX);
-#else
-    return(random() / (double)RAND_MAX);
-#endif
-}
-
-
diff --git a/Lib/Math/fg_random.h b/Lib/Math/fg_random.h
deleted file mode 100644
index 25a2b4633..000000000
--- a/Lib/Math/fg_random.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// fg_random.h -- routines to handle random number generation
-//
-// Written by Curtis Olson, started July 1997.
-//
-// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifndef _FG_RANDOM_H
-#define _FG_RANDOM_H
-
-
-#ifdef __cplusplus                                                          
-extern "C" {                            
-#endif                                   
-
-
-// Seed the random number generater with time() so we don't see the
-// same sequence every time
-void fg_srandom(void);
-
-// return a random number between [0.0, 1.0)
-double fg_random(void);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif // _FG_RANDOM_H
-
-
diff --git a/Lib/Math/geotest.c b/Lib/Math/geotest.c
deleted file mode 100644
index cdaaec94d..000000000
--- a/Lib/Math/geotest.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include 
-#include 
-
-#include 
-
-void
-main( void )
-{
-    double Lon, Alt, sl_radius;
-    double geodetic_Lat;
-    double geocentric_Lat;
-
-    Lon          = -87.75 * DEG_TO_RAD;
-    geodetic_Lat =  41.83 * DEG_TO_RAD;
-    Alt          = 1.5; /* km */
-
-    printf("Geodetic position = (%.8f, %.8f, %.8f)\n", Lon, geodetic_Lat, Alt); 
-
-    fgGeodToGeoc( geodetic_Lat, Alt, &sl_radius, &geocentric_Lat );
-
-    printf("Geocentric position = (%.8f, %.8f, %.8f)\n", Lon, geocentric_Lat, 
-	   sl_radius + Alt); 
-    printf("new sl_radius = %.8f\n", sl_radius); 
-
-    fgGeocToGeod( geocentric_Lat, sl_radius + Alt, &geodetic_Lat,
-		     &Alt, &sl_radius );
-
-    printf("Geodetic position = (%.8f, %.8f, %.8f)\n", Lon, geodetic_Lat, Alt); 
-    printf("new sl_radius = %.8f\n", sl_radius); 
-}
diff --git a/Lib/Math/interpolater.cxx b/Lib/Math/interpolater.cxx
deleted file mode 100644
index f36d579e0..000000000
--- a/Lib/Math/interpolater.cxx
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// interpolater.cxx -- routines to handle linear interpolation from a table of
-//                     x,y   The table must be sorted by "x" in ascending order
-//
-// Written by Curtis Olson, started April 1998.
-//
-// Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#include 
-
-#ifdef __MWERKS__
-#include  // for exit()
-#endif
-
-#include STL_STRING
-
-#include 
-#include 
-#include 
-
-#include "interpolater.hxx"
-
-
-// Constructor -- loads the interpolation table from the specified
-// file
-fgINTERPTABLE::fgINTERPTABLE( const string& file ) {
-    FG_LOG( FG_MATH, FG_INFO, "Initializing Interpolator for " << file );
-
-    fg_gzifstream in( file );
-    if ( !in ) {
-        FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << file );
-	exit(-1);
-    }
-
-    size = 0;
-    in >> skipcomment;
-    while ( in ) {
-	if ( size < MAX_TABLE_SIZE ) {
-	    in >> table[size][0] >> table[size][1];
-	    size++;
-	} else {
-            FG_LOG( FG_MATH, FG_ALERT,
-		    "fgInterpolateInit(): Exceed max table size = "
-		    << MAX_TABLE_SIZE );
-	    exit(-1);
-	}
-    }
-}
-
-
-// Given an x value, linearly interpolate the y value from the table
-double fgINTERPTABLE::interpolate(double x) {
-    int i;
-    double y;
-
-    i = 0;
-
-    while ( (x > table[i][0]) && (i < size) ) {
-	i++;
-    }
-
-    // printf ("i = %d ", i);
-
-    if ( (i == 0) && (x < table[0][0]) ) {
-	FG_LOG( FG_MATH, FG_ALERT, 
-		"fgInterpolateInit(): lookup error, x to small = " << x );
-	return(0.0);
-    }
-
-    if ( x > table[i][0] ) {
-	FG_LOG( FG_MATH, FG_ALERT, 
-		"fgInterpolateInit(): lookup error, x to big = " << x );
-	return(0.0);
-    }
-
-    // y = y1 + (y0 - y1)(x - x1) / (x0 - x1)
-    y = table[i][1] + 
-	( (table[i-1][1] - table[i][1]) * 
-	  (x - table[i][0]) ) /
-	(table[i-1][0] - table[i][0]);
-
-    return(y);
-}
-
-
-// Destructor
-fgINTERPTABLE::~fgINTERPTABLE( void ) {
-}
-
-
diff --git a/Lib/Math/interpolater.hxx b/Lib/Math/interpolater.hxx
deleted file mode 100644
index 7650946d0..000000000
--- a/Lib/Math/interpolater.hxx
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// interpolater.hxx -- routines to handle linear interpolation from a table of
-//                     x,y   The table must be sorted by "x" in ascending order
-//
-// Written by Curtis Olson, started April 1998.
-//
-// Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifndef _INTERPOLATER_H
-#define _INTERPOLATER_H
-
-
-#ifndef __cplusplus                                                          
-# error This library requires C++
-#endif                                   
-
-#include "Include/compiler.h"
-
-#include STL_STRING
-FG_USING_STD(string);
-
-#define MAX_TABLE_SIZE 32
-
-
-class fgINTERPTABLE {
-    int size;
-    double table[MAX_TABLE_SIZE][2];
-
-public:
-
-    // Constructor -- loads the interpolation table from the specified
-    // file
-    fgINTERPTABLE( const string& file );
-
-    // Given an x value, linearly interpolate the y value from the table
-    double interpolate(double x);
-
-    // Destructor
-    ~fgINTERPTABLE( void );
-};
-
-
-#endif // _INTERPOLATER_H
-
-
diff --git a/Lib/Math/inttest.cxx b/Lib/Math/inttest.cxx
deleted file mode 100644
index 1fbc286c8..000000000
--- a/Lib/Math/inttest.cxx
+++ /dev/null
@@ -1,23 +0,0 @@
-#include 
-#include 
-
-#include "interpolater.hxx"
-
-main() {
-    fgINTERPTABLE test("test.table");
-
-    fgInitDebug();
-
-    printf("-1.0 = %.2f\n", test.interpolate(-1.0));
-    printf("0.0 = %.2f\n", test.interpolate(0.0));
-    printf("2.9 = %.2f\n", test.interpolate(2.9));
-    printf("3.0 = %.2f\n", test.interpolate(3.0));
-    printf("3.5 = %.2f\n", test.interpolate(3.5));
-    printf("4.0 = %.2f\n", test.interpolate(4.0));
-    printf("4.5 = %.2f\n", test.interpolate(4.5));
-    printf("5.2 = %.2f\n", test.interpolate(5.2));
-    printf("8.0 = %.2f\n", test.interpolate(8.0));
-    printf("8.5 = %.2f\n", test.interpolate(8.5));
-    printf("9.0 = %.2f\n", test.interpolate(9.0));
-    printf("10.0 = %.2f\n", test.interpolate(10.0));
-}
diff --git a/Lib/Math/leastsqs.cxx b/Lib/Math/leastsqs.cxx
deleted file mode 100644
index dfa8bdf96..000000000
--- a/Lib/Math/leastsqs.cxx
+++ /dev/null
@@ -1,135 +0,0 @@
-// leastsqs.c -- Implements a simple linear least squares best fit routine
-//
-// Written by Curtis Olson, started September 1997.
-//
-// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-//
-
-
-#include 
-
-#include "leastsqs.hxx"
-
-
-/* 
-Least squares fit:
-
-y = b0 + b1x
-
-     n*sum(xi*yi) - (sum(xi)*sum(yi))
-b1 = --------------------------------
-     n*sum(xi^2) - (sum(xi))^2
-
-
-b0 = sum(yi)/n - b1*(sum(xi)/n)
-*/
-
-double sum_xi, sum_yi, sum_xi_2, sum_xi_yi;
-int sum_n;
-
-void least_squares(double *x, double *y, int n, double *m, double *b) {
-    int i;
-
-    sum_xi = sum_yi = sum_xi_2 = sum_xi_yi = 0.0;
-    sum_n = n;
-
-    for ( i = 0; i < n; i++ ) {
-	sum_xi += x[i];
-	sum_yi += y[i];
-	sum_xi_2 += x[i] * x[i];
-	sum_xi_yi += x[i] * y[i];
-    }
-
-    /* printf("sum(xi)=%.2f  sum(yi)=%.2f  sum(xi^2)=%.2f  sum(xi*yi)=%.2f\n",
-	   sum_xi, sum_yi, sum_xi_2, sum_xi_yi); */
-
-    *m = ( (double)sum_n * sum_xi_yi - sum_xi * sum_yi ) / 
-	( (double)sum_n * sum_xi_2 - sum_xi * sum_xi );
-    *b = (sum_yi / (double)sum_n) - (*m) * (sum_xi / (double)sum_n);
-
-    /* printf("slope = %.2f  intercept = %.2f\n", *m, *b); */
-}
-
-
-/* incrimentally update existing values with a new data point */
-void least_squares_update(double x, double y, double *m, double *b) {
-    ++sum_n;
-
-    sum_xi += x;
-    sum_yi += y;
-    sum_xi_2 += x * x;
-    sum_xi_yi += x * y;
-
-    /* printf("sum(xi)=%.2f  sum(yi)=%.2f  sum(xi^2)=%.2f  sum(xi*yi)=%.2f\n",
-	   sum_xi, sum_yi, sum_xi_2, sum_xi_yi); */
-
-    *m = ( (double)sum_n * sum_xi_yi - sum_xi * sum_yi ) / 
-	( (double)sum_n * sum_xi_2 - sum_xi * sum_xi );
-    *b = (sum_yi / (double)sum_n) - (*m) * (sum_xi / (double)sum_n);
-
-    /* printf("slope = %.2f  intercept = %.2f\n", *m, *b); */
-}
-
-
-/* 
-  return the least squares error:
-
-              (y[i] - y_hat[i])^2
-              -------------------
-                      n
- */
-double least_squares_error(double *x, double *y, int n, double m, double b) {
-    int i;
-    double error, sum;
-
-    sum = 0.0;
-
-    for ( i = 0; i < n; i++ ) {
-	error = y[i] - (m * x[i] + b);
-	sum += error * error;
-	// printf("%.2f %.2f\n", error, sum);
-    }
-
-    return ( sum / (double)n );
-}
-
-
-/* 
-  return the maximum least squares error:
-
-              (y[i] - y_hat[i])^2
- */
-double least_squares_max_error(double *x, double *y, int n, double m, double b){
-    int i;
-    double error, max_error;
-
-    max_error = 0.0;
-
-    for ( i = 0; i < n; i++ ) {
-	error = y[i] - (m * x[i] + b);
-	error = error * error;
-	if ( error > max_error ) {
-	    max_error = error;
-	}
-    }
-
-    return ( max_error );
-}
-
-
diff --git a/Lib/Math/leastsqs.hxx b/Lib/Math/leastsqs.hxx
deleted file mode 100644
index 16d6ad096..000000000
--- a/Lib/Math/leastsqs.hxx
+++ /dev/null
@@ -1,73 +0,0 @@
-// leastsqs.h -- Implements a simple linear least squares best fit routine
-//
-// Written by Curtis Olson, started September 1997.
-//
-// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-///
-
-
-#ifndef _LEASTSQS_H
-#define _LEASTSQS_H
-
-
-#ifndef __cplusplus                                                          
-# error This library requires C++
-#endif                                   
-
-
-/* 
-Least squares fit:
-
-y = b0 + b1x
-
-     n*sum(xi*yi) - (sum(xi)*sum(yi))
-b1 = --------------------------------
-     n*sum(xi^2) - (sum(xi))^2
-
-
-b0 = sum(yi)/n - b1*(sum(xi)/n)
-*/
-
-void least_squares(double *x, double *y, int n, double *m, double *b);
-
-/* incrimentally update existing values with a new data point */
-void least_squares_update(double x, double y, double *m, double *b);
-
-
-/* 
-  return the least squares error:
-
-              (y[i] - y_hat[i])^2
-              -------------------
-                      n
-*/
-double least_squares_error(double *x, double *y, int n, double m, double b);
-
-
-/* 
-  return the maximum least squares error:
-
-              (y[i] - y_hat[i])^2
-*/
-double least_squares_max_error(double *x, double *y, int n, double m, double b);
-
-
-#endif // _LEASTSQS_H
-
-
diff --git a/Lib/Math/mat3.h b/Lib/Math/mat3.h
deleted file mode 100644
index f60df04c3..000000000
--- a/Lib/Math/mat3.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/* Copyright 1988, Brown Computer Graphics Group.  All Rights Reserved. */
-
-/* -------------------------------------------------------------------------
-		       Public MAT3 include file
-   ------------------------------------------------------------------------- */
-
-#ifndef MAT3_HAS_BEEN_INCLUDED
-#define MAT3_HAS_BEEN_INCLUDED
-
-/* -----------------------------  Constants  ------------------------------ */
-
-/*
- * Make sure the math library .h file is included, in case it wasn't.
- */
-
-#ifndef HUGE
-#include 
-#endif
-#include 
-
-#include 
-#include "Include/fg_memory.h"
-
-#ifdef __cplusplus                                                          
-extern "C" {                            
-#endif                                   
-
-
-#define MAT3_DET0	-1			/* Indicates singular mat */
-#define MAT3_EPSILON	1e-12			/* Close enough to zero   */
-
-#ifdef M_PI
-#  define  MAT3_PI    M_PI
-#else
-#  define  MAT3_PI    3.14159265358979323846
-#endif
-
-#define USE_XTRA_MAT3_INLINES
-
-#if defined(i386)
-#define USE_X86_ASM
-#endif
-
-#if defined(USE_X86_ASM)
-static __inline__ int FloatToInt(float f)
-{
-   int r;
-   __asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st");
-   return r;
-}
-#elif  defined(__MSC__) && defined(__WIN32__)
-static __inline int FloatToInt(float f)
-{
-   int r;
-   _asm {
-     fld f
-     fistp r
-    }
-   return r;
-}
-#else
-#define FloatToInt(F) ((int) ((F) < 0.0f ? (F)-0.5f : (F)+0.5f))
-#endif
-
-/* ------------------------------  Types  --------------------------------- */
-
-typedef double MAT3mat[4][4];		/* 4x4 matrix			 */
-typedef double MAT3vec[3];		/* Vector			 */
-typedef double MAT3hvec[4];             /* Vector with homogeneous coord */
-
-/* ------------------------------  Macros  -------------------------------- */
-
-extern MAT3mat identityMatrix;
-
-/* Tests if a number is within EPSILON of zero */
-#define MAT3_IS_ZERO(N) 	((N) < MAT3_EPSILON && (N) > -MAT3_EPSILON)
-
-/* Sets a vector to the three given values */
-#define MAT3_SET_VEC(V,X,Y,Z)	((V)[0]=(X), (V)[1]=(Y), (V)[2]=(Z))
-
-/* Tests a vector for all components close to zero */
-#define MAT3_IS_ZERO_VEC(V)	(MAT3_IS_ZERO((V)[0]) && \
-				 MAT3_IS_ZERO((V)[1]) && \
-				 MAT3_IS_ZERO((V)[2]))
-
-/* Dot product of two vectors */
-#define MAT3_DOT_PRODUCT(V1,V2) \
-			((V1)[0]*(V2)[0] + (V1)[1]*(V2)[1] + (V1)[2]*(V2)[2])
-
-/* Copy one vector to other */
-#define MAT3_COPY_VEC(TO,FROM)	((TO)[0] = (FROM)[0], \
-				 (TO)[1] = (FROM)[1], \
-				 (TO)[2] = (FROM)[2])
-
-/* Normalize vector to unit length, using TEMP as temporary variable.
- * TEMP will be zero if vector has zero length */
-#define MAT3_NORMALIZE_VEC(V,TEMP) \
-	if ((TEMP = sqrt(MAT3_DOT_PRODUCT(V,V))) > MAT3_EPSILON) { \
-	   TEMP = 1.0 / TEMP; \
-	   MAT3_SCALE_VEC(V,V,TEMP); \
-	} else TEMP = 0.0
-
-/* Scale vector by given factor, storing result vector in RESULT_V */
-#define MAT3_SCALE_VEC(RESULT_V,V,SCALE) \
-	MAT3_SET_VEC(RESULT_V, (V)[0]*(SCALE), (V)[1]*(SCALE), (V)[2]*(SCALE))
-
-/* Adds vectors V1 and V2, storing result in RESULT_V */
-#define MAT3_ADD_VEC(RESULT_V,V1,V2) \
-	MAT3_SET_VEC(RESULT_V, (V1)[0]+(V2)[0], (V1)[1]+(V2)[1], \
-			       (V1)[2]+(V2)[2])
-
-/* Subtracts vector V2 from V1, storing result in RESULT_V */
-#define MAT3_SUB_VEC(RESULT_V,V1,V2) \
-	MAT3_SET_VEC(RESULT_V, (V1)[0]-(V2)[0], (V1)[1]-(V2)[1], \
-			       (V1)[2]-(V2)[2])
-
-/* Multiplies vectors V1 and V2, storing result in RESULT_V */
-#define MAT3_MULT_VEC(RESULT_V,V1,V2) \
-	MAT3_SET_VEC(RESULT_V, (V1)[0]*(V2)[0], (V1)[1]*(V2)[1], \
-			       (V1)[2]*(V2)[2])
-
-/* Sets RESULT_V to the linear combination of V1 and V2, scaled by
- * SCALE1 and SCALE2, respectively */
-#define MAT3_LINEAR_COMB(RESULT_V,SCALE1,V1,SCALE2,V2) \
-	MAT3_SET_VEC(RESULT_V,	(SCALE1)*(V1)[0] + (SCALE2)*(V2)[0], \
-				(SCALE1)*(V1)[1] + (SCALE2)*(V2)[1], \
-				(SCALE1)*(V1)[2] + (SCALE2)*(V2)[2])
-
-/* Several of the vector macros are useful for homogeneous-coord vectors */
-#define MAT3_SET_HVEC(V,X,Y,Z,W) ((V)[0]=(X), (V)[1]=(Y), \
-				  (V)[2]=(Z), (V)[3]=(W))
-
-#define MAT3_COPY_HVEC(TO,FROM) ((TO)[0] = (FROM)[0], \
-				 (TO)[1] = (FROM)[1], \
-				 (TO)[2] = (FROM)[2], \
-				 (TO)[3] = (FROM)[3])
-
-#define MAT3_SCALE_HVEC(RESULT_V,V,SCALE) \
-	MAT3_SET_HVEC(RESULT_V, (V)[0]*(SCALE), (V)[1]*(SCALE), \
-				(V)[2]*(SCALE), (V)[3]*(SCALE))
-
-#define MAT3_ADD_HVEC(RESULT_V,V1,V2) \
-	MAT3_SET_HVEC(RESULT_V, (V1)[0]+(V2)[0], (V1)[1]+(V2)[1], \
-				(V1)[2]+(V2)[2], (V1)[3]+(V2)[3])
-
-#define MAT3_SUB_HVEC(RESULT_V,V1,V2) \
-	MAT3_SET_HVEC(RESULT_V, (V1)[0]-(V2)[0], (V1)[1]-(V2)[1], \
-				(V1)[2]-(V2)[2], (V1)[3]-(V2)[3])
-
-#define MAT3_MULT_HVEC(RESULT_V,V1,V2) \
-	MAT3_SET_HVEC(RESULT_V, (V1)[0]*(V2)[0], (V1)[1]*(V2)[1], \
-				(V1)[2]*(V2)[2], (V1)[3]*(V2)[3])
-
-/* ------------------------------  Entries  ------------------------------- */
-
-
-#define MAT3identity(mat)    fgmemcpy( mat, identityMatrix, sizeof(MAT3mat) )
-#define MAT3zero(mat)        fgmemzero( mat, sizeof(MAT3mat) )
-#define MAT3copy(to, from)   fgmemcpy( to, from, sizeof(MAT3mat) )
-
-#if defined( USE_XTRA_MAT3_INLINES )
-
-#  define MAT3mult_vec( result_vec, vec, mat) { \
-   MAT3vec tempvec; \
-   tempvec[0]=vec[0]*mat[0][0]+vec[1]*mat[1][0]+vec[2]*mat[2][0]+mat[3][0]; \
-   tempvec[1]=vec[0]*mat[0][1]+vec[1]*mat[1][1]+vec[2]*mat[2][1]+mat[3][1]; \
-   tempvec[2]=vec[0]*mat[0][2]+vec[1]*mat[1][2]+vec[2]*mat[2][2]+mat[3][2]; \
-   result_vec[0] = tempvec[0]; \
-   result_vec[1] = tempvec[1]; \
-   result_vec[2] = tempvec[2]; \
-}
-
-#  define MAT3cross_product(result_vec, vec1, vec2)  { \
-   MAT3vec tempvec; \
-   tempvec[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1]; \
-   tempvec[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2]; \
-   tempvec[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0]; \
-   result_vec[0] = tempvec[0]; \
-   result_vec[1] = tempvec[1]; \
-   result_vec[2] = tempvec[2]; \
-} 
-
-#  define MAT3mult( result_mat,  mat1,  mat2) { \
-   register int i, j; \
-   MAT3mat	tmp_mat; \
-   for (i = 0; i < 4; i++) \
-      for (j = 0; j < 4; j++) \
-         tmp_mat[i][j] = (mat1[i][0] * mat2[0][j] + \
-			  mat1[i][1] * mat2[1][j] + \
-			  mat1[i][2] * mat2[2][j] + \
-			  mat1[i][3] * mat2[3][j]); \
-   fgmemcpy(result_mat, tmp_mat, sizeof(MAT3mat)); \
-}
-
-#else // !defined( USE_XTRA_MAT3_INLINES )
-
-/* In MAT3mat.c */
-void	MAT3mult(MAT3mat result, MAT3mat, MAT3mat);
-void	MAT3mult_vec(MAT3vec result_vec, MAT3vec vec, MAT3mat mat);
-void	MAT3cross_product(MAT3vec result,MAT3vec,MAT3vec);
-
-#endif // defined( USE_XTRA_MAT3_INLINES )
-
-/* In MAT3geom.c */
-void	MAT3direction_matrix (MAT3mat result_mat, MAT3mat mat);
-int     MAT3normal_matrix (MAT3mat result_mat, MAT3mat mat);
-void	MAT3rotate (MAT3mat result_mat, MAT3vec axis, double angle_in_radians);
-void	MAT3translate (MAT3mat result_mat, MAT3vec trans);
-void	MAT3scale (MAT3mat result_mat, MAT3vec scale);
-void	MAT3shear(MAT3mat result_mat, double xshear, double yshear);
-
-void	MAT3transpose (MAT3mat result, MAT3mat);
-int	MAT3invert (MAT3mat result, MAT3mat);
-void	MAT3print (MAT3mat, FILE *fp);
-void	MAT3print_formatted (MAT3mat, FILE *fp, 
-			     char *title, char *head, char *format, char *tail);
-int	MAT3equal( void );
-double  MAT3trace( void );
-int	MAT3power( void );
-int	MAT3column_reduce( void );
-int	MAT3kernel_basis( void );
-
-/* In MAT3vec.c */
-int	MAT3mult_hvec (MAT3hvec result_vec, MAT3hvec vec, MAT3mat mat, int normalize);
-void	MAT3perp_vec(MAT3vec result_vec, MAT3vec vec, int is_unit);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* MAT3_HAS_BEEN_INCLUDED */
-
diff --git a/Lib/Math/mat3defs.h b/Lib/Math/mat3defs.h
deleted file mode 100644
index dd4ceeb5e..000000000
--- a/Lib/Math/mat3defs.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Copyright 1988, Brown Computer Graphics Group.  All Rights Reserved. */
-
-
-#ifndef _MAT3DEFS_H
-#define _MAT3DEFS_H
-
-
-#ifdef __cplusplus                                                          
-extern "C" {                            
-#endif                                   
-
-#include 
-/* #include  */
-#include 
-
-/* -----------------------------  Constants  ------------------------------ */
-
-#define FALSE		0
-#define TRUE		1
-
-#define CNULL ((char *) NULL)
-
-/* ------------------------------  Macros  -------------------------------- */
-
-#define ALLOCN(P,T,N,M) \
-   if ((P = (T *) malloc((unsigned) (N) * sizeof(T))) == NULL) \
-      ERR_ERROR(MAT3_errid, ERR_FATAL, (ERR_ALLOC1, M)); \
-   else
-
-#define FREE(P)    free((char *) (P))
-
-#define ABS(A)		((A) > 0   ? (A) : -(A))
-#define MIN(A,B)	((A) < (B) ? (A) :  (B))
-#define MAX(A,B)	((A) > (B) ? (A) :  (B))
-
-#define SWAP(A,B,T)	(T = A, A = B, B = T)
-
-/* Is N within EPS of zero ? */
-#define IS_ZERO(N,EPS)	((N) < EPS && (N) > -EPS)
-
-/* Macros for lu routines */
-#define LU_PERMUTE(p,i,j)  { int LU_T; LU_T = p[i]; p[i] = p[j]; p[j] = LU_T; }
-
-/* -------------------------  Internal Entries ---------------------------- */
-
-/* -------------------------  Global Variables ---------------------------- */
-
-/* extern ERRid	*MAT3_errid; */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* _MAT3DEFS_H */
diff --git a/Lib/Math/mat3err.h b/Lib/Math/mat3err.h
deleted file mode 100644
index 7ac5740ad..000000000
--- a/Lib/Math/mat3err.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef _MAT3ERR_H
-#define _MAT3ERR_H
-
-
-#ifdef __cplusplus                                                          
-extern "C" {                            
-#endif                                   
-
-
-#include "sph_errtypes.h"
-
-#ifdef THINK_C
-/* We hide this from gnu's compiler, which doesn't understand it. */
-void SPH__error (int errtype, ...);
-#endif
-
-
-#define ERR_ERROR(A,B,C)   \
-   if (1) {char cstr[256]; sprintf C; SPH__error(ERR_MAT3_PACKAGE, cstr); } else
-
-
-#define ERR_S  cstr,"%s\n"
-#define ERR_SI cstr,"%s: %d\n"
-#define ERR_SS cstr,"%s: %s\n"
-
-#define ERR_SEVERE 0
-#define ERR_FATAL  0
-
-#define ERR_ALLOC1 0
-
-typedef int ERRid;
-
-#define ERRregister_package(S)    100
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* _MAT3ERR_H */
diff --git a/Lib/Math/point3d.hxx b/Lib/Math/point3d.hxx
deleted file mode 100644
index d830825ff..000000000
--- a/Lib/Math/point3d.hxx
+++ /dev/null
@@ -1,341 +0,0 @@
-// point3d.hxx -- a 3d point class.  
-//
-// Adapted from algebra3 by Jean-Francois Doue, started October 1998.
-//
-// Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifndef _POINT3D_HXX
-#define _POINT3D_HXX
-
-
-#ifndef __cplusplus                                                          
-# error This library requires C++
-#endif                                   
-
-#include 
-
-#ifdef FG_MATH_EXCEPTION_CLASH
-# define exception c_exception
-#endif
-
-#ifdef FG_HAVE_STD_INCLUDES
-# include 
-# include 
-# include 
-#else
-# include 
-# include 
-# include 
-#endif
-
-// I don't understand ...  or  should be included
-// already depending on how you defined FG_HAVE_STD_INCLUDES, but I
-// can go ahead and add this -- CLO
-#ifdef __MWERKS__
-FG_USING_NAMESPACE(std);
-#endif
-
-#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
-FG_USING_STD(ostream);
-FG_USING_STD(istream);
-#endif
-
-
-const double fgPoint3_Epsilon = 0.0000001;
-
-enum {PX, PY, PZ};		    // axes
-
-// Kludge for msvc++ 6.0 - requires forward decls of friend functions.
-class Point3D;
-istream& operator>> ( istream&, Point3D& );
-ostream& operator<< ( ostream&, const Point3D& );
-Point3D operator- (const Point3D& p);	            // -p1
-bool operator== (const Point3D& a, const Point3D& b);  // p1 == p2?
-
-
-///////////////////////////
-//
-// 3D Point
-//
-///////////////////////////
-
-class Point3D {
-
-protected:
-
-    double n[3];
-
-public:
-
-    // Constructors
-
-    Point3D();
-    Point3D(const double x, const double y, const double z);
-    explicit Point3D(const double d);
-    Point3D(const Point3D &p);
-
-    // Assignment operators
-
-    Point3D& operator = ( const Point3D& p );	 // assignment of a Point3D
-    Point3D& operator += ( const Point3D& p );	 // incrementation by a Point3D
-    Point3D& operator -= ( const Point3D& p );	 // decrementation by a Point3D
-    Point3D& operator *= ( const double d );     // multiplication by a constant
-    Point3D& operator /= ( const double d );	 // division by a constant
-
-    void setx(const double x);
-    void sety(const double y);
-    void setz(const double z);
-
-    // Queries 
-
-    double& operator [] ( int i);		 // indexing
-    double operator[] (int i) const;		 // read-only indexing
-
-    inline const double *get_n() const { return n; };
-    double x() const;      // cartesian x
-    double y() const;      // cartesian y
-    double z() const;      // cartesian z
-
-    double lon() const;    // polar longitude
-    double lat() const;    // polar latitude
-    double radius() const; // polar radius
-    double elev() const;   // geodetic elevation (if specifying a surface point)
-
-    // friends
-    friend Point3D operator - (const Point3D& p);	            // -p1
-    friend bool operator == (const Point3D& a, const Point3D& b);  // p1 == p2?
-    friend istream& operator>> ( istream&, Point3D& );
-    friend ostream& operator<< ( ostream&, const Point3D& );
-
-    // Special functions
-    double distance3D(const Point3D& a) const;        // distance between
-    double distance3Dsquared(const Point3D& a) const; // distance between ^ 2
-};
-
-
-// input from stream
-inline istream&
-operator >> ( istream& in, Point3D& p)
-{
-    char c;
-
-    in >> p.n[PX];
-
-    // read past optional comma
-    while ( in.get(c) ) {
-	if ( (c != ' ') && (c != ',') ) {
-	    // push back on the stream
-	    in.putback(c);
-	    break;
-	}
-    }
-	
-    in >> p.n[PY];
-
-    // read past optional comma
-    while ( in.get(c) ) {
-	if ( (c != ' ') && (c != ',') ) {
-	    // push back on the stream
-	    in.putback(c);
-	    break;
-	}
-    }
-	
-    in >> p.n[PZ];
-
-    return in;
-}
-
-inline ostream&
-operator<< ( ostream& out, const Point3D& p )
-{
-    return out << p.n[PX] << ", " << p.n[PY] << ", " << p.n[PZ];
-}
-
-///////////////////////////
-//
-// Point3D Member functions
-//
-///////////////////////////
-
-// CONSTRUCTORS
-
-inline Point3D::Point3D() {}
-
-inline Point3D::Point3D(const double x, const double y, const double z)
-{
-    n[PX] = x; n[PY] = y; n[PZ] = z;
-}
-
-inline Point3D::Point3D(const double d)
-{
-    n[PX] = n[PY] = n[PZ] = d;
-}
-
-inline Point3D::Point3D(const Point3D& p)
-{
-    n[PX] = p.n[PX]; n[PY] = p.n[PY]; n[PZ] = p.n[PZ];
-}
-
-// ASSIGNMENT OPERATORS
-
-inline Point3D& Point3D::operator = (const Point3D& p)
-{
-    n[PX] = p.n[PX]; n[PY] = p.n[PY]; n[PZ] = p.n[PZ]; return *this;
-}
-
-inline Point3D& Point3D::operator += ( const Point3D& p )
-{
-    n[PX] += p.n[PX]; n[PY] += p.n[PY]; n[PZ] += p.n[PZ]; return *this;
-}
-
-inline Point3D& Point3D::operator -= ( const Point3D& p )
-{
-    n[PX] -= p.n[PX]; n[PY] -= p.n[PY]; n[PZ] -= p.n[PZ]; return *this;
-}
-
-inline Point3D& Point3D::operator *= ( const double d )
-{
-    n[PX] *= d; n[PY] *= d; n[PZ] *= d; return *this;
-}
-
-inline Point3D& Point3D::operator /= ( const double d )
-{
-    double d_inv = 1./d; n[PX] *= d_inv; n[PY] *= d_inv; n[PZ] *= d_inv;
-    return *this;
-}
-
-inline void Point3D::setx(const double x) {
-    n[PX] = x;
-}
-
-inline void Point3D::sety(const double y) {
-    n[PY] = y;
-}
-
-inline void Point3D::setz(const double z) {
-    n[PZ] = z;
-}
-
-// QUERIES
-
-inline double& Point3D::operator [] ( int i)
-{
-    assert(! (i < PX || i > PZ));
-    return n[i];
-}
-
-inline double Point3D::operator [] ( int i) const {
-    assert(! (i < PX || i > PZ));
-    return n[i];
-}
-
-
-inline double Point3D::x() const { return n[PX]; }
-
-inline double Point3D::y() const { return n[PY]; }
-
-inline double Point3D::z() const { return n[PZ]; }
-
-inline double Point3D::lon() const { return n[PX]; }
-
-inline double Point3D::lat() const { return n[PY]; }
-
-inline double Point3D::radius() const { return n[PZ]; }
-
-inline double Point3D::elev() const { return n[PZ]; }
-
-
-// FRIENDS
-
-inline Point3D operator - (const Point3D& a)
-{
-    return Point3D(-a.n[PX],-a.n[PY],-a.n[PZ]);
-}
-
-inline Point3D operator + (const Point3D& a, const Point3D& b)
-{
-    return Point3D(a) += b;
-}
-
-inline Point3D operator - (const Point3D& a, const Point3D& b)
-{
-    return Point3D(a) -= b;
-}
-
-inline Point3D operator * (const Point3D& a, const double d)
-{
-    return Point3D(a) *= d;
-}
-
-inline Point3D operator * (const double d, const Point3D& a)
-{
-    return a*d;
-}
-
-inline Point3D operator / (const Point3D& a, const double d)
-{
-    return Point3D(a) *= (1.0 / d );
-}
-
-inline bool operator == (const Point3D& a, const Point3D& b)
-{
-    return
-	fabs(a.n[PX] - b.n[PX]) < fgPoint3_Epsilon &&
-	fabs(a.n[PY] - b.n[PY]) < fgPoint3_Epsilon &&
-	fabs(a.n[PZ] - b.n[PZ]) < fgPoint3_Epsilon;
-}
-
-inline bool operator != (const Point3D& a, const Point3D& b)
-{
-    return !(a == b);
-}
-
-// Special functions
-
-inline double
-Point3D::distance3D(const Point3D& a ) const
-{
-    double x, y, z;
-
-    x = n[PX] - a.n[PX];
-    y = n[PY] - a.n[PY];
-    z = n[PZ] - a.n[PZ];
-
-    return sqrt(x*x + y*y + z*z);
-}
-
-
-inline double
-Point3D::distance3Dsquared(const Point3D& a ) const
-{
-    double x, y, z;
-
-    x = n[PX] - a.n[PX];
-    y = n[PY] - a.n[PY];
-    z = n[PZ] - a.n[PZ];
-
-    return(x*x + y*y + z*z);
-}
-
-
-#endif // _POINT3D_HXX
-
-
diff --git a/Lib/Math/polar3d.cxx b/Lib/Math/polar3d.cxx
deleted file mode 100644
index fc51b02d4..000000000
--- a/Lib/Math/polar3d.cxx
+++ /dev/null
@@ -1,61 +0,0 @@
-// polar.cxx -- routines to deal with polar math and transformations
-//
-// Written by Curtis Olson, started June 1997.
-//
-// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#include 
-#include 
-
-#include 
-
-#include "polar3d.hxx"
-
-
-// Find the Altitude above the Ellipsoid (WGS84) given the Earth
-// Centered Cartesian coordinate vector Distances are specified in
-// meters.
-double fgGeodAltFromCart(const Point3D& cp)
-{
-    double t_lat, x_alpha, mu_alpha;
-    double lat_geoc, radius;
-    double result;
-
-    lat_geoc = FG_PI_2 - atan2( sqrt(cp.x()*cp.x() + cp.y()*cp.y()), cp.z() );
-    radius = sqrt( cp.x()*cp.x() + cp.y()*cp.y() + cp.z()*cp.z() );
-	
-    if( ( (FG_PI_2 - lat_geoc) < ONE_SECOND )        // near North pole
-	|| ( (FG_PI_2 + lat_geoc) < ONE_SECOND ) )   // near South pole
-    {
-	result = radius - EQUATORIAL_RADIUS_M*E;
-    } else {
-	t_lat = tan(lat_geoc);
-	x_alpha = E*EQUATORIAL_RADIUS_M/sqrt(t_lat*t_lat + E*E);
-	mu_alpha = atan2(sqrt(RESQ_M - x_alpha*x_alpha),E*x_alpha);
-	if (lat_geoc < 0) {
-	    mu_alpha = - mu_alpha;
-	}
-	result = (radius - x_alpha/cos(lat_geoc))*cos(mu_alpha - lat_geoc);
-    }
-
-    return(result);
-}
-
-
diff --git a/Lib/Math/polar3d.hxx b/Lib/Math/polar3d.hxx
deleted file mode 100644
index 303bb55bd..000000000
--- a/Lib/Math/polar3d.hxx
+++ /dev/null
@@ -1,67 +0,0 @@
-// polar.hxx -- routines to deal with polar math and transformations
-//
-// Written by Curtis Olson, started June 1997.
-//
-// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifndef _POLAR_HXX
-#define _POLAR_HXX
-
-
-#ifndef __cplusplus                                                          
-# error This library requires C++
-#endif                                   
-
-
-#include 
-#include 
-
-
-// Find the Altitude above the Ellipsoid (WGS84) given the Earth
-// Centered Cartesian coordinate vector Distances are specified in
-// meters.
-double fgGeodAltFromCart(const Point3D& cp);
-
-
-// Convert a polar coordinate to a cartesian coordinate.  Lon and Lat
-// must be specified in radians.  The FG convention is for distances
-// to be specified in meters
-inline Point3D fgPolarToCart3d(const Point3D& p) {
-    double tmp = cos( p.lat() ) * p.radius();
-
-    return Point3D( cos( p.lon() ) * tmp,
-		    sin( p.lon() ) * tmp,
-		    sin( p.lat() ) * p.radius() );
-}
-
-
-// Convert a cartesian coordinate to polar coordinates (lon/lat
-// specified in radians.  Distances are specified in meters.
-inline Point3D fgCartToPolar3d(const Point3D& cp) {
-    return Point3D( atan2( cp.y(), cp.x() ),
-		    FG_PI_2 - 
-		    atan2( sqrt(cp.x()*cp.x() + cp.y()*cp.y()), cp.z() ),
-		    sqrt(cp.x()*cp.x() + cp.y()*cp.y() + cp.z()*cp.z()) );
-}
-
-
-#endif // _POLAR_HXX
-
-
diff --git a/Lib/Math/vector.cxx b/Lib/Math/vector.cxx
deleted file mode 100644
index 46ed967c2..000000000
--- a/Lib/Math/vector.cxx
+++ /dev/null
@@ -1,129 +0,0 @@
-// vector.cxx -- additional vector routines
-//
-// Written by Curtis Olson, started December 1997.
-//
-// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#include 
-#include 
-
-// #include 
-
-#include "vector.hxx"
-
-#include "mat3.h"
-
-
-#if !defined( USE_XTRA_MAT3_INLINES )
-// Map a vector onto the plane specified by normal
-void map_vec_onto_cur_surface_plane(MAT3vec normal, MAT3vec v0, MAT3vec vec,
-				    MAT3vec result)
-{
-    MAT3vec u1, v, tmp;
-
-    // calculate a vector "u1" representing the shortest distance from
-    // the plane specified by normal and v0 to a point specified by
-    // "vec".  "u1" represents both the direction and magnitude of
-    // this desired distance.
-
-    // u1 = ( (normal  vec) / (normal  normal) ) * normal
-
-    MAT3_SCALE_VEC( u1,
-		    normal,
-		    ( MAT3_DOT_PRODUCT(normal, vec) /
-		      MAT3_DOT_PRODUCT(normal, normal)
-		      )
-		    );
-
-    // printf("  vec = %.2f, %.2f, %.2f\n", vec[0], vec[1], vec[2]);
-    // printf("  v0 = %.2f, %.2f, %.2f\n", v0[0], v0[1], v0[2]);
-    // printf("  u1 = %.2f, %.2f, %.2f\n", u1[0], u1[1], u1[2]);
-   
-    // calculate the vector "v" which is the vector "vec" mapped onto
-    // the plane specified by "normal" and "v0".
-
-    // v = v0 + vec - u1
-
-    MAT3_ADD_VEC(tmp, v0, vec);
-    MAT3_SUB_VEC(v, tmp, u1);
-    // printf("  v = %.2f, %.2f, %.2f\n", v[0], v[1], v[2]);
-
-    // Calculate the vector "result" which is "v" - "v0" which is a
-    // directional vector pointing from v0 towards v
-
-    // result = v - v0
-
-    MAT3_SUB_VEC(result, v, v0);
-    // printf("  result = %.2f, %.2f, %.2f\n", 
-    // result[0], result[1], result[2]);
-}
-#endif // !defined( USE_XTRA_MAT3_INLINES )
-
-
-// Given a point p, and a line through p0 with direction vector d,
-// find the shortest distance from the point to the line
-double fgPointLine(MAT3vec p, MAT3vec p0, MAT3vec d) {
-    MAT3vec u, u1, v;
-    double ud, dd, tmp;
-    
-    // u = p - p0
-    MAT3_SUB_VEC(u, p, p0);
-
-    // calculate the projection, u1, of u along d.
-    // u1 = ( dot_prod(u, d) / dot_prod(d, d) ) * d;
-    ud = MAT3_DOT_PRODUCT(u, d);
-    dd = MAT3_DOT_PRODUCT(d, d);
-    tmp = ud / dd;
-
-    MAT3_SCALE_VEC(u1, d, tmp);;
-
-    // v = u - u1 = vector from closest point on line, p1, to the
-    // original point, p.
-    MAT3_SUB_VEC(v, u, u1);
-
-    return sqrt(MAT3_DOT_PRODUCT(v, v));
-}
-
-
-// Given a point p, and a line through p0 with direction vector d,
-// find the shortest distance (squared) from the point to the line
-double fgPointLineSquared(MAT3vec p, MAT3vec p0, MAT3vec d) {
-    MAT3vec u, u1, v;
-    double ud, dd, tmp;
-    
-    // u = p - p0
-    MAT3_SUB_VEC(u, p, p0);
-
-    // calculate the projection, u1, of u along d.
-    // u1 = ( dot_prod(u, d) / dot_prod(d, d) ) * d;
-    ud = MAT3_DOT_PRODUCT(u, d);
-    dd = MAT3_DOT_PRODUCT(d, d);
-    tmp = ud / dd;
-
-    MAT3_SCALE_VEC(u1, d, tmp);;
-
-    // v = u - u1 = vector from closest point on line, p1, to the
-    // original point, p.
-    MAT3_SUB_VEC(v, u, u1);
-
-    return ( MAT3_DOT_PRODUCT(v, v) );
-}
-
-
diff --git a/Lib/Math/vector.hxx b/Lib/Math/vector.hxx
deleted file mode 100644
index a20dd2597..000000000
--- a/Lib/Math/vector.hxx
+++ /dev/null
@@ -1,63 +0,0 @@
-// vector.hxx -- additional vector routines
-//
-// Written by Curtis Olson, started December 1997.
-//
-// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifndef _VECTOR_HXX
-#define _VECTOR_HXX
-
-
-#ifndef __cplusplus                                                          
-# error This library requires C++
-#endif                                   
-
-
-#include "mat3.h"
-
-
-// Map a vector onto the plane specified by normal
-#if defined( USE_XTRA_MAT3_INLINES )
-#  define map_vec_onto_cur_surface_plane(normal, v0, vec, result) { \
-	double scale = ((normal[0]*vec[0]+normal[1]*vec[1]+normal[2]*vec[2]) / \
-	       (normal[0]*normal[0]+normal[1]*normal[1]+normal[2]*normal[2])); \
-	result[0] = vec[0]-normal[0]*scale; \
-	result[1] = vec[1]-normal[1]*scale; \
-	result[2] = vec[2]-normal[2]*scale; \
-  }
-#else
-  void map_vec_onto_cur_surface_plane(MAT3vec normal, MAT3vec v0, MAT3vec vec,
-				    MAT3vec result);
-#endif //defined( USE_XTRA_MAT3_INLINES )
-
-
-// Given a point p, and a line through p0 with direction vector d,
-// find the shortest distance from the point to the line
-double fgPointLine(MAT3vec p, MAT3vec p0, MAT3vec d);
-
-
-// Given a point p, and a line through p0 with direction vector d,
-// find the shortest distance (squared) from the point to the line
-double fgPointLineSquared(MAT3vec p, MAT3vec p0, MAT3vec d);
-
-
-#endif // _VECTOR_HXX
-
-
diff --git a/Lib/Misc/CREDITS b/Lib/Misc/CREDITS
deleted file mode 100644
index b2528cdc2..000000000
--- a/Lib/Misc/CREDITS
+++ /dev/null
@@ -1,16 +0,0 @@
-The following files were unashamedly borrowed from other projects:
-
-zfstream.hxx
-zfstream.cxx
-	zlib/contrib/iostream
-
-stopwatch.hxx was (blitz/time.h)
-	blitz
-
-Some modifications have been made to fit in with the FlightGear scheme of things.
-
-As far as I'm aware they are all covered by GNU's licensing agreements.
-
-Many thanks to their respective authors.
-
-Bernie Bright (bbright@c031.aone.net.au)
diff --git a/Lib/Misc/Makefile.am b/Lib/Misc/Makefile.am
deleted file mode 100644
index 8cab48b37..000000000
--- a/Lib/Misc/Makefile.am
+++ /dev/null
@@ -1,12 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-noinst_LIBRARIES = libMisc.a
-
-libMisc_a_SOURCES = \
-	fgpath.cxx fgpath.hxx \
-	fgstream.cxx fgstream.hxx \
-	stopwatch.hxx \
-	strutils.cxx strutils.hxx \
-	zfstream.cxx zfstream.hxx
-
-INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib
diff --git a/Lib/Misc/fgpath.cxx b/Lib/Misc/fgpath.cxx
deleted file mode 100644
index d31b44c60..000000000
--- a/Lib/Misc/fgpath.cxx
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// fgpath.cxx -- routines to abstract out path separator differences
-//               between MacOS and the rest of the world
-//
-// Written by Curtis L. Olson, started April 1999.
-//
-// Copyright (C) 1999  Curtis L. Olson - curt@flightgear.org
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#include "fgpath.hxx"
-
-
-// If Unix, replace all ":" with "/".  If MacOS, replace all "/" with
-// ":" it should go without saying that neither of these characters
-// should be used in file or directory names.  In windoze, allow the
-// second character to be a ":" for things like c:\foo\bar
-
-static string fix_path( const string path ) {
-    string result = path;
-
-    for ( int i = 0; i < (int)path.size(); ++i ) {
-#if defined( WIN32 )
-	// for windoze, don't replace the ":" for the second character
-	if ( i == 1 ) {
-	    continue;
-	}
-#endif
-	if ( result[i] == FG_BAD_PATH_SEP ) {
-	    result[i] = FG_PATH_SEP;
-	}
-    }
-
-    return result;
-}
-
-
-// default constructor
-FGPath::FGPath() {
-    path = "";
-}
-
-
-// create a path based on "path"
-FGPath::FGPath( const string p ) {
-    set( p );
-}
-
-
-// destructor
-FGPath::~FGPath() {
-}
-
-
-// set path
-void FGPath::set( const string p ) {
-    path = fix_path( p );
-}
-
-
-// append another piece to the existing path
-void FGPath::append( const string p ) {
-    string part = fix_path( p );
-
-    if ( path.size() == 0 ) {
-	path = part;
-    } else {
-	if ( part[0] != FG_PATH_SEP ) {
-	    path += FG_PATH_SEP;
-	}
-	path += part;
-    }
-}
-
-
-// concatenate a string to the end of the path without inserting a
-// path separator
-void FGPath::concat( const string p ) {
-    string part = fix_path( p );
-
-    if ( path.size() == 0 ) {
-	path = part;
-    } else {
-	path += part;
-    }
-}
diff --git a/Lib/Misc/fgpath.hxx b/Lib/Misc/fgpath.hxx
deleted file mode 100644
index 30ba3b7cd..000000000
--- a/Lib/Misc/fgpath.hxx
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-// fgpath.hxx -- routines to abstract out path separator differences
-//               between MacOS and the rest of the world
-//
-// Written by Curtis L. Olson, started April 1999.
-//
-// Copyright (C) 1999  Curtis L. Olson - curt@flightgear.org
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifndef _FGPATH_HXX
-#define _FGPATH_HXX
-
-
-#ifdef HAVE_CONFIG_H
-#  include 
-#endif
-
-#include 
-
-#include STL_STRING
-
-FG_USING_STD(string);
-
-
-#ifdef MACOS
-#  define FG_PATH_SEP ':'
-#  define FG_BAD_PATH_SEP '/'
-#else
-#  define FG_PATH_SEP '/'
-#  define FG_BAD_PATH_SEP ':'
-#endif
-
-
-class FGPath {
-
-private:
-
-    string path;
-
-public:
-
-    // default constructor
-    FGPath();
-
-    // create a path based on "path"
-    FGPath( const string p );
-
-    // destructor
-    ~FGPath();
-
-    // set path
-    void set( const string p );
-
-    // append another piece to the existing path
-    void append( const string p );
-
-    // concatenate a string to the end of the path without inserting a
-    // path separator
-    void concat( const string p );
-
-    // get the path string
-    inline string str() const { return path; }
-    inline const char *c_str() { return path.c_str(); }
-};
-
-
-#endif // _FGPATH_HXX
-
-
diff --git a/Lib/Misc/fgstream.cxx b/Lib/Misc/fgstream.cxx
deleted file mode 100644
index 2385dcdad..000000000
--- a/Lib/Misc/fgstream.cxx
+++ /dev/null
@@ -1,157 +0,0 @@
-// zlib input file stream wrapper.
-//
-// Written by Bernie Bright, 1998
-//
-// Copyright (C) 1998  Bernie Bright - bbright@c031.aone.net.au
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-#include  // isspace()
-#include 
-
-fg_gzifstream::fg_gzifstream()
-    : istream(&gzbuf)
-{
-}
-
-//-----------------------------------------------------------------------------
-//
-// Open a possibly gzipped file for reading.
-//
-fg_gzifstream::fg_gzifstream( const string& name, ios_openmode io_mode )
-    : istream(&gzbuf)
-{
-    this->open( name, io_mode );
-}
-
-//-----------------------------------------------------------------------------
-//
-// Attach a stream to an already opened file descriptor.
-//
-fg_gzifstream::fg_gzifstream( int fd, ios_openmode io_mode )
-    : istream(&gzbuf)
-{
-    gzbuf.attach( fd, io_mode );
-}
-
-//-----------------------------------------------------------------------------
-//
-// Open a possibly gzipped file for reading.
-// If the initial open fails and the filename has a ".gz" extension then
-// remove the extension and try again.
-// If the initial open fails and the filename doesn't have a ".gz" extension
-// then append ".gz" and try again.
-//
-void
-fg_gzifstream::open( const string& name, ios_openmode io_mode )
-{
-    gzbuf.open( name.c_str(), io_mode );
-    if ( ! gzbuf.is_open() )
-    {
-	string s = name;
-	if ( s.substr( s.length() - 3, 3 ) == ".gz" )
-	{
-	    // remove ".gz" suffix
-	    s.replace( s.length() - 3, 3, "" );
-// 	    s.erase( s.length() - 3, 3 );
-	}
-	else
-	{
-	    // Append ".gz" suffix
-	    s += ".gz";
-	}
-
-	// Try again.
-	gzbuf.open( s.c_str(), io_mode );
-    }
-}
-
-void
-fg_gzifstream::attach( int fd, ios_openmode io_mode )
-{
-    gzbuf.attach( fd, io_mode );
-}
-
-//
-// Manipulators
-//
-
-istream&
-skipeol( istream& in )
-{
-    char c = '\0';
-    // skip to end of line.
-
-#ifdef __MWERKS__
-    while ( in.get(c) && c != '\0' ) {
-#else
-    while ( in.get(c) ) {
-#endif
-    	if ( (c == '\n') || (c == '\r') ) {
-	    break;
-	}	
-    }
-
-    return in;
-}
-
-istream&
-skipws( istream& in ) {
-    char c;
-#ifdef __MWERKS__
-    while ( in.get(c) && c != '\0' ) {
-#else
-    while ( in.get(c) ) {
-#endif
-
-#ifdef __MWERKS__
-	if ( ! isspace( c ) && c != '\n' ) {
-#else
-	if ( ! isspace( c ) ) {
-#endif
-	    // put pack the non-space character
-	    in.putback(c);
-	    break;
-	}
-    }
-    return in;
-}
-
-istream&
-skipcomment( istream& in )
-{
-    while ( in )
-    {
-	// skip whitespace
-#ifdef __MWERKS__
-	in >> ::skipws;
-#else
-	in >> skipws;
-#endif
-
-	char c;
-	if ( in.get( c ) && c != '#' )
-	{
-	    // not a comment
-	    in.putback(c);
-	    break;
-	}
-	in >> skipeol;
-    }
-    return in;
-}
-
diff --git a/Lib/Misc/fgstream.hxx b/Lib/Misc/fgstream.hxx
deleted file mode 100644
index 84b0056b4..000000000
--- a/Lib/Misc/fgstream.hxx
+++ /dev/null
@@ -1,102 +0,0 @@
-// zlib input file stream wrapper.
-//
-// Written by Bernie Bright, 1998
-//
-// Copyright (C) 1998  Bernie Bright - bbright@c031.aone.net.au
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-#ifndef _FGSTREAM_HXX
-#define _FGSTREAM_HXX
-
-#ifndef __cplusplus                                                          
-# error This library requires C++
-#endif                                   
-
-#ifdef HAVE_CONFIG_H
-#  include "Include/config.h"
-#endif
-
-#include 
-
-#if defined( FG_HAVE_STD_INCLUDES )
-#  include 
-#elif defined ( FG_HAVE_NATIVE_SGI_COMPILERS )
-#  include 
-#elif defined ( __BORLANDC__ )
-#  include 
-#else
-#  include 
-#endif
-
-#include STL_STRING
-
-#include "zfstream.hxx"
-
-FG_USING_STD(string);
-
-#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
-FG_USING_STD(istream);
-#endif
-
-
-//-----------------------------------------------------------------------------
-//
-// Envelope class for gzifstream.
-//
-class fg_gzifstream : private gzifstream_base, public istream
-{
-public:
-    //
-    fg_gzifstream();
-
-    // Attempt to open a file with and without ".gz" extension.
-    fg_gzifstream( const string& name,
-		   ios_openmode io_mode = ios_in | ios_binary );
-
-    // 
-    fg_gzifstream( int fd, ios_openmode io_mode = ios_in|ios_binary );
-
-    // Attempt to open a file with and without ".gz" extension.
-    void open( const string& name,
-	       ios_openmode io_mode = ios_in|ios_binary );
-
-    void attach( int fd, ios_openmode io_mode = ios_in|ios_binary );
-
-    void close() { gzbuf.close(); }
-
-    bool is_open() { return gzbuf.is_open(); }
-
-private:
-    // Not defined!
-    fg_gzifstream( const fg_gzifstream& );    
-    void operator= ( const fg_gzifstream& );    
-};
-
-// istream manipulator that skips to end of line.
-istream& skipeol( istream& in );
-
-// istream manipulator that skips over white space.
-istream& skipws( istream& in );
-
-// istream manipulator that skips comments and white space.
-// A comment starts with '#'.
-istream& skipcomment( istream& in );
-
-
-#endif /* _FGSTREAM_HXX */
-
diff --git a/Lib/Misc/stopwatch.hxx b/Lib/Misc/stopwatch.hxx
deleted file mode 100644
index 2bdeb4b4d..000000000
--- a/Lib/Misc/stopwatch.hxx
+++ /dev/null
@@ -1,121 +0,0 @@
-/***************************************************************************
- * stopwatch.hxx        Timer class, for use in benchmarking
- *
- * Based on blitz/Timer.h
- *
- * $Id$
- *
- * Copyright (C) 1997,1998 Todd Veldhuizen 
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * Suggestions:          blitz-suggest@cybervision.com
- * Bugs:                 blitz-bugs@cybervision.com
- *
- * For more information, please see the Blitz++ Home Page:
- *    http://seurat.uwaterloo.ca/blitz/
- *
- */
-
-// This class is not portable to non System V platforms.
-// It will need to be rewritten for Windows, NT, Mac.
-// NEEDS_WORK
-
-#ifndef _STOPWATCH_HXX
-#define _STOPWATCH_HXX
-
-#ifndef __cplusplus                                                          
-# error This library requires C++
-#endif                                   
-
-#ifdef HAVE_CONFIG_H
-#  include "config.h"
-#endif
-
-#if defined(__linux__) && ! defined(HAVE_GETRUSAGE)
-#  define HAVE_GETRUSAGE
-#endif
-
-#if defined( WIN32 ) && defined( HAVE_GETRUSAGE )
-#  undef HAVE_GETRUSAGE
-#endif // WIN32
-
-#if defined( HAVE_GETRUSAGE )
-#  if defined( __FreeBSD__ )
-#    include 
-#  endif 
-#  include 
-#  include 
-#  include 
-#elif defined( WIN32 )
-#  include 
-#else
-#  include 
-#endif
-
-class StopWatch {
-
-public:
-    StopWatch() 
-    { 
-//         state_ = uninitialized;
-    }
-
-    void start()
-    { 
-//         state_ = running;
-        t1_ = systemTime();
-    }
-
-    void stop()
-    {
-        t2_ = systemTime();
-// 	BZPRECONDITION(state_ == running);
-// 	state_ = stopped;
-    }
-
-    double elapsedSeconds()
-    {
-//         BZPRECONDITION(state_ == stopped);
-        return t2_ - t1_;
-    }
-
-private:
-    StopWatch(StopWatch&) { }
-    void operator=(StopWatch&) { }
-
-    double systemTime()
-    {
-#if defined( HAVE_GETRUSAGE )
-        getrusage(RUSAGE_SELF, &resourceUsage_);
-        double seconds = resourceUsage_.ru_utime.tv_sec 
-            + resourceUsage_.ru_stime.tv_sec;
-        double micros  = resourceUsage_.ru_utime.tv_usec 
-            + resourceUsage_.ru_stime.tv_usec;
-        return seconds + micros/1.0e6;
-#elif defined( WIN32 )
-	return double(GetTickCount()) * double(1e-3);
-#else
-        return clock() / (double) CLOCKS_PER_SEC;
-#endif
-    }
-
-//     enum { uninitialized, running, stopped } state_;
-
-#if defined( HAVE_GETRUSAGE )
-    struct rusage resourceUsage_;
-#endif
-
-    double t1_, t2_;
-};
-
-#endif // _STOPWATCH_HXX
-
diff --git a/Lib/Misc/strutils.cxx b/Lib/Misc/strutils.cxx
deleted file mode 100644
index 4f6e9c1f4..000000000
--- a/Lib/Misc/strutils.cxx
+++ /dev/null
@@ -1,71 +0,0 @@
-// String utilities.
-//
-// Written by Bernie Bright, 1998
-//
-// Copyright (C) 1998  Bernie Bright - bbright@c031.aone.net.au
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-#ifdef HAVE_CONFIG_H
-#  include "config.h"
-#endif
-
-#include "strutils.hxx"
-
-const string whitespace = " \n\r\t";
-
-//
-string
-trimleft( const string& s, const string& trimmings )
-{
-    string result;
-    string::size_type pos = s.find_first_not_of( trimmings );
-    if ( pos != string::npos )
-    {
-        result.assign( s.substr( pos ) );
-    }
-
-    return result;
-}
-
-//
-string
-trimright( const string& s, const string& trimmings )
-{
-    string result;
-
-    string::size_type pos = s.find_last_not_of( trimmings );
-    if ( pos == string::npos )
-    {
-	// Not found, return the original string.
-	result = s;
-    }
-    else
-    {
-        result.assign( s.substr( 0, pos+1 ) );
-    }
-
-    return result;
-}
-
-//
-string
-trim( const string& s, const string& trimmings )
-{
-    return trimright( trimleft( s, trimmings ), trimmings );
-}
-
diff --git a/Lib/Misc/strutils.hxx b/Lib/Misc/strutils.hxx
deleted file mode 100644
index 08392f455..000000000
--- a/Lib/Misc/strutils.hxx
+++ /dev/null
@@ -1,64 +0,0 @@
-// String utilities.
-//
-// Written by Bernie Bright, 1998
-//
-// Copyright (C) 1998  Bernie Bright - bbright@c031.aone.net.au
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-#ifndef STRUTILS_H
-#define STRUTILS_H
-
-#include 
-#include STL_STRING
-
-#ifdef FG_HAVE_STD_INCLUDES
-#  include 
-#else
-#  include 
-#endif
-
-FG_USING_STD(string);
-
-// Default characters to remove.
-extern const string whitespace;
-
-// Returns a string with trailing characters removed.
-string trimleft( const string& s, const string& trimmings = whitespace );
-
-// Returns a string with leading characters removed.
-string trimright( const string& s, const string& trimmings = whitespace );
-
-// Returns a string with leading and trailing characters removed.
-string trim( const string& s, const string& trimmings = whitespace );
-
-//-----------------------------------------------------------------------------
-
-inline double
-atof( const string& str )
-{
-    return ::atof( str.c_str() );
-}
-
-inline int
-atoi( const string& str )
-{
-    return ::atoi( str.c_str() );
-}
-
-#endif // STRUTILS_H
-
diff --git a/Lib/Misc/zfstream.cxx b/Lib/Misc/zfstream.cxx
deleted file mode 100644
index 28b6dadc3..000000000
--- a/Lib/Misc/zfstream.cxx
+++ /dev/null
@@ -1,309 +0,0 @@
-//  A C++ I/O streams interface to the zlib gz* functions
-//
-// Written by Bernie Bright, 1998
-// Based on zlib/contrib/iostream/ by Kevin Ruland 
-//
-// Copyright (C) 1998  Bernie Bright - bbright@c031.aone.net.au
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-#include 
-#include "zfstream.hxx"
-
-//
-// Construct a gzfilebuf object.
-// Allocate memory for 'get' buffer and zero all buffer pointers.
-//
-gzfilebuf::gzfilebuf()
-    : streambuf(),
-      file(NULL),
-      mode(0),
-      own_file_descriptor(false),
-      ibuf_size(0),
-      ibuffer(0)
-{
-//     try {
-    ibuf_size = page_size / sizeof(char);
-    ibuffer = new char [ibuf_size];
-//     } catch (...) {
-// 	delete [] ibuffer;
-//     }
-
-    // Null get and set pointers.
-    this->setg(0,0,0);
-    this->setp(0,0);
-}
-
-gzfilebuf::~gzfilebuf()
-{
-    sync();
-    if ( own_file_descriptor )
-	this->close();
-    delete [] ibuffer;
-}
-
-void
-gzfilebuf::cvt_iomode( char* p, ios_openmode io_mode )
-{
-//     memset( char_mode, '\0', 10 );
-//     char* p = char_mode;
-
-    if ( io_mode & ios_in )
-    {
-	mode = ios_in;
-	*p++ = 'r';
-    }
-    else if ( io_mode & ios_app )
-    {
-	mode = ios_app;
-	*p++ = 'a';
-    }
-    else
-    {
-	mode = ios_out;
-	*p++ = 'w';
-    }
-
-    if ( io_mode & ios_binary )
-    {
-	mode |= ios_binary;
-	*p++ = 'b';
-    }
-
-    // Hard code the compression level
-    if ( io_mode & (ios_out | ios_app) )
-    {
-	*p++ = '9';
-    }
-
-    *p = '\0';
-}
-
-gzfilebuf*
-gzfilebuf::open( const char *name, ios_openmode io_mode )
-{
-    if ( is_open() )
-	return NULL;
-
-    char char_mode[10];
-    cvt_iomode( char_mode, io_mode );
-    if ( (file = gzopen(name, char_mode)) == NULL )
-	return NULL;
-
-    own_file_descriptor = true;
-
-    return this;
-}
-
-gzfilebuf*
-gzfilebuf::attach( int file_descriptor, ios_openmode io_mode )
-{
-    if ( is_open() )
-	return NULL;
-
-    char char_mode[10];
-    cvt_iomode( char_mode, io_mode );
-    if ( (file = gzdopen(file_descriptor, char_mode)) == NULL )
-	return NULL;
-
-    own_file_descriptor = false;
-
-    return this;
-}
-
-gzfilebuf*
-gzfilebuf::close()
-{
-    if ( is_open() )
-    {
-	sync();
-	gzclose( file );
-	file = NULL;
-    }
-
-    return this;
-}
-
-// int
-// gzfilebuf::setcompressionlevel( int comp_level )
-// {
-//     return gzsetparams(file, comp_level, -2);
-// }
-
-// int
-// gzfilebuf::setcompressionstrategy( int comp_strategy )
-// {
-//     return gzsetparams(file, -2, comp_strategy);
-// }
-
-
-streampos
-gzfilebuf::seekoff( streamoff, ios_seekdir, int )
-{
-    return streampos(EOF);
-}
-
-gzfilebuf::int_type
-gzfilebuf::overflow( int_type )
-{
-#if 0
-    if ( !is_open() || !(mode & ios::out) )
-	return EOF;
-
-    if ( !base() )
-    {
-	if ( allocate() == EOF )
-	    return EOF;
-	setg(0,0,0);
-    }
-    else
-    {
-	if (in_avail())
-	{
-	    return EOF;
-	}
-
-	if (out_waiting())
-	{
-	    if (flushbuf() == EOF)
-		return EOF;
-	}
-    }
-
-    int bl = blen();
-    setp( base(), base() + bl);
-
-    if ( c != EOF )
-    {
-	*pptr() = c;
-	pbump(1);
-    }
-#endif
-    return 0;
-}
-
-int
-gzfilebuf::sync()
-{
-    if ( !is_open() )
-	return EOF;
-
-    if ( pptr() != 0 && pptr() > pbase() )
-	return flushbuf();
-
-    return 0;
-}
-
-gzfilebuf::int_type
-gzfilebuf::flushbuf()
-{
-    char* q = pbase();
-    int n = pptr() - q;
-
-    if ( gzwrite( file, q, n) < n )
-	return traits_type::eof();
-
-    setp(0,0);
-
-    return 0;
-}
-
-gzfilebuf::int_type
-gzfilebuf::underflow()
-{
-//     cerr << "gzfilebuf::underflow(): gptr()=" << (void*)gptr() << endl;
-    // Error if the file not open for reading.
-    if ( !is_open() || !(mode & ios_in) )
-	return traits_type::eof();
-
-    // If the input buffer is empty then try to fill it.
-    if ( gptr() != 0 && gptr() < egptr() )
-    {
-	return int_type(*gptr());
-    }
-    else
-    {
-	return fillbuf() == EOF ? traits_type::eof() : int_type(*gptr());
-    }
-}
-
-//
-// Load the input buffer from the underlying gz file.
-// Returns number of characters read, or EOF.
-//
-int
-gzfilebuf::fillbuf()
-{
-    int t = gzread( file, ibuffer, ibuf_size );
-    if ( t <= 0)
-    {
-	// disable get area
-	setg(0,0,0);
-	return EOF;
-    }
-
-    // Set the input (get) pointers
-    setg( ibuffer, ibuffer, ibuffer+t );
-
-//     cerr << "gzfilebuf::fillbuf():"
-// 	 << " t=" << t
-// 	 << ", ibuffer=" << (void*)ibuffer
-// 	 << ", ibuffer+t=" << (void*)(ibuffer+t) << endl;
-
-    return t;
-}
-
-#if 0
-gzifstream::gzifstream()
-    : istream(&buffer), buffer()
-{
-    clear( ios_badbit );
-}
-
-gzifstream::gzifstream( const char *name, ios_openmode io_mode )
-    : istream(&buffer), buffer()
-{
-    this->open( name, io_mode );
-}
-
-gzifstream::gzifstream( int fd, ios_openmode io_mode )
-    : istream(&buffer), buffer()
-{
-    buffer.attach( fd, io_mode );
-}
-
-gzifstream::~gzifstream()
-{
-}
-
-void
-gzifstream::open( const char *name, ios_openmode io_mode )
-{
-    if ( !buffer.open( name, io_mode ) )
-	clear( ios_failbit | ios_badbit );
-    else
-	clear();
-}
-
-void
-gzifstream::close()
-{
-    if ( !buffer.close() )
-	clear( ios_failbit | ios_badbit );
-}
-#endif
-
diff --git a/Lib/Misc/zfstream.hxx b/Lib/Misc/zfstream.hxx
deleted file mode 100644
index d2341b659..000000000
--- a/Lib/Misc/zfstream.hxx
+++ /dev/null
@@ -1,154 +0,0 @@
-//  A C++ I/O streams interface to the zlib gz* functions
-//
-// Written by Bernie Bright, 1998
-// Based on zlib/contrib/iostream/ by Kevin Ruland 
-//
-// Copyright (C) 1998  Bernie Bright - bbright@c031.aone.net.au
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-#ifndef _zfstream_hxx
-#define _zfstream_hxx
-
-#include "zlib/zlib.h"
-#include "Include/compiler.h"
-
-#ifdef FG_HAVE_STD_INCLUDES
-
-#  include 
-#  include 
-
-#  define ios_openmode ios_base::openmode
-#  define ios_in       ios_base::in
-#  define ios_out      ios_base::out
-#  define ios_app      ios_base::app
-#  define ios_binary   ios_base::binary
-
-#  define ios_seekdir  ios_base::seekdir
-
-#  define ios_badbit   ios_base::badbit
-#  define ios_failbit  ios_base::failbit
-
-FG_USING_STD(streambuf);
-FG_USING_STD(ios_base);
-FG_USING_STD(streampos);
-FG_USING_STD(streamoff);
-
-#else
-
-#  ifdef FG_HAVE_STREAMBUF
-#    include 
-#    include 
-#  else
-#    include 
-#  endif
-
-//#  define ios_openmode ios::open_mode
-#  define ios_openmode int
-#  define ios_in       ios::in
-#  define ios_out      ios::out
-#  define ios_app      ios::app
-
-#if defined(__GNUC__) && __GNUC_MINOR__ < 8
-#  define ios_binary   ios::bin
-#elif defined( FG_HAVE_NATIVE_SGI_COMPILERS )
-#  define ios_binary   0
-#else
-#  define ios_binary   ios::binary
-#endif
-
-#  define ios_seekdir  ios::seek_dir
-
-#  define ios_badbit   ios::badbit
-#  define ios_failbit  ios::failbit
-
-#  include "Include/fg_traits.hxx"
-
-#endif // FG_HAVE_STD_INCLUDES
-
-//-----------------------------------------------------------------------------
-//
-//
-//
-class gzfilebuf : public streambuf
-{
-public:
-
-#ifndef FG_HAVE_STD_INCLUDES
-    typedef char_traits           traits_type;
-    typedef char_traits::int_type int_type;
-    typedef char_traits::pos_type pos_type;
-    typedef char_traits::off_type off_type;
-#endif
-
-    gzfilebuf();
-    virtual ~gzfilebuf();
-
-    gzfilebuf* open( const char* name, ios_openmode io_mode );
-    gzfilebuf* attach( int file_descriptor, ios_openmode io_mode );
-    gzfilebuf* close();
-
-//     int setcompressionlevel( int comp_level );
-//     int setcompressionstrategy( int comp_strategy );
-    bool is_open() const { return (file != NULL); }
-    virtual streampos seekoff( streamoff off, ios_seekdir way, int which );
-    virtual int sync();
-
-protected:
-
-    virtual int_type underflow();
-    virtual int_type overflow( int_type c = traits_type::eof() );
-
-private:
-
-    int_type flushbuf();
-    int fillbuf();
-
-    // Convert io_mode to "rwab" string.
-    void cvt_iomode( char* mode_str, ios_openmode io_mode );
-
-private:
-
-    gzFile file;
-    ios_openmode mode;
-    bool own_file_descriptor;
-
-    // Get (input) buffer.
-    int ibuf_size;
-    char* ibuffer;
-
-    enum { page_size = 4096 };
-
-private:
-    // Not defined
-    gzfilebuf( const gzfilebuf& );
-    void operator= ( const gzfilebuf& );
-};
-
-//-----------------------------------------------------------------------------
-//
-// 
-//
-struct gzifstream_base
-{
-    gzifstream_base() {}
-
-    gzfilebuf gzbuf;
-};
-
-#endif // _zfstream_hxx
-
diff --git a/Lib/Serial/Makefile.am b/Lib/Serial/Makefile.am
deleted file mode 100644
index 66a9f1662..000000000
--- a/Lib/Serial/Makefile.am
+++ /dev/null
@@ -1,13 +0,0 @@
-bin_PROGRAMS = testserial
-
-noinst_LIBRARIES = libSerial.a
-
-libSerial_a_SOURCES = serial.cxx serial.hxx
-
-testserial_SOURCES = testserial.cxx
-
-testserial_LDADD = \
-	$(top_builddir)/Lib/Serial/libSerial.a \
-	$(top_builddir)/Lib/Debug/libDebug.a
-
-INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib
diff --git a/Lib/Serial/serial.cxx b/Lib/Serial/serial.cxx
deleted file mode 100644
index d623b15e6..000000000
--- a/Lib/Serial/serial.cxx
+++ /dev/null
@@ -1,336 +0,0 @@
-// serial.cxx -- Unix serial I/O support
-//
-// Written by Curtis Olson, started November 1998.
-//
-// Copyright (C) 1998  Curtis L. Olson - curt@flightgear.org
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifdef HAVE_CONFIG_H
-#  include 
-#endif
-
-#include "Include/compiler.h"
-#ifdef FG_HAVE_STD_INCLUDE
-#  include 
-#else
-#  include 
-#endif
-
-#if defined( WIN32 ) && !defined( __CYGWIN__) && !defined( __CYGWIN32__ )
-  // maybe include something???
-#else
-#  include 
-#  include 
-#  include 
-#  include 
-#  include 
-#endif
-
-#include 
-
-#include "serial.hxx"
-
-
-fgSERIAL::fgSERIAL()
-    : dev_open(false)
-{
-    // empty
-}
-
-fgSERIAL::fgSERIAL(const string& device, int baud) {
-    open_port(device);
-    
-    if ( dev_open ) {
-	set_baud(baud);
-    }
-}
-
-fgSERIAL::~fgSERIAL() {
-    // closing the port here screws us up because if we would even so
-    // much as make a copy of an fgSERIAL object and then delete it,
-    // the file descriptor gets closed.  Doh!!!
-}
-
-bool fgSERIAL::open_port(const string& device) {
-
-#if defined( WIN32 ) && !defined( __CYGWIN__) && !defined( __CYGWIN32__ )
-
-    fd = CreateFile( device.c_str(),
-        GENERIC_READ | GENERIC_WRITE,
-        0, // dwShareMode
-        NULL, // lpSecurityAttributes
-        OPEN_EXISTING,
-        FILE_FLAG_OVERLAPPED,
-        NULL );
-    if ( fd == INVALID_HANDLE_VALUE )
-    {
-        LPVOID lpMsgBuf;
-        FormatMessage(
-            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
-            FORMAT_MESSAGE_FROM_SYSTEM | 
-            FORMAT_MESSAGE_IGNORE_INSERTS,
-            NULL,
-            GetLastError(),
-            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
-            (LPTSTR) &lpMsgBuf,
-            0,
-            NULL );
-
-        FG_LOG( FG_SERIAL, FG_ALERT, "Error opening serial device \"" 
-            << device << "\" " << (const char*) lpMsgBuf );
-        LocalFree( lpMsgBuf );
-        return false;
-    }
-
-    dev_open = true;
-    return true;
-
-#else
-
-    struct termios config;
-
-    fd = open(device.c_str(), O_RDWR | O_NONBLOCK);
-    cout << "Serial fd created = " << fd << endl;
-
-    if ( fd  == -1 ) {
-	FG_LOG( FG_SERIAL, FG_ALERT, "Cannot open " << device
-		<< " for serial I/O" );
-	return false;
-    } else {
-	dev_open = true;
-    }
-
-    // set required port parameters 
-    if ( tcgetattr( fd, &config ) != 0 ) {
-	FG_LOG( FG_SERIAL, FG_ALERT, "Unable to poll port settings" );
-	return false;
-    }
-
-    // cfmakeraw( &config );
-
-    // cout << "config.c_iflag = " << config.c_iflag << endl;
-
-    // software flow control on
-    config.c_iflag |= IXON;
-    // config.c_iflag |= IXOFF;
-
-    // config.c_cflag |= CLOCAL;
-
-#if ! defined( sgi )    
-    // disable hardware flow control
-    config.c_cflag &= ~(CRTSCTS);
-#endif
-
-    // cout << "config.c_iflag = " << config.c_iflag << endl;
-
-    if ( tcsetattr( fd, TCSANOW, &config ) != 0 ) {
-	FG_LOG( FG_SERIAL, FG_ALERT, "Unable to update port settings" );
-	return false;
-    }
-
-    return true;
-#endif
-}
-
-
-bool fgSERIAL::close_port() {
-#if defined( WIN32 ) && !defined( __CYGWIN__) && !defined( __CYGWIN32__ )
-    CloseHandle( fd );
-#else
-    close(fd);
-#endif
-
-    return true;
-}
-
-
-bool fgSERIAL::set_baud(int baud) {
-
-#if defined( WIN32 ) && !defined( __CYGWIN__) && !defined( __CYGWIN32__ )
-
-    return true;
-
-#else
-
-    struct termios config;
-    speed_t speed = B9600;
-
-    if ( tcgetattr( fd, &config ) != 0 ) {
-	FG_LOG( FG_SERIAL, FG_ALERT, "Unable to poll port settings" );
-	return false;
-    }
-
-    if ( baud == 300 ) {
-	speed = B300;
-    } else if ( baud == 1200 ) {
-	speed = B1200;
-    } else if ( baud == 2400 ) {
-	speed = B2400;
-    } else if ( baud == 4800 ) {
-	speed = B4800;
-    } else if ( baud == 9600 ) {
-	speed = B9600;
-    } else if ( baud == 19200 ) {
-	speed = B19200;
-    } else if ( baud == 38400 ) {
-	speed = B38400;
-    } else if ( baud == 57600 ) {
-	speed = B57600;
-    } else if ( baud == 115200 ) {
-	speed = B115200;
-#if defined( linux ) || defined( __FreeBSD__ )
-    } else if ( baud == 230400 ) {
-	speed = B230400;
-#endif
-    } else {
-	FG_LOG( FG_SERIAL, FG_ALERT, "Unsupported baud rate " << baud );
-	return false;
-    }
-
-    if ( cfsetispeed( &config, speed ) != 0 ) {
-	FG_LOG( FG_SERIAL, FG_ALERT, "Problem setting input baud rate" );
-	return false;
-    }
-
-    if ( cfsetospeed( &config, speed ) != 0 ) {
-	FG_LOG( FG_SERIAL, FG_ALERT, "Problem setting output baud rate" );
-	return false;
-    }
-
-    if ( tcsetattr( fd, TCSANOW, &config ) != 0 ) {
-	FG_LOG( FG_SERIAL, FG_ALERT, "Unable to update port settings" );
-	return false;
-    }
-
-    return true;
-
-#endif
-
-}
-
-string fgSERIAL::read_port() {
-
-#if defined( WIN32 ) && !defined( __CYGWIN__) && !defined( __CYGWIN32__ )
-
-    string result = "";
-    return result;
-
-#else
-
-    const int max_count = 1024;
-    char buffer[max_count+1];
-    int count;
-    string result;
-
-    count = read(fd, buffer, max_count);
-    // cout << "read " << count << " bytes" << endl;
-
-    if ( count < 0 ) {
-	// error condition
-	if ( errno != EAGAIN ) {
-	    FG_LOG( FG_SERIAL, FG_ALERT, 
-		    "Serial I/O on read, error number = " << errno );
-	}
-
-	return "";
-    } else {
-	buffer[count] = '\0';
-	result = buffer;
-
-	return result;
-    }
-
-#endif
-
-}
-
-int fgSERIAL::write_port(const string& value) {
-
-#if defined( WIN32 ) && !defined( __CYGWIN__) && !defined( __CYGWIN32__ )
-
-    LPCVOID lpBuffer = value.c_str();
-    DWORD nNumberOfBytesToWrite = value.length();
-    DWORD lpNumberOfBytesWritten;
-    OVERLAPPED lpOverlapped;
-
-    if ( WriteFile( fd,
-        lpBuffer,
-        nNumberOfBytesToWrite,
-        &lpNumberOfBytesWritten,
-        &lpOverlapped ) == 0 )
-    {
-        LPVOID lpMsgBuf;
-        FormatMessage(
-            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
-            FORMAT_MESSAGE_FROM_SYSTEM | 
-            FORMAT_MESSAGE_IGNORE_INSERTS,
-            NULL,
-            GetLastError(),
-            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
-            (LPTSTR) &lpMsgBuf,
-            0,
-            NULL );
-
-        FG_LOG( FG_SERIAL, FG_ALERT, "Serial I/O write error: " 
-             << (const char*) lpMsgBuf );
-        LocalFree( lpMsgBuf );
-        return int(lpNumberOfBytesWritten);
-    }
-
-    return int(lpNumberOfBytesWritten);
-
-#else
-
-    static bool error = false;
-    int count;
-
-    if ( error ) {
-	// attempt some sort of error recovery
-	count = write(fd, "\n", 1);
-	if ( count == 1 ) {
-	    // cout << "Serial error recover successful!\n";
-	    error = false;
-	} else {
-	    return 0;
-	}
-    }
-
-    count = write(fd, value.c_str(), value.length());
-    // cout << "write '" << value << "'  " << count << " bytes" << endl;
-
-    if ( (int)count == (int)value.length() ) {
-	error = false;
-    } else {
-	error = true;
-	if ( errno == EAGAIN ) {
-	    // ok ... in our context we don't really care if we can't
-	    // write a string, we'll just get it the next time around
-	} else {
-	    FG_LOG( FG_SERIAL, FG_ALERT,
-		    "Serial I/O on write, error number = " << errno );
-	}
-    }
-
-    return count;
-
-#endif
-
-}
-
-
diff --git a/Lib/Serial/serial.hxx b/Lib/Serial/serial.hxx
deleted file mode 100644
index 075f80036..000000000
--- a/Lib/Serial/serial.hxx
+++ /dev/null
@@ -1,80 +0,0 @@
-// serial.hxx -- Unix serial I/O support
-//
-// Written by Curtis Olson, started November 1998.
-//
-// Copyright (C) 1998  Curtis L. Olson - curt@flightgear.org
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifndef _SERIAL_HXX
-#define _SERIAL_HXX
-
-
-#ifndef __cplusplus
-# error This library requires C++
-#endif
-
-#ifdef HAVE_CONFIG_H
-#  include 
-#endif
-
-#if defined( WIN32 ) && !defined( __CYGWIN__) && !defined( __CYGWIN32__ )
-#  include 
-#endif
-
-#include 
-#include STL_STRING
-FG_USING_STD(string);
-
-// if someone know how to do this all with C++ streams let me know
-// #include 
-
-
-class fgSERIAL
-{
-#if defined( WIN32 ) && !defined( __CYGWIN__) && !defined( __CYGWIN32__ )
-    typedef HANDLE fd_type;
-#else
-    typedef int fd_type;
-#endif
-
-private:
-
-    fd_type fd;
-    bool dev_open;
-
-public:
-
-    fgSERIAL();
-    fgSERIAL(const string& device, int baud);
-
-    ~fgSERIAL();
-
-    bool open_port(const string& device);
-    bool close_port();
-    bool set_baud(int baud);
-    string read_port();
-    int write_port(const string& value);
-
-    inline bool is_enabled() { return dev_open; }
-};
-
-
-#endif // _SERIAL_HXX
-
-
diff --git a/Lib/Serial/testserial.cxx b/Lib/Serial/testserial.cxx
deleted file mode 100644
index c582c13c3..000000000
--- a/Lib/Serial/testserial.cxx
+++ /dev/null
@@ -1,30 +0,0 @@
-#include 
-
-#include 
-
-#include "serial.hxx"
-
-main () {
-    fgSERIAL port;
-    string value;
-    bool result;
-
-    fglog().setLogLevels( FG_ALL, FG_INFO );
-
-    cout << "start of main" << endl;
-
-    result = port.open_port("/dev/ttyS1");
-    cout << "opened port, result = " << result << endl;
-
-    result = port.set_baud(4800);
-    cout << "set baud, result = " << result << endl;
-
-    port.write_port("ATDT 626-9800\n");
-
-    while ( true ) {
-	value = port.read_port();
-	if ( value.length() ) {
-	    cout << "-> " << value << endl;
-	}
-    }
-}
diff --git a/Lib/XGL/Makefile.am b/Lib/XGL/Makefile.am
deleted file mode 100644
index 38aa0db88..000000000
--- a/Lib/XGL/Makefile.am
+++ /dev/null
@@ -1,5 +0,0 @@
-lib_LIBRARIES = libXGL.a
-
-libXGL_a_SOURCES = xgl.c xgl.h xglUtils.c
-
-INCLUDES += -I$(top_builddir) -I$(top_builddir)/Simulator
diff --git a/Lib/XGL/xgl.c b/Lib/XGL/xgl.c
deleted file mode 100644
index 653805240..000000000
--- a/Lib/XGL/xgl.c
+++ /dev/null
@@ -1,3034 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#  include 
-#endif
-
-#ifdef HAVE_WINDOWS_H
-#  include 
-#endif
-
-#include "xgl.h"
-#include 
-
-#include 
-#include 
-
-#ifdef HAVE_UNISTD_H
-#  include 
-#endif
-
-
-#ifdef XGL_TRACE
-
-#ifndef TRUE
-#define TRUE  1
-#define FALSE 0
-#endif
-
-GLboolean xglIsEnabled ( GLenum cap )
-{
-  if ( xglTraceIsEnabled("glIsEnabled") )
-    fprintf ( xglTraceFd, "  /* glIsEnabled ( (GLenum)%s ) ; */\n" , xglExpandGLenum ( (GLenum) cap ) ) ;
-
-  return glIsEnabled ( cap ) ;
-}
-
-GLboolean xglIsList ( GLuint list )
-{
-  if ( xglTraceIsEnabled("glIsList") )
-    fprintf ( xglTraceFd, "  /* glIsList ( (GLuint)%u ) ; */\n" , list ) ;
-
-  return glIsList ( list ) ;
-}
-
-GLenum xglGetError (  )
-{
-  if ( xglTraceIsEnabled("glGetError") )
-    fprintf ( xglTraceFd, "  /* glGetError (  ) ; */\n"  ) ;
-
-  return glGetError (  ) ;
-}
-
-GLint xglRenderMode ( GLenum mode )
-{
-  if ( xglTraceIsEnabled("glRenderMode") )
-    fprintf ( xglTraceFd, "  glRenderMode ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) mode ) ) ;
-
-  return glRenderMode ( mode ) ;
-}
-
-GLuint xglGenLists ( GLsizei range )
-{
-  if ( xglTraceIsEnabled("glGenLists") )
-    fprintf ( xglTraceFd, "  glGenLists ( (GLsizei)%d ) ;\n" , range ) ;
-
-  return glGenLists ( range ) ;
-}
-
-const GLubyte* xglGetString ( GLenum name )
-{
-  if ( xglTraceIsEnabled("glGetString") )
-    fprintf ( xglTraceFd, "  /* glGetString ( (GLenum)%s ) ; */\n" , xglExpandGLenum ( (GLenum) name ) ) ;
-
-  return glGetString ( name ) ;
-}
-
-void xglAccum ( GLenum op, GLfloat value )
-{
-  if ( xglTraceIsEnabled("glAccum") )
-    fprintf ( xglTraceFd, "  glAccum ( (GLenum)%s, (GLfloat)%ff ) ;\n" , xglExpandGLenum ( (GLenum) op ), value ) ;
-  if ( xglExecuteIsEnabled("glAccum") )
-    glAccum ( op, value ) ;
-}
-
-void xglAlphaFunc ( GLenum func, GLclampf ref )
-{
-  if ( xglTraceIsEnabled("glAlphaFunc") )
-    fprintf ( xglTraceFd, "  glAlphaFunc ( (GLenum)%s, (GLclampf)%ff ) ;\n" , xglExpandGLenum ( (GLenum) func ), ref ) ;
-  if ( xglExecuteIsEnabled("glAlphaFunc") )
-    glAlphaFunc ( func, ref ) ;
-}
-
-void xglArrayElementEXT ( GLint i )
-{
-  if ( xglTraceIsEnabled("glArrayElementEXT") )
-    fprintf ( xglTraceFd, "  glArrayElementEXT ( (GLint)%d ) ;\n" , i ) ;
-#ifdef GL_VERSION_1_1
-    glArrayElement ( i ) ;
-#else
-#ifdef GL_EXT_vertex_array
-  if ( xglExecuteIsEnabled("glArrayElementEXT") )
-    glArrayElementEXT ( i ) ;
-#else
-  fprintf ( xglTraceFd, "  glArrayElementEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglBegin ( GLenum mode )
-{
-  if ( xglTraceIsEnabled("glBegin") )
-    fprintf ( xglTraceFd, "  glBegin ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glBegin") )
-    glBegin ( mode ) ;
-}
-
-void xglBitmap ( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, GLubyte* bitmap )
-{
-  if ( xglTraceIsEnabled("glBitmap") )
-    fprintf ( xglTraceFd, "  glBitmap ( (GLsizei)%d, (GLsizei)%d, (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff, (GLubyte *)0x%08x ) ;\n" , width, height, xorig, yorig, xmove, ymove, bitmap ) ;
-  if ( xglExecuteIsEnabled("glBitmap") )
-    glBitmap ( width, height, xorig, yorig, xmove, ymove, bitmap ) ;
-}
-
-void xglBlendColorEXT ( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
-{
-  if ( xglTraceIsEnabled("glBlendColorEXT") )
-    fprintf ( xglTraceFd, "  glBlendColorEXT ( (GLclampf)%ff, (GLclampf)%ff, (GLclampf)%ff, (GLclampf)%ff ) ;\n" , red, green, blue, alpha ) ;
-#ifdef GL_EXT_blend_color
-  if ( xglExecuteIsEnabled("glBlendColorEXT") )
-    glBlendColorEXT ( red, green, blue, alpha ) ;
-#else
-  fprintf ( xglTraceFd, "  glBlendColorEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-}
-
-void xglBlendEquationEXT ( GLenum mode )
-{
-  if ( xglTraceIsEnabled("glBlendEquationEXT") )
-    fprintf ( xglTraceFd, "  glBlendEquationEXT ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) mode ) ) ;
-#ifdef GL_EXT_blend_minmax
-  if ( xglExecuteIsEnabled("glBlendEquationEXT") )
-    glBlendEquationEXT ( mode ) ;
-#else
-  fprintf ( xglTraceFd, "  glBlendEquationEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-}
-
-void xglBlendFunc ( GLenum sfactor, GLenum dfactor )
-{
-  if ( xglTraceIsEnabled("glBlendFunc") )
-    fprintf ( xglTraceFd, "  glBlendFunc ( (GLenum)%s, (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) sfactor ), xglExpandGLenum ( (GLenum) dfactor ) ) ;
-  if ( xglExecuteIsEnabled("glBlendFunc") )
-    glBlendFunc ( sfactor, dfactor ) ;
-}
-
-void xglCallList ( GLuint list )
-{
-  if ( xglTraceIsEnabled("glCallList") )
-    fprintf ( xglTraceFd, "  glCallList ( (GLuint)%u ) ;\n" , list ) ;
-  if ( xglExecuteIsEnabled("glCallList") )
-    glCallList ( list ) ;
-}
-
-void xglCallLists ( GLsizei n, GLenum type, GLvoid* lists )
-{
-  if ( xglTraceIsEnabled("glCallLists") )
-    fprintf ( xglTraceFd, "  glCallLists ( (GLsizei)%d, (GLenum)%s, (GLvoid *)0x%08x ) ;\n" , n, xglExpandGLenum ( (GLenum) type ), lists ) ;
-  if ( xglExecuteIsEnabled("glCallLists") )
-    glCallLists ( n, type, lists ) ;
-}
-
-
-void xglClear ( GLbitfield mask )
-{
-  if ( xglTraceIsEnabled("glClear") )
-    switch ( mask )
-    {
-      case GL_COLOR_BUFFER_BIT :
-        fprintf ( xglTraceFd, "  glClear ( GL_COLOR_BUFFER_BIT ) ;\n" ) ;
-        break ;
-      case GL_DEPTH_BUFFER_BIT :
-        fprintf ( xglTraceFd, "  glClear ( GL_DEPTH_BUFFER_BIT ) ;\n" ) ;
-        break ;
-      case GL_ACCUM_BUFFER_BIT :
-        fprintf ( xglTraceFd, "  glClear ( GL_ACCUM_BUFFER_BIT ) ;\n" ) ;
-        break ;
-      case GL_STENCIL_BUFFER_BIT :
-        fprintf ( xglTraceFd, "  glClear ( GL_STENCIL_BUFFER_BIT ) ;\n" ) ;
-        break ;
-      case (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) :
-        fprintf ( xglTraceFd, "  glClear ( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT ) ;\n" ) ;
-        break ;
-
-      default :
-        fprintf ( xglTraceFd, "  glClear ( (GLbitfield)0x%08x ) ;\n" , mask ) ; break ;
-    }
-
-  if ( xglExecuteIsEnabled("glClear") )
-    glClear ( mask ) ;
-}
-
-
-void xglClearAccum ( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
-{
-  if ( xglTraceIsEnabled("glClearAccum") )
-    fprintf ( xglTraceFd, "  glClearAccum ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glClearAccum") )
-    glClearAccum ( red, green, blue, alpha ) ;
-}
-
-void xglClearColor ( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
-{
-  if ( xglTraceIsEnabled("glClearColor") )
-    fprintf ( xglTraceFd, "  glClearColor ( (GLclampf)%ff, (GLclampf)%ff, (GLclampf)%ff, (GLclampf)%ff ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glClearColor") )
-    glClearColor ( red, green, blue, alpha ) ;
-}
-
-void xglClearDepth ( GLclampd depth )
-{
-  if ( xglTraceIsEnabled("glClearDepth") )
-    fprintf ( xglTraceFd, "  glClearDepth ( (GLclampd)%f ) ;\n" , depth ) ;
-  if ( xglExecuteIsEnabled("glClearDepth") )
-    glClearDepth ( depth ) ;
-}
-
-void xglClearIndex ( GLfloat c )
-{
-  if ( xglTraceIsEnabled("glClearIndex") )
-    fprintf ( xglTraceFd, "  glClearIndex ( (GLfloat)%ff ) ;\n" , c ) ;
-  if ( xglExecuteIsEnabled("glClearIndex") )
-    glClearIndex ( c ) ;
-}
-
-void xglClearStencil ( GLint s )
-{
-  if ( xglTraceIsEnabled("glClearStencil") )
-    fprintf ( xglTraceFd, "  glClearStencil ( (GLint)%d ) ;\n" , s ) ;
-  if ( xglExecuteIsEnabled("glClearStencil") )
-    glClearStencil ( s ) ;
-}
-
-void xglClipPlane ( GLenum plane, GLdouble* equation )
-{
-  if ( xglTraceIsEnabled("glClipPlane") )
-    fprintf ( xglTraceFd, "  glClipPlane ( (GLenum)%s, (GLdouble *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) plane ), equation ) ;
-  if ( xglExecuteIsEnabled("glClipPlane") )
-    glClipPlane ( plane, equation ) ;
-}
-
-void xglColor3b ( GLbyte red, GLbyte green, GLbyte blue )
-{
-  if ( xglTraceIsEnabled("glColor3b") )
-    fprintf ( xglTraceFd, "  glColor3b ( (GLbyte)%d, (GLbyte)%d, (GLbyte)%d ) ;\n" , red, green, blue ) ;
-  if ( xglExecuteIsEnabled("glColor3b") )
-    glColor3b ( red, green, blue ) ;
-}
-
-void xglColor3bv ( GLbyte* v )
-{
-  if ( xglTraceIsEnabled("glColor3bv") )
-    fprintf ( xglTraceFd, "  glColor3bv ( xglBuild3bv((GLbyte)%d,(GLbyte)%d,(GLbyte)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glColor3bv") )
-    glColor3bv ( v ) ;
-}
-
-void xglColor3d ( GLdouble red, GLdouble green, GLdouble blue )
-{
-  if ( xglTraceIsEnabled("glColor3d") )
-    fprintf ( xglTraceFd, "  glColor3d ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , red, green, blue ) ;
-  if ( xglExecuteIsEnabled("glColor3d") )
-    glColor3d ( red, green, blue ) ;
-}
-
-void xglColor3dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glColor3dv") )
-    fprintf ( xglTraceFd, "  glColor3dv ( xglBuild3dv((GLdouble)%f,(GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glColor3dv") )
-    glColor3dv ( v ) ;
-}
-
-void xglColor3f ( GLfloat red, GLfloat green, GLfloat blue )
-{
-  if ( xglTraceIsEnabled("glColor3f") )
-    fprintf ( xglTraceFd, "  glColor3f ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , red, green, blue ) ;
-  if ( xglExecuteIsEnabled("glColor3f") )
-    glColor3f ( red, green, blue ) ;
-}
-
-void xglColor3fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glColor3fv") )
-    fprintf ( xglTraceFd, "  glColor3fv ( xglBuild3fv((GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glColor3fv") )
-    glColor3fv ( v ) ;
-}
-
-void xglColor3i ( GLint red, GLint green, GLint blue )
-{
-  if ( xglTraceIsEnabled("glColor3i") )
-    fprintf ( xglTraceFd, "  glColor3i ( (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , red, green, blue ) ;
-  if ( xglExecuteIsEnabled("glColor3i") )
-    glColor3i ( red, green, blue ) ;
-}
-
-void xglColor3iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glColor3iv") )
-    fprintf ( xglTraceFd, "  glColor3iv ( xglBuild3iv((GLint)%d,(GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glColor3iv") )
-    glColor3iv ( v ) ;
-}
-
-void xglColor3s ( GLshort red, GLshort green, GLshort blue )
-{
-  if ( xglTraceIsEnabled("glColor3s") )
-    fprintf ( xglTraceFd, "  glColor3s ( (GLshort)%d, (GLshort)%d, (GLshort)%d ) ;\n" , red, green, blue ) ;
-  if ( xglExecuteIsEnabled("glColor3s") )
-    glColor3s ( red, green, blue ) ;
-}
-
-void xglColor3sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glColor3sv") )
-    fprintf ( xglTraceFd, "  glColor3sv ( xglBuild3sv((GLshort)%d,(GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glColor3sv") )
-    glColor3sv ( v ) ;
-}
-
-void xglColor3ub ( GLubyte red, GLubyte green, GLubyte blue )
-{
-  if ( xglTraceIsEnabled("glColor3ub") )
-    fprintf ( xglTraceFd, "  glColor3ub ( (GLubyte)%u, (GLubyte)%u, (GLubyte)%u ) ;\n" , red, green, blue ) ;
-  if ( xglExecuteIsEnabled("glColor3ub") )
-    glColor3ub ( red, green, blue ) ;
-}
-
-void xglColor3ubv ( GLubyte* v )
-{
-  if ( xglTraceIsEnabled("glColor3ubv") )
-    fprintf ( xglTraceFd, "  glColor3ubv ( xglBuild3ubv((GLubyte)%d,(GLubyte)%d,(GLubyte)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glColor3ubv") )
-    glColor3ubv ( v ) ;
-}
-
-void xglColor3ui ( GLuint red, GLuint green, GLuint blue )
-{
-  if ( xglTraceIsEnabled("glColor3ui") )
-    fprintf ( xglTraceFd, "  glColor3ui ( (GLuint)%u, (GLuint)%u, (GLuint)%u ) ;\n" , red, green, blue ) ;
-  if ( xglExecuteIsEnabled("glColor3ui") )
-    glColor3ui ( red, green, blue ) ;
-}
-
-void xglColor3uiv ( GLuint* v )
-{
-  if ( xglTraceIsEnabled("glColor3uiv") )
-    fprintf ( xglTraceFd, "  glColor3uiv ( xglBuild3uiv((GLuint)%d,(GLuint)%d,(GLuint)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glColor3uiv") )
-    glColor3uiv ( v ) ;
-}
-
-void xglColor3us ( GLushort red, GLushort green, GLushort blue )
-{
-  if ( xglTraceIsEnabled("glColor3us") )
-    fprintf ( xglTraceFd, "  glColor3us ( (GLushort)%u, (GLushort)%u, (GLushort)%u ) ;\n" , red, green, blue ) ;
-  if ( xglExecuteIsEnabled("glColor3us") )
-    glColor3us ( red, green, blue ) ;
-}
-
-void xglColor3usv ( GLushort* v )
-{
-  if ( xglTraceIsEnabled("glColor3usv") )
-    fprintf ( xglTraceFd, "  glColor3usv ( xglBuild3usv((GLushort)%d,(GLushort)%d,(GLushort)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glColor3usv") )
-    glColor3usv ( v ) ;
-}
-
-void xglColor4b ( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha )
-{
-  if ( xglTraceIsEnabled("glColor4b") )
-    fprintf ( xglTraceFd, "  glColor4b ( (GLbyte)%d, (GLbyte)%d, (GLbyte)%d, (GLbyte)%d ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glColor4b") )
-    glColor4b ( red, green, blue, alpha ) ;
-}
-
-void xglColor4bv ( GLbyte* v )
-{
-  if ( xglTraceIsEnabled("glColor4bv") )
-    fprintf ( xglTraceFd, "  glColor4bv ( xglBuild4bv((GLbyte)%d,(GLbyte)%d,(GLbyte)%d,(GLbyte)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glColor4bv") )
-    glColor4bv ( v ) ;
-}
-
-void xglColor4d ( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha )
-{
-  if ( xglTraceIsEnabled("glColor4d") )
-    fprintf ( xglTraceFd, "  glColor4d ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glColor4d") )
-    glColor4d ( red, green, blue, alpha ) ;
-}
-
-void xglColor4dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glColor4dv") )
-    fprintf ( xglTraceFd, "  glColor4dv ( xglBuild4dv((GLdouble)%f,(GLdouble)%f,(GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glColor4dv") )
-    glColor4dv ( v ) ;
-}
-
-void xglColor4f ( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
-{
-  if ( xglTraceIsEnabled("glColor4f") )
-    fprintf ( xglTraceFd, "  glColor4f ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glColor4f") )
-    glColor4f ( red, green, blue, alpha ) ;
-}
-
-void xglColor4fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glColor4fv") )
-    fprintf ( xglTraceFd, "  glColor4fv ( xglBuild4fv((GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glColor4fv") )
-    glColor4fv ( v ) ;
-}
-
-void xglColor4i ( GLint red, GLint green, GLint blue, GLint alpha )
-{
-  if ( xglTraceIsEnabled("glColor4i") )
-    fprintf ( xglTraceFd, "  glColor4i ( (GLint)%d, (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glColor4i") )
-    glColor4i ( red, green, blue, alpha ) ;
-}
-
-void xglColor4iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glColor4iv") )
-    fprintf ( xglTraceFd, "  glColor4iv ( xglBuild4iv((GLint)%d,(GLint)%d,(GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glColor4iv") )
-    glColor4iv ( v ) ;
-}
-
-void xglColor4s ( GLshort red, GLshort green, GLshort blue, GLshort alpha )
-{
-  if ( xglTraceIsEnabled("glColor4s") )
-    fprintf ( xglTraceFd, "  glColor4s ( (GLshort)%d, (GLshort)%d, (GLshort)%d, (GLshort)%d ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glColor4s") )
-    glColor4s ( red, green, blue, alpha ) ;
-}
-
-void xglColor4sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glColor4sv") )
-    fprintf ( xglTraceFd, "  glColor4sv ( xglBuild4sv((GLshort)%d,(GLshort)%d,(GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glColor4sv") )
-    glColor4sv ( v ) ;
-}
-
-void xglColor4ub ( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha )
-{
-  if ( xglTraceIsEnabled("glColor4ub") )
-    fprintf ( xglTraceFd, "  glColor4ub ( (GLubyte)%u, (GLubyte)%u, (GLubyte)%u, (GLubyte)%u ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glColor4ub") )
-    glColor4ub ( red, green, blue, alpha ) ;
-}
-
-void xglColor4ubv ( GLubyte* v )
-{
-  if ( xglTraceIsEnabled("glColor4ubv") )
-    fprintf ( xglTraceFd, "  glColor4ubv ( xglBuild4ubv((GLubyte)%d,(GLubyte)%d,(GLubyte)%d,(GLubyte)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glColor4ubv") )
-    glColor4ubv ( v ) ;
-}
-
-void xglColor4ui ( GLuint red, GLuint green, GLuint blue, GLuint alpha )
-{
-  if ( xglTraceIsEnabled("glColor4ui") )
-    fprintf ( xglTraceFd, "  glColor4ui ( (GLuint)%u, (GLuint)%u, (GLuint)%u, (GLuint)%u ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glColor4ui") )
-    glColor4ui ( red, green, blue, alpha ) ;
-}
-
-void xglColor4uiv ( GLuint* v )
-{
-  if ( xglTraceIsEnabled("glColor4uiv") )
-    fprintf ( xglTraceFd, "  glColor4uiv ( xglBuild4uiv((GLuint)%d,(GLuint)%d,(GLuint)%d,(GLuint)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glColor4uiv") )
-    glColor4uiv ( v ) ;
-}
-
-void xglColor4us ( GLushort red, GLushort green, GLushort blue, GLushort alpha )
-{
-  if ( xglTraceIsEnabled("glColor4us") )
-    fprintf ( xglTraceFd, "  glColor4us ( (GLushort)%u, (GLushort)%u, (GLushort)%u, (GLushort)%u ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glColor4us") )
-    glColor4us ( red, green, blue, alpha ) ;
-}
-
-void xglColor4usv ( GLushort* v )
-{
-  if ( xglTraceIsEnabled("glColor4usv") )
-    fprintf ( xglTraceFd, "  glColor4usv ( xglBuild4usv((GLushort)%d,(GLushort)%d,(GLushort)%d,(GLushort)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glColor4usv") )
-    glColor4usv ( v ) ;
-}
-
-void xglColorMask ( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha )
-{
-  if ( xglTraceIsEnabled("glColorMask") )
-    fprintf ( xglTraceFd, "  glColorMask ( (GLboolean)%d, (GLboolean)%d, (GLboolean)%d, (GLboolean)%d ) ;\n" , red, green, blue, alpha ) ;
-  if ( xglExecuteIsEnabled("glColorMask") )
-    glColorMask ( red, green, blue, alpha ) ;
-}
-
-void xglColorMaterial ( GLenum face, GLenum mode )
-{
-  if ( xglTraceIsEnabled("glColorMaterial") )
-    fprintf ( xglTraceFd, "  glColorMaterial ( (GLenum)%s, (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) face ), xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glColorMaterial") )
-    glColorMaterial ( face, mode ) ;
-}
-
-void xglColorPointerEXT ( GLint size, GLenum type, GLsizei stride, GLsizei count, void* ptr )
-{
-  if ( xglTraceIsEnabled("glColorPointerEXT") )
-    fprintf ( xglTraceFd, "  glColorPointerEXT ( (GLint)%d, (GLenum)%s, (GLsizei)%d, (GLsizei)%d, (void *)0x%08x ) ;\n" , size, xglExpandGLenum ( (GLenum) type ), stride, count, ptr ) ;
-#ifdef GL_VERSION_1_1
-    glColorPointer ( size, type, stride, ptr ) ;
-#else
-#ifdef GL_EXT_vertex_array
-  if ( xglExecuteIsEnabled("glColorPointerEXT") )
-    glColorPointerEXT ( size, type, stride, count, ptr ) ;
-#else
-  fprintf ( xglTraceFd, "  glColorPointerEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglCopyPixels ( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type )
-{
-  if ( xglTraceIsEnabled("glCopyPixels") )
-    fprintf ( xglTraceFd, "  glCopyPixels ( (GLint)%d, (GLint)%d, (GLsizei)%d, (GLsizei)%d, (GLenum)%s ) ;\n" , x, y, width, height, xglExpandGLenum ( (GLenum) type ) ) ;
-  if ( xglExecuteIsEnabled("glCopyPixels") )
-    glCopyPixels ( x, y, width, height, type ) ;
-}
-
-void xglCullFace ( GLenum mode )
-{
-  if ( xglTraceIsEnabled("glCullFace") )
-    fprintf ( xglTraceFd, "  glCullFace ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glCullFace") )
-    glCullFace ( mode ) ;
-}
-
-void xglDeleteLists ( GLuint list, GLsizei range )
-{
-  if ( xglTraceIsEnabled("glDeleteLists") )
-    fprintf ( xglTraceFd, "  glDeleteLists ( (GLuint)%u, (GLsizei)%d ) ;\n" , list, range ) ;
-  if ( xglExecuteIsEnabled("glDeleteLists") )
-    glDeleteLists ( list, range ) ;
-}
-
-void xglDepthFunc ( GLenum func )
-{
-  if ( xglTraceIsEnabled("glDepthFunc") )
-    fprintf ( xglTraceFd, "  glDepthFunc ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) func ) ) ;
-  if ( xglExecuteIsEnabled("glDepthFunc") )
-    glDepthFunc ( func ) ;
-}
-
-void xglDepthMask ( GLboolean flag )
-{
-  if ( xglTraceIsEnabled("glDepthMask") )
-    fprintf ( xglTraceFd, "  glDepthMask ( (GLboolean)%d ) ;\n" , flag ) ;
-  if ( xglExecuteIsEnabled("glDepthMask") )
-    glDepthMask ( flag ) ;
-}
-
-void xglDepthRange ( GLclampd near_val, GLclampd far_val )
-{
-  if ( xglTraceIsEnabled("glDepthRange") )
-    fprintf ( xglTraceFd, "  glDepthRange ( (GLclampd)%f, (GLclampd)%f ) ;\n" , near_val, far_val ) ;
-  if ( xglExecuteIsEnabled("glDepthRange") )
-    glDepthRange ( near_val, far_val ) ;
-}
-
-void xglDisable ( GLenum cap )
-{
-  if ( xglTraceIsEnabled("glDisable") )
-    fprintf ( xglTraceFd, "  glDisable ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) cap ) ) ;
-  if ( xglExecuteIsEnabled("glDisable") )
-    glDisable ( cap ) ;
-}
-
-void xglDrawArraysEXT ( GLenum mode, GLint first, GLsizei count )
-{
-  if ( xglTraceIsEnabled("glDrawArraysEXT") )
-    fprintf ( xglTraceFd, "  glDrawArraysEXT ( (GLenum)%s, (GLint)%d, (GLsizei)%d ) ;\n" , xglExpandGLenum ( (GLenum) mode ), first, count ) ;
-#ifdef GL_VERSION_1_1
-    glDrawArrays ( mode, first, count ) ;
-#else
-#ifdef GL_EXT_vertex_array
-  if ( xglExecuteIsEnabled("glDrawArraysEXT") )
-    glDrawArraysEXT ( mode, first, count ) ;
-#else
-  fprintf ( xglTraceFd, "  glDrawArraysEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglDrawBuffer ( GLenum mode )
-{
-  if ( xglTraceIsEnabled("glDrawBuffer") )
-    fprintf ( xglTraceFd, "  glDrawBuffer ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glDrawBuffer") )
-    glDrawBuffer ( mode ) ;
-}
-
-void xglDrawPixels ( GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels )
-{
-  if ( xglTraceIsEnabled("glDrawPixels") )
-    fprintf ( xglTraceFd, "  glDrawPixels ( (GLsizei)%d, (GLsizei)%d, (GLenum)%s, (GLenum)%s, (GLvoid *)0x%08x ) ;\n" , width, height, xglExpandGLenum ( (GLenum) format ), xglExpandGLenum ( (GLenum) type ), pixels ) ;
-  if ( xglExecuteIsEnabled("glDrawPixels") )
-    glDrawPixels ( width, height, format, type, pixels ) ;
-}
-
-void xglEdgeFlag ( GLboolean flag )
-{
-  if ( xglTraceIsEnabled("glEdgeFlag") )
-    fprintf ( xglTraceFd, "  glEdgeFlag ( (GLboolean)%d ) ;\n" , flag ) ;
-  if ( xglExecuteIsEnabled("glEdgeFlag") )
-    glEdgeFlag ( flag ) ;
-}
-
-void xglEdgeFlagPointerEXT ( GLsizei stride, GLsizei count, GLboolean* ptr )
-{
-  if ( xglTraceIsEnabled("glEdgeFlagPointerEXT") )
-    fprintf ( xglTraceFd, "  glEdgeFlagPointerEXT ( (GLsizei)%d, (GLsizei)%d, (GLboolean *)0x%08x ) ;\n" , stride, count, ptr ) ;
-#ifdef GL_VERSION_1_1
-    glEdgeFlagPointer ( stride, ptr ) ;
-#else
-#ifdef GL_EXT_vertex_array
-  if ( xglExecuteIsEnabled("glEdgeFlagPointerEXT") )
-    glEdgeFlagPointerEXT ( stride, count, ptr ) ;
-#else
-  fprintf ( xglTraceFd, "  glEdgeFlagPointerEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglEdgeFlagv ( GLboolean* flag )
-{
-  if ( xglTraceIsEnabled("glEdgeFlagv") )
-    fprintf ( xglTraceFd, "  glEdgeFlagv ( (GLboolean *)0x%08x ) ;\n" , flag ) ;
-  if ( xglExecuteIsEnabled("glEdgeFlagv") )
-    glEdgeFlagv ( flag ) ;
-}
-
-void xglEnable ( GLenum cap )
-{
-  if ( xglTraceIsEnabled("glEnable") )
-    fprintf ( xglTraceFd, "  glEnable ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) cap ) ) ;
-  if ( xglExecuteIsEnabled("glEnable") )
-    glEnable ( cap ) ;
-}
-
-void xglEnd (  )
-{
-  if ( xglTraceIsEnabled("glEnd") )
-    fprintf ( xglTraceFd, "  glEnd (  ) ;\n"  ) ;
-  if ( xglExecuteIsEnabled("glEnd") )
-    glEnd (  ) ;
-}
-
-void xglEndList (  )
-{
-  if ( xglTraceIsEnabled("glEndList") )
-    fprintf ( xglTraceFd, "  glEndList (  ) ;\n"  ) ;
-  if ( xglExecuteIsEnabled("glEndList") )
-    glEndList (  ) ;
-}
-
-void xglEvalCoord1d ( GLdouble u )
-{
-  if ( xglTraceIsEnabled("glEvalCoord1d") )
-    fprintf ( xglTraceFd, "  glEvalCoord1d ( (GLdouble)%f ) ;\n" , u ) ;
-  if ( xglExecuteIsEnabled("glEvalCoord1d") )
-    glEvalCoord1d ( u ) ;
-}
-
-void xglEvalCoord1dv ( GLdouble* u )
-{
-  if ( xglTraceIsEnabled("glEvalCoord1dv") )
-    fprintf ( xglTraceFd, "  glEvalCoord1dv ( xglBuild1dv((GLdouble)%f) ) ;\n" , u[0] ) ;
-  if ( xglExecuteIsEnabled("glEvalCoord1dv") )
-    glEvalCoord1dv ( u ) ;
-}
-
-void xglEvalCoord1f ( GLfloat u )
-{
-  if ( xglTraceIsEnabled("glEvalCoord1f") )
-    fprintf ( xglTraceFd, "  glEvalCoord1f ( (GLfloat)%ff ) ;\n" , u ) ;
-  if ( xglExecuteIsEnabled("glEvalCoord1f") )
-    glEvalCoord1f ( u ) ;
-}
-
-void xglEvalCoord1fv ( GLfloat* u )
-{
-  if ( xglTraceIsEnabled("glEvalCoord1fv") )
-    fprintf ( xglTraceFd, "  glEvalCoord1fv ( xglBuild1fv((GLfloat)%ff) ) ;\n" , u[0] ) ;
-  if ( xglExecuteIsEnabled("glEvalCoord1fv") )
-    glEvalCoord1fv ( u ) ;
-}
-
-void xglEvalCoord2d ( GLdouble u, GLdouble v )
-{
-  if ( xglTraceIsEnabled("glEvalCoord2d") )
-    fprintf ( xglTraceFd, "  glEvalCoord2d ( (GLdouble)%f, (GLdouble)%f ) ;\n" , u, v ) ;
-  if ( xglExecuteIsEnabled("glEvalCoord2d") )
-    glEvalCoord2d ( u, v ) ;
-}
-
-void xglEvalCoord2dv ( GLdouble* u )
-{
-  if ( xglTraceIsEnabled("glEvalCoord2dv") )
-    fprintf ( xglTraceFd, "  glEvalCoord2dv ( xglBuild2dv((GLdouble)%f,(GLdouble)%f) ) ;\n" , u[0], u[1] ) ;
-  if ( xglExecuteIsEnabled("glEvalCoord2dv") )
-    glEvalCoord2dv ( u ) ;
-}
-
-void xglEvalCoord2f ( GLfloat u, GLfloat v )
-{
-  if ( xglTraceIsEnabled("glEvalCoord2f") )
-    fprintf ( xglTraceFd, "  glEvalCoord2f ( (GLfloat)%ff, (GLfloat)%ff ) ;\n" , u, v ) ;
-  if ( xglExecuteIsEnabled("glEvalCoord2f") )
-    glEvalCoord2f ( u, v ) ;
-}
-
-void xglEvalCoord2fv ( GLfloat* u )
-{
-  if ( xglTraceIsEnabled("glEvalCoord2fv") )
-    fprintf ( xglTraceFd, "  glEvalCoord2fv ( xglBuild2fv((GLfloat)%ff,(GLfloat)%ff) ) ;\n" , u[0], u[1] ) ;
-  if ( xglExecuteIsEnabled("glEvalCoord2fv") )
-    glEvalCoord2fv ( u ) ;
-}
-
-void xglEvalMesh1 ( GLenum mode, GLint i1, GLint i2 )
-{
-  if ( xglTraceIsEnabled("glEvalMesh1") )
-    fprintf ( xglTraceFd, "  glEvalMesh1 ( (GLenum)%s, (GLint)%d, (GLint)%d ) ;\n" , xglExpandGLenum ( (GLenum) mode ), i1, i2 ) ;
-  if ( xglExecuteIsEnabled("glEvalMesh1") )
-    glEvalMesh1 ( mode, i1, i2 ) ;
-}
-
-void xglEvalMesh2 ( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 )
-{
-  if ( xglTraceIsEnabled("glEvalMesh2") )
-    fprintf ( xglTraceFd, "  glEvalMesh2 ( (GLenum)%s, (GLint)%d, (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , xglExpandGLenum ( (GLenum) mode ), i1, i2, j1, j2 ) ;
-  if ( xglExecuteIsEnabled("glEvalMesh2") )
-    glEvalMesh2 ( mode, i1, i2, j1, j2 ) ;
-}
-
-void xglEvalPoint1 ( GLint i )
-{
-  if ( xglTraceIsEnabled("glEvalPoint1") )
-    fprintf ( xglTraceFd, "  glEvalPoint1 ( (GLint)%d ) ;\n" , i ) ;
-  if ( xglExecuteIsEnabled("glEvalPoint1") )
-    glEvalPoint1 ( i ) ;
-}
-
-void xglEvalPoint2 ( GLint i, GLint j )
-{
-  if ( xglTraceIsEnabled("glEvalPoint2") )
-    fprintf ( xglTraceFd, "  glEvalPoint2 ( (GLint)%d, (GLint)%d ) ;\n" , i, j ) ;
-  if ( xglExecuteIsEnabled("glEvalPoint2") )
-    glEvalPoint2 ( i, j ) ;
-}
-
-void xglFeedbackBuffer ( GLsizei size, GLenum type, GLfloat* buffer )
-{
-  if ( xglTraceIsEnabled("glFeedbackBuffer") )
-    fprintf ( xglTraceFd, "  glFeedbackBuffer ( (GLsizei)%d, (GLenum)%s, (GLfloat *)0x%08x ) ;\n" , size, xglExpandGLenum ( (GLenum) type ), buffer ) ;
-  if ( xglExecuteIsEnabled("glFeedbackBuffer") )
-    glFeedbackBuffer ( size, type, buffer ) ;
-}
-
-void xglFinish (  )
-{
-  if ( xglTraceIsEnabled("glFinish") )
-    fprintf ( xglTraceFd, "  glFinish (  ) ;\n"  ) ;
-  if ( xglExecuteIsEnabled("glFinish") )
-    glFinish (  ) ;
-}
-
-void xglFlush (  )
-{
-  if ( xglTraceIsEnabled("glFlush") )
-    fprintf ( xglTraceFd, "  glFlush (  ) ;\n"  ) ;
-  if ( xglExecuteIsEnabled("glFlush") )
-    glFlush (  ) ;
-}
-
-void xglFogf ( GLenum pname, GLfloat param )
-{
-  if ( xglTraceIsEnabled("glFogf") )
-    fprintf ( xglTraceFd, "  glFogf ( (GLenum)%s, (GLfloat)%ff ) ;\n" , xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glFogf") )
-    glFogf ( pname, param ) ;
-}
-
-void xglFogfv ( GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glFogfv") )
-    fprintf ( xglTraceFd, "  glFogfv ( (GLenum)%s, (GLfloat *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glFogfv") )
-    glFogfv ( pname, params ) ;
-}
-
-void xglFogi ( GLenum pname, GLint param )
-{
-  if ( xglTraceIsEnabled("glFogi") )
-    fprintf ( xglTraceFd, "  glFogi ( (GLenum)%s, (GLint)%d ) ;\n" , xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glFogi") )
-    glFogi ( pname, param ) ;
-}
-
-void xglFogiv ( GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glFogiv") )
-    fprintf ( xglTraceFd, "  glFogiv ( (GLenum)%s, (GLint *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glFogiv") )
-    glFogiv ( pname, params ) ;
-}
-
-void xglFrontFace ( GLenum mode )
-{
-  if ( xglTraceIsEnabled("glFrontFace") )
-    fprintf ( xglTraceFd, "  glFrontFace ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glFrontFace") )
-    glFrontFace ( mode ) ;
-}
-
-void xglFrustum ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val )
-{
-  if ( xglTraceIsEnabled("glFrustum") )
-    fprintf ( xglTraceFd, "  glFrustum ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , left, right, bottom, top, near_val, far_val ) ;
-  if ( xglExecuteIsEnabled("glFrustum") )
-    glFrustum ( left, right, bottom, top, near_val, far_val ) ;
-}
-
-void xglGetBooleanv ( GLenum pname, GLboolean* params )
-{
-  if ( xglTraceIsEnabled("glGetBooleanv") )
-    fprintf ( xglTraceFd, "  /* glGetBooleanv ( (GLenum)%s, (GLboolean *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetBooleanv") )
-    glGetBooleanv ( pname, params ) ;
-}
-
-void xglGetClipPlane ( GLenum plane, GLdouble* equation )
-{
-  if ( xglTraceIsEnabled("glGetClipPlane") )
-    fprintf ( xglTraceFd, "  /* glGetClipPlane ( (GLenum)%s, (GLdouble *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) plane ), equation ) ;
-  if ( xglExecuteIsEnabled("glGetClipPlane") )
-    glGetClipPlane ( plane, equation ) ;
-}
-
-void xglGetDoublev ( GLenum pname, GLdouble* params )
-{
-  if ( xglTraceIsEnabled("glGetDoublev") )
-    fprintf ( xglTraceFd, "  /* glGetDoublev ( (GLenum)%s, (GLdouble *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetDoublev") )
-    glGetDoublev ( pname, params ) ;
-}
-
-void xglGetFloatv ( GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glGetFloatv") )
-    fprintf ( xglTraceFd, "  /* glGetFloatv ( (GLenum)%s, (GLfloat *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetFloatv") )
-    glGetFloatv ( pname, params ) ;
-}
-
-void xglGetIntegerv ( GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glGetIntegerv") )
-    fprintf ( xglTraceFd, "  /* glGetIntegerv ( (GLenum)%s, (GLint *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetIntegerv") )
-    glGetIntegerv ( pname, params ) ;
-}
-
-void xglGetLightfv ( GLenum light, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glGetLightfv") )
-    fprintf ( xglTraceFd, "  /* glGetLightfv ( (GLenum)%s, (GLenum)%s, (GLfloat *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) light ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetLightfv") )
-    glGetLightfv ( light, pname, params ) ;
-}
-
-void xglGetLightiv ( GLenum light, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glGetLightiv") )
-    fprintf ( xglTraceFd, "  /* glGetLightiv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) light ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetLightiv") )
-    glGetLightiv ( light, pname, params ) ;
-}
-
-void xglGetMapdv ( GLenum target, GLenum query, GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glGetMapdv") )
-    fprintf ( xglTraceFd, "  /* glGetMapdv ( (GLenum)%s, (GLenum)%s, (GLdouble *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) query ), v ) ;
-  if ( xglExecuteIsEnabled("glGetMapdv") )
-    glGetMapdv ( target, query, v ) ;
-}
-
-void xglGetMapfv ( GLenum target, GLenum query, GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glGetMapfv") )
-    fprintf ( xglTraceFd, "  /* glGetMapfv ( (GLenum)%s, (GLenum)%s, (GLfloat *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) query ), v ) ;
-  if ( xglExecuteIsEnabled("glGetMapfv") )
-    glGetMapfv ( target, query, v ) ;
-}
-
-void xglGetMapiv ( GLenum target, GLenum query, GLint* v )
-{
-  if ( xglTraceIsEnabled("glGetMapiv") )
-    fprintf ( xglTraceFd, "  /* glGetMapiv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) query ), v ) ;
-  if ( xglExecuteIsEnabled("glGetMapiv") )
-    glGetMapiv ( target, query, v ) ;
-}
-
-void xglGetMaterialfv ( GLenum face, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glGetMaterialfv") )
-    fprintf ( xglTraceFd, "  /* glGetMaterialfv ( (GLenum)%s, (GLenum)%s, (GLfloat *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) face ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetMaterialfv") )
-    glGetMaterialfv ( face, pname, params ) ;
-}
-
-void xglGetMaterialiv ( GLenum face, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glGetMaterialiv") )
-    fprintf ( xglTraceFd, "  /* glGetMaterialiv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) face ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetMaterialiv") )
-    glGetMaterialiv ( face, pname, params ) ;
-}
-
-void xglGetPixelMapfv ( GLenum map, GLfloat* values )
-{
-  if ( xglTraceIsEnabled("glGetPixelMapfv") )
-    fprintf ( xglTraceFd, "  /* glGetPixelMapfv ( (GLenum)%s, (GLfloat *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) map ), values ) ;
-  if ( xglExecuteIsEnabled("glGetPixelMapfv") )
-    glGetPixelMapfv ( map, values ) ;
-}
-
-void xglGetPixelMapuiv ( GLenum map, GLuint* values )
-{
-  if ( xglTraceIsEnabled("glGetPixelMapuiv") )
-    fprintf ( xglTraceFd, "  /* glGetPixelMapuiv ( (GLenum)%s, (GLuint *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) map ), values ) ;
-  if ( xglExecuteIsEnabled("glGetPixelMapuiv") )
-    glGetPixelMapuiv ( map, values ) ;
-}
-
-void xglGetPixelMapusv ( GLenum map, GLushort* values )
-{
-  if ( xglTraceIsEnabled("glGetPixelMapusv") )
-    fprintf ( xglTraceFd, "  /* glGetPixelMapusv ( (GLenum)%s, (GLushort *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) map ), values ) ;
-  if ( xglExecuteIsEnabled("glGetPixelMapusv") )
-    glGetPixelMapusv ( map, values ) ;
-}
-
-void xglGetPointervEXT ( GLenum pname, void** params )
-{
-  if ( xglTraceIsEnabled("glGetPointervEXT") )
-    fprintf ( xglTraceFd, "  /* glGetPointervEXT ( (GLenum)%s, (void **)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) pname ), params ) ;
-#ifdef GL_VERSION_1_1
-    glGetPointerv ( pname, params ) ;
-#else
-#ifdef GL_EXT_vertex_array
-  if ( xglExecuteIsEnabled("glGetPointervEXT") )
-    glGetPointervEXT ( pname, params ) ;
-#else
-  fprintf ( xglTraceFd, "  glGetPointervEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglGetPolygonStipple ( GLubyte* mask )
-{
-  if ( xglTraceIsEnabled("glGetPolygonStipple") )
-    fprintf ( xglTraceFd, "  /* glGetPolygonStipple ( (GLubyte *)0x%08x ) ; */\n" , mask ) ;
-  if ( xglExecuteIsEnabled("glGetPolygonStipple") )
-    glGetPolygonStipple ( mask ) ;
-}
-
-void xglGetTexEnvfv ( GLenum target, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glGetTexEnvfv") )
-    fprintf ( xglTraceFd, "  /* glGetTexEnvfv ( (GLenum)%s, (GLenum)%s, (GLfloat *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetTexEnvfv") )
-    glGetTexEnvfv ( target, pname, params ) ;
-}
-
-void xglGetTexEnviv ( GLenum target, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glGetTexEnviv") )
-    fprintf ( xglTraceFd, "  /* glGetTexEnviv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetTexEnviv") )
-    glGetTexEnviv ( target, pname, params ) ;
-}
-
-void xglGetTexGendv ( GLenum coord, GLenum pname, GLdouble* params )
-{
-  if ( xglTraceIsEnabled("glGetTexGendv") )
-    fprintf ( xglTraceFd, "  /* glGetTexGendv ( (GLenum)%s, (GLenum)%s, (GLdouble *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) coord ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetTexGendv") )
-    glGetTexGendv ( coord, pname, params ) ;
-}
-
-void xglGetTexGenfv ( GLenum coord, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glGetTexGenfv") )
-    fprintf ( xglTraceFd, "  /* glGetTexGenfv ( (GLenum)%s, (GLenum)%s, (GLfloat *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) coord ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetTexGenfv") )
-    glGetTexGenfv ( coord, pname, params ) ;
-}
-
-void xglGetTexGeniv ( GLenum coord, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glGetTexGeniv") )
-    fprintf ( xglTraceFd, "  /* glGetTexGeniv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) coord ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetTexGeniv") )
-    glGetTexGeniv ( coord, pname, params ) ;
-}
-
-void xglGetTexImage ( GLenum target, GLint level, GLenum format, GLenum type, GLvoid* pixels )
-{
-  if ( xglTraceIsEnabled("glGetTexImage") )
-    fprintf ( xglTraceFd, "  /* glGetTexImage ( (GLenum)%s, (GLint)%d, (GLenum)%s, (GLenum)%s, (GLvoid *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) target ), level, xglExpandGLenum ( (GLenum) format ), xglExpandGLenum ( (GLenum) type ), pixels ) ;
-  if ( xglExecuteIsEnabled("glGetTexImage") )
-    glGetTexImage ( target, level, format, type, pixels ) ;
-}
-
-void xglGetTexLevelParameterfv ( GLenum target, GLint level, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glGetTexLevelParameterfv") )
-    fprintf ( xglTraceFd, "  /* glGetTexLevelParameterfv ( (GLenum)%s, (GLint)%d, (GLenum)%s, (GLfloat *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) target ), level, xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetTexLevelParameterfv") )
-    glGetTexLevelParameterfv ( target, level, pname, params ) ;
-}
-
-void xglGetTexLevelParameteriv ( GLenum target, GLint level, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glGetTexLevelParameteriv") )
-    fprintf ( xglTraceFd, "  /* glGetTexLevelParameteriv ( (GLenum)%s, (GLint)%d, (GLenum)%s, (GLint *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) target ), level, xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetTexLevelParameteriv") )
-    glGetTexLevelParameteriv ( target, level, pname, params ) ;
-}
-
-void xglGetTexParameterfv ( GLenum target, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glGetTexParameterfv") )
-    fprintf ( xglTraceFd, "  /* glGetTexParameterfv ( (GLenum)%s, (GLenum)%s, (GLfloat *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetTexParameterfv") )
-    glGetTexParameterfv ( target, pname, params ) ;
-}
-
-void xglGetTexParameteriv ( GLenum target, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glGetTexParameteriv") )
-    fprintf ( xglTraceFd, "  /* glGetTexParameteriv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ; */\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glGetTexParameteriv") )
-    glGetTexParameteriv ( target, pname, params ) ;
-}
-
-void xglHint ( GLenum target, GLenum mode )
-{
-  if ( xglTraceIsEnabled("glHint") )
-    fprintf ( xglTraceFd, "  glHint ( (GLenum)%s, (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glHint") )
-    glHint ( target, mode ) ;
-}
-
-void xglIndexMask ( GLuint mask )
-{
-  if ( xglTraceIsEnabled("glIndexMask") )
-    fprintf ( xglTraceFd, "  glIndexMask ( (GLuint)%u ) ;\n" , mask ) ;
-  if ( xglExecuteIsEnabled("glIndexMask") )
-    glIndexMask ( mask ) ;
-}
-
-void xglIndexPointerEXT ( GLenum type, GLsizei stride, GLsizei count, void* ptr )
-{
-  if ( xglTraceIsEnabled("glIndexPointerEXT") )
-    fprintf ( xglTraceFd, "  glIndexPointerEXT ( (GLenum)%s, (GLsizei)%d, (GLsizei)%d, (void *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) type ), stride, count, ptr ) ;
-#ifdef GL_VERSION_1_1
-    glIndexPointer ( type, stride, ptr ) ;
-#else
-#ifdef GL_EXT_vertex_array
-  if ( xglExecuteIsEnabled("glIndexPointerEXT") )
-    glIndexPointerEXT ( type, stride, count, ptr ) ;
-#else
-  fprintf ( xglTraceFd, "  glIndexPointerEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglIndexd ( GLdouble c )
-{
-  if ( xglTraceIsEnabled("glIndexd") )
-    fprintf ( xglTraceFd, "  glIndexd ( (GLdouble)%f ) ;\n" , c ) ;
-  if ( xglExecuteIsEnabled("glIndexd") )
-    glIndexd ( c ) ;
-}
-
-void xglIndexdv ( GLdouble* c )
-{
-  if ( xglTraceIsEnabled("glIndexdv") )
-    fprintf ( xglTraceFd, "  glIndexdv ( (GLdouble *)0x%08x ) ;\n" , c ) ;
-  if ( xglExecuteIsEnabled("glIndexdv") )
-    glIndexdv ( c ) ;
-}
-
-void xglIndexf ( GLfloat c )
-{
-  if ( xglTraceIsEnabled("glIndexf") )
-    fprintf ( xglTraceFd, "  glIndexf ( (GLfloat)%ff ) ;\n" , c ) ;
-  if ( xglExecuteIsEnabled("glIndexf") )
-    glIndexf ( c ) ;
-}
-
-void xglIndexfv ( GLfloat* c )
-{
-  if ( xglTraceIsEnabled("glIndexfv") )
-    fprintf ( xglTraceFd, "  glIndexfv ( (GLfloat *)0x%08x ) ;\n" , c ) ;
-  if ( xglExecuteIsEnabled("glIndexfv") )
-    glIndexfv ( c ) ;
-}
-
-void xglIndexi ( GLint c )
-{
-  if ( xglTraceIsEnabled("glIndexi") )
-    fprintf ( xglTraceFd, "  glIndexi ( (GLint)%d ) ;\n" , c ) ;
-  if ( xglExecuteIsEnabled("glIndexi") )
-    glIndexi ( c ) ;
-}
-
-void xglIndexiv ( GLint* c )
-{
-  if ( xglTraceIsEnabled("glIndexiv") )
-    fprintf ( xglTraceFd, "  glIndexiv ( (GLint *)0x%08x ) ;\n" , c ) ;
-  if ( xglExecuteIsEnabled("glIndexiv") )
-    glIndexiv ( c ) ;
-}
-
-void xglIndexs ( GLshort c )
-{
-  if ( xglTraceIsEnabled("glIndexs") )
-    fprintf ( xglTraceFd, "  glIndexs ( (GLshort)%d ) ;\n" , c ) ;
-  if ( xglExecuteIsEnabled("glIndexs") )
-    glIndexs ( c ) ;
-}
-
-void xglIndexsv ( GLshort* c )
-{
-  if ( xglTraceIsEnabled("glIndexsv") )
-    fprintf ( xglTraceFd, "  glIndexsv ( (GLshort *)0x%08x ) ;\n" , c ) ;
-  if ( xglExecuteIsEnabled("glIndexsv") )
-    glIndexsv ( c ) ;
-}
-
-void xglInitNames (  )
-{
-  if ( xglTraceIsEnabled("glInitNames") )
-    fprintf ( xglTraceFd, "  glInitNames (  ) ;\n"  ) ;
-  if ( xglExecuteIsEnabled("glInitNames") )
-    glInitNames (  ) ;
-}
-
-void xglLightModelf ( GLenum pname, GLfloat param )
-{
-  if ( xglTraceIsEnabled("glLightModelf") )
-    fprintf ( xglTraceFd, "  glLightModelf ( (GLenum)%s, (GLfloat)%ff ) ;\n" , xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glLightModelf") )
-    glLightModelf ( pname, param ) ;
-}
-
-void xglLightModelfv ( GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glLightModelfv") )
-    fprintf ( xglTraceFd, "  glLightModelfv ( (GLenum)%s, (GLfloat *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glLightModelfv") )
-    glLightModelfv ( pname, params ) ;
-}
-
-void xglLightModeli ( GLenum pname, GLint param )
-{
-  if ( xglTraceIsEnabled("glLightModeli") )
-    fprintf ( xglTraceFd, "  glLightModeli ( (GLenum)%s, (GLint)%d ) ;\n" , xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glLightModeli") )
-    glLightModeli ( pname, param ) ;
-}
-
-void xglLightModeliv ( GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glLightModeliv") )
-    fprintf ( xglTraceFd, "  glLightModeliv ( (GLenum)%s, (GLint *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glLightModeliv") )
-    glLightModeliv ( pname, params ) ;
-}
-
-void xglLightf ( GLenum light, GLenum pname, GLfloat param )
-{
-  if ( xglTraceIsEnabled("glLightf") )
-    fprintf ( xglTraceFd, "  glLightf ( (GLenum)%s, (GLenum)%s, (GLfloat)%ff ) ;\n" , xglExpandGLenum ( (GLenum) light ), xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glLightf") )
-    glLightf ( light, pname, param ) ;
-}
-
-void xglLightfv ( GLenum light, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glLightfv") )
-    fprintf ( xglTraceFd, "  glLightfv ( (GLenum)%s, (GLenum)%s, xglBuild4fv((GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff) ) ;\n",
-        xglExpandGLenum ( (GLenum) light ), xglExpandGLenum ( (GLenum) pname ), params[0], params[1], params[2], params[3] ) ;
-  if ( xglExecuteIsEnabled("glLightfv") )
-    glLightfv ( light, pname, params ) ;
-}
-
-void xglLighti ( GLenum light, GLenum pname, GLint param )
-{
-  if ( xglTraceIsEnabled("glLighti") )
-    fprintf ( xglTraceFd, "  glLighti ( (GLenum)%s, (GLenum)%s, (GLint)%d ) ;\n" , xglExpandGLenum ( (GLenum) light ), xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glLighti") )
-    glLighti ( light, pname, param ) ;
-}
-
-void xglLightiv ( GLenum light, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glLightiv") )
-    fprintf ( xglTraceFd, "  glLightiv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) light ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glLightiv") )
-    glLightiv ( light, pname, params ) ;
-}
-
-void xglLineStipple ( GLint factor, GLushort pattern )
-{
-  if ( xglTraceIsEnabled("glLineStipple") )
-    fprintf ( xglTraceFd, "  glLineStipple ( (GLint)%d, (GLushort)%u ) ;\n" , factor, pattern ) ;
-  if ( xglExecuteIsEnabled("glLineStipple") )
-    glLineStipple ( factor, pattern ) ;
-}
-
-void xglLineWidth ( GLfloat width )
-{
-  if ( xglTraceIsEnabled("glLineWidth") )
-    fprintf ( xglTraceFd, "  glLineWidth ( (GLfloat)%ff ) ;\n" , width ) ;
-  if ( xglExecuteIsEnabled("glLineWidth") )
-    glLineWidth ( width ) ;
-}
-
-void xglListBase ( GLuint base )
-{
-  if ( xglTraceIsEnabled("glListBase") )
-    fprintf ( xglTraceFd, "  glListBase ( (GLuint)%u ) ;\n" , base ) ;
-  if ( xglExecuteIsEnabled("glListBase") )
-    glListBase ( base ) ;
-}
-
-void xglLoadIdentity (  )
-{
-  if ( xglTraceIsEnabled("glLoadIdentity") )
-    fprintf ( xglTraceFd, "  glLoadIdentity (  ) ;\n"  ) ;
-  if ( xglExecuteIsEnabled("glLoadIdentity") )
-    glLoadIdentity (  ) ;
-}
-
-void xglLoadMatrixd ( GLdouble* m )
-{
-  if ( xglTraceIsEnabled("glLoadMatrixd") )
-  {
-    fprintf ( xglTraceFd, "  glLoadMatrixd ( xglBuildMatrixd(%f,%f,%f,%f,\n"    , m[ 0],m[ 1],m[ 2],m[ 3] ) ;
-    fprintf ( xglTraceFd, "                                  %f,%f,%f,%f,\n"    , m[ 4],m[ 5],m[ 6],m[ 7] ) ;
-    fprintf ( xglTraceFd, "                                  %f,%f,%f,%f,\n"    , m[ 8],m[ 9],m[10],m[11] ) ;
-    fprintf ( xglTraceFd, "                                  %f,%f,%f,%f) ) ;\n", m[12],m[13],m[14],m[15] ) ;
-  }
-
-  if ( xglExecuteIsEnabled("glLoadMatrixd") )
-    glLoadMatrixd ( m ) ;
-}
-
-void xglLoadMatrixf ( GLfloat* m )
-{
-  if ( xglTraceIsEnabled("glLoadMatrixf") )
-  {
-    fprintf ( xglTraceFd, "  glLoadMatrixf ( xglBuildMatrixf(%ff,%ff,%ff,%ff,\n"    , m[ 0],m[ 1],m[ 2],m[ 3] ) ;
-    fprintf ( xglTraceFd, "                                  %ff,%ff,%ff,%ff,\n"    , m[ 4],m[ 5],m[ 6],m[ 7] ) ;
-    fprintf ( xglTraceFd, "                                  %ff,%ff,%ff,%ff,\n"    , m[ 8],m[ 9],m[10],m[11] ) ;
-    fprintf ( xglTraceFd, "                                  %ff,%ff,%ff,%ff) ) ;\n", m[12],m[13],m[14],m[15] ) ;
-  }
-
-  if ( xglExecuteIsEnabled("glLoadMatrixf") )
-    glLoadMatrixf ( m ) ;
-}
-
-void xglLoadName ( GLuint name )
-{
-  if ( xglTraceIsEnabled("glLoadName") )
-    fprintf ( xglTraceFd, "  glLoadName ( (GLuint)%u ) ;\n" , name ) ;
-  if ( xglExecuteIsEnabled("glLoadName") )
-    glLoadName ( name ) ;
-}
-
-void xglLogicOp ( GLenum opcode )
-{
-  if ( xglTraceIsEnabled("glLogicOp") )
-    fprintf ( xglTraceFd, "  glLogicOp ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) opcode ) ) ;
-  if ( xglExecuteIsEnabled("glLogicOp") )
-    glLogicOp ( opcode ) ;
-}
-
-void xglMap1d ( GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, GLdouble* points )
-{
-  if ( xglTraceIsEnabled("glMap1d") )
-    fprintf ( xglTraceFd, "  glMap1d ( (GLenum)%s, (GLdouble)%f, (GLdouble)%f, (GLint)%d, (GLint)%d, (GLdouble *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) target ), u1, u2, stride, order, points ) ;
-  if ( xglExecuteIsEnabled("glMap1d") )
-    glMap1d ( target, u1, u2, stride, order, points ) ;
-}
-
-void xglMap1f ( GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, GLfloat* points )
-{
-  if ( xglTraceIsEnabled("glMap1f") )
-    fprintf ( xglTraceFd, "  glMap1f ( (GLenum)%s, (GLfloat)%ff, (GLfloat)%ff, (GLint)%d, (GLint)%d, (GLfloat *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) target ), u1, u2, stride, order, points ) ;
-  if ( xglExecuteIsEnabled("glMap1f") )
-    glMap1f ( target, u1, u2, stride, order, points ) ;
-}
-
-void xglMap2d ( GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble* points )
-{
-  if ( xglTraceIsEnabled("glMap2d") )
-    fprintf ( xglTraceFd, "  glMap2d ( (GLenum)%s, (GLdouble)%f, (GLdouble)%f, (GLint)%d, (GLint)%d, (GLdouble)%f, (GLdouble)%f, (GLint)%d, (GLint)%d, (GLdouble *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) target ), u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ) ;
-  if ( xglExecuteIsEnabled("glMap2d") )
-    glMap2d ( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ) ;
-}
-
-void xglMap2f ( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat* points )
-{
-  if ( xglTraceIsEnabled("glMap2f") )
-    fprintf ( xglTraceFd, "  glMap2f ( (GLenum)%s, (GLfloat)%ff, (GLfloat)%ff, (GLint)%d, (GLint)%d, (GLfloat)%ff, (GLfloat)%ff, (GLint)%d, (GLint)%d, (GLfloat *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) target ), u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ) ;
-  if ( xglExecuteIsEnabled("glMap2f") )
-    glMap2f ( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ) ;
-}
-
-void xglMapGrid1d ( GLint un, GLdouble u1, GLdouble u2 )
-{
-  if ( xglTraceIsEnabled("glMapGrid1d") )
-    fprintf ( xglTraceFd, "  glMapGrid1d ( (GLint)%d, (GLdouble)%f, (GLdouble)%f ) ;\n" , un, u1, u2 ) ;
-  if ( xglExecuteIsEnabled("glMapGrid1d") )
-    glMapGrid1d ( un, u1, u2 ) ;
-}
-
-void xglMapGrid1f ( GLint un, GLfloat u1, GLfloat u2 )
-{
-  if ( xglTraceIsEnabled("glMapGrid1f") )
-    fprintf ( xglTraceFd, "  glMapGrid1f ( (GLint)%d, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , un, u1, u2 ) ;
-  if ( xglExecuteIsEnabled("glMapGrid1f") )
-    glMapGrid1f ( un, u1, u2 ) ;
-}
-
-void xglMapGrid2d ( GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2 )
-{
-  if ( xglTraceIsEnabled("glMapGrid2d") )
-    fprintf ( xglTraceFd, "  glMapGrid2d ( (GLint)%d, (GLdouble)%f, (GLdouble)%f, (GLint)%d, (GLdouble)%f, (GLdouble)%f ) ;\n" , un, u1, u2, vn, v1, v2 ) ;
-  if ( xglExecuteIsEnabled("glMapGrid2d") )
-    glMapGrid2d ( un, u1, u2, vn, v1, v2 ) ;
-}
-
-void xglMapGrid2f ( GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2 )
-{
-  if ( xglTraceIsEnabled("glMapGrid2f") )
-    fprintf ( xglTraceFd, "  glMapGrid2f ( (GLint)%d, (GLfloat)%ff, (GLfloat)%ff, (GLint)%d, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , un, u1, u2, vn, v1, v2 ) ;
-  if ( xglExecuteIsEnabled("glMapGrid2f") )
-    glMapGrid2f ( un, u1, u2, vn, v1, v2 ) ;
-}
-
-void xglMaterialf ( GLenum face, GLenum pname, GLfloat param )
-{
-  if ( xglTraceIsEnabled("glMaterialf") )
-    fprintf ( xglTraceFd, "  glMaterialf ( (GLenum)%s, (GLenum)%s, (GLfloat)%ff ) ;\n" , xglExpandGLenum ( (GLenum) face ), xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glMaterialf") )
-    glMaterialf ( face, pname, param ) ;
-}
-
-void xglMaterialfv ( GLenum face, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glMaterialfv") )
-    fprintf ( xglTraceFd, "  glMaterialfv ( (GLenum)%s, (GLenum)%s, (GLfloat *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) face ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glMaterialfv") )
-    glMaterialfv ( face, pname, params ) ;
-}
-
-void xglMateriali ( GLenum face, GLenum pname, GLint param )
-{
-  if ( xglTraceIsEnabled("glMateriali") )
-    fprintf ( xglTraceFd, "  glMateriali ( (GLenum)%s, (GLenum)%s, (GLint)%d ) ;\n" , xglExpandGLenum ( (GLenum) face ), xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glMateriali") )
-    glMateriali ( face, pname, param ) ;
-}
-
-void xglMaterialiv ( GLenum face, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glMaterialiv") )
-    fprintf ( xglTraceFd, "  glMaterialiv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) face ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glMaterialiv") )
-    glMaterialiv ( face, pname, params ) ;
-}
-
-void xglMatrixMode ( GLenum mode )
-{
-  if ( xglTraceIsEnabled("glMatrixMode") )
-    fprintf ( xglTraceFd, "  glMatrixMode ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glMatrixMode") )
-    glMatrixMode ( mode ) ;
-}
-
-
-void xglMultMatrixd ( GLdouble* m )
-{
-  if ( xglTraceIsEnabled("glMultMatrixd") )
-  {
-    fprintf ( xglTraceFd, "  glMultMatrixd ( xglBuildMatrixd(%f,%f,%f,%f,\n"    , m[ 0],m[ 1],m[ 2],m[ 3] ) ;
-    fprintf ( xglTraceFd, "                                  %f,%f,%f,%f,\n"    , m[ 4],m[ 5],m[ 6],m[ 7] ) ;
-    fprintf ( xglTraceFd, "                                  %f,%f,%f,%f,\n"    , m[ 8],m[ 9],m[10],m[11] ) ;
-    fprintf ( xglTraceFd, "                                  %f,%f,%f,%f) ) ;\n", m[12],m[13],m[14],m[15] ) ;
-  }
-
-  if ( xglExecuteIsEnabled("glMultMatrixd") )
-    glMultMatrixd ( m ) ;
-}
-
-void xglMultMatrixf ( GLfloat* m )
-{
-  if ( xglTraceIsEnabled("glMultMatrixf") )
-  {
-    fprintf ( xglTraceFd, "  glMultMatrixf ( xglBuildMatrixf(%ff,%ff,%ff,%ff,\n"    , m[ 0],m[ 1],m[ 2],m[ 3] ) ;
-    fprintf ( xglTraceFd, "                                  %ff,%ff,%ff,%ff,\n"    , m[ 4],m[ 5],m[ 6],m[ 7] ) ;
-    fprintf ( xglTraceFd, "                                  %ff,%ff,%ff,%ff,\n"    , m[ 8],m[ 9],m[10],m[11] ) ;
-    fprintf ( xglTraceFd, "                                  %ff,%ff,%ff,%ff) ) ;\n", m[12],m[13],m[14],m[15] ) ;
-  }
-
-  if ( xglExecuteIsEnabled("glMultMatrixf") )
-    glMultMatrixf ( m ) ;
-}
-
-void xglNewList ( GLuint list, GLenum mode )
-{
-  if ( xglTraceIsEnabled("glNewList") )
-    fprintf ( xglTraceFd, "  glNewList ( (GLuint)%u, (GLenum)%s ) ;\n" , list, xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glNewList") )
-    glNewList ( list, mode ) ;
-}
-
-void xglNormal3b ( GLbyte nx, GLbyte ny, GLbyte nz )
-{
-  if ( xglTraceIsEnabled("glNormal3b") )
-    fprintf ( xglTraceFd, "  glNormal3b ( (GLbyte)%d, (GLbyte)%d, (GLbyte)%d ) ;\n" , nx, ny, nz ) ;
-  if ( xglExecuteIsEnabled("glNormal3b") )
-    glNormal3b ( nx, ny, nz ) ;
-}
-
-void xglNormal3bv ( GLbyte* v )
-{
-  if ( xglTraceIsEnabled("glNormal3bv") )
-    fprintf ( xglTraceFd, "  glNormal3bv ( xglBuild3bv((GLbyte)%d,(GLbyte)%d,(GLbyte)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glNormal3bv") )
-    glNormal3bv ( v ) ;
-}
-
-void xglNormal3d ( GLdouble nx, GLdouble ny, GLdouble nz )
-{
-  if ( xglTraceIsEnabled("glNormal3d") )
-    fprintf ( xglTraceFd, "  glNormal3d ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , nx, ny, nz ) ;
-  if ( xglExecuteIsEnabled("glNormal3d") )
-    glNormal3d ( nx, ny, nz ) ;
-}
-
-void xglNormal3dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glNormal3dv") )
-    fprintf ( xglTraceFd, "  glNormal3dv ( xglBuild3dv((GLdouble)%f,(GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glNormal3dv") )
-    glNormal3dv ( v ) ;
-}
-
-void xglNormal3f ( GLfloat nx, GLfloat ny, GLfloat nz )
-{
-  if ( xglTraceIsEnabled("glNormal3f") )
-    fprintf ( xglTraceFd, "  glNormal3f ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , nx, ny, nz ) ;
-  if ( xglExecuteIsEnabled("glNormal3f") )
-    glNormal3f ( nx, ny, nz ) ;
-}
-
-void xglNormal3fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glNormal3fv") )
-    fprintf ( xglTraceFd, "  glNormal3fv ( xglBuild3fv((GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glNormal3fv") )
-    glNormal3fv ( v ) ;
-}
-
-void xglNormal3i ( GLint nx, GLint ny, GLint nz )
-{
-  if ( xglTraceIsEnabled("glNormal3i") )
-    fprintf ( xglTraceFd, "  glNormal3i ( (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , nx, ny, nz ) ;
-  if ( xglExecuteIsEnabled("glNormal3i") )
-    glNormal3i ( nx, ny, nz ) ;
-}
-
-void xglNormal3iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glNormal3iv") )
-    fprintf ( xglTraceFd, "  glNormal3iv ( xglBuild3iv((GLint)%d,(GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glNormal3iv") )
-    glNormal3iv ( v ) ;
-}
-
-void xglNormal3s ( GLshort nx, GLshort ny, GLshort nz )
-{
-  if ( xglTraceIsEnabled("glNormal3s") )
-    fprintf ( xglTraceFd, "  glNormal3s ( (GLshort)%d, (GLshort)%d, (GLshort)%d ) ;\n" , nx, ny, nz ) ;
-  if ( xglExecuteIsEnabled("glNormal3s") )
-    glNormal3s ( nx, ny, nz ) ;
-}
-
-void xglNormal3sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glNormal3sv") )
-    fprintf ( xglTraceFd, "  glNormal3sv ( xglBuild3sv((GLshort)%d,(GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glNormal3sv") )
-    glNormal3sv ( v ) ;
-}
-
-void xglNormalPointerEXT ( GLenum type, GLsizei stride, GLsizei count, void* ptr )
-{
-  if ( xglTraceIsEnabled("glNormalPointerEXT") )
-    fprintf ( xglTraceFd, "  glNormalPointerEXT ( (GLenum)%s, (GLsizei)%d, (GLsizei)%d, (void *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) type ), stride, count, ptr ) ;
-#ifdef GL_VERSION_1_1
-    glNormalPointer ( type, stride, ptr ) ;
-#else
-#ifdef GL_EXT_vertex_array
-  if ( xglExecuteIsEnabled("glNormalPointerEXT") )
-    glNormalPointerEXT ( type, stride, count, ptr ) ;
-#else
-  fprintf ( xglTraceFd, "  glNormalPointerEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglOrtho ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val )
-{
-  if ( xglTraceIsEnabled("glOrtho") )
-    fprintf ( xglTraceFd, "  glOrtho ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , left, right, bottom, top, near_val, far_val ) ;
-  if ( xglExecuteIsEnabled("glOrtho") )
-    glOrtho ( left, right, bottom, top, near_val, far_val ) ;
-}
-
-void xglPassThrough ( GLfloat token )
-{
-  if ( xglTraceIsEnabled("glPassThrough") )
-    fprintf ( xglTraceFd, "  glPassThrough ( (GLfloat)%ff ) ;\n" , token ) ;
-  if ( xglExecuteIsEnabled("glPassThrough") )
-    glPassThrough ( token ) ;
-}
-
-void xglPixelMapfv ( GLenum map, GLint mapsize, GLfloat* values )
-{
-  if ( xglTraceIsEnabled("glPixelMapfv") )
-    fprintf ( xglTraceFd, "  glPixelMapfv ( (GLenum)%s, (GLint)%d, (GLfloat *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) map ), mapsize, values ) ;
-  if ( xglExecuteIsEnabled("glPixelMapfv") )
-    glPixelMapfv ( map, mapsize, values ) ;
-}
-
-void xglPixelMapuiv ( GLenum map, GLint mapsize, GLuint* values )
-{
-  if ( xglTraceIsEnabled("glPixelMapuiv") )
-    fprintf ( xglTraceFd, "  glPixelMapuiv ( (GLenum)%s, (GLint)%d, (GLuint *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) map ), mapsize, values ) ;
-  if ( xglExecuteIsEnabled("glPixelMapuiv") )
-    glPixelMapuiv ( map, mapsize, values ) ;
-}
-
-void xglPixelMapusv ( GLenum map, GLint mapsize, GLushort* values )
-{
-  if ( xglTraceIsEnabled("glPixelMapusv") )
-    fprintf ( xglTraceFd, "  glPixelMapusv ( (GLenum)%s, (GLint)%d, (GLushort *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) map ), mapsize, values ) ;
-  if ( xglExecuteIsEnabled("glPixelMapusv") )
-    glPixelMapusv ( map, mapsize, values ) ;
-}
-
-void xglPixelStoref ( GLenum pname, GLfloat param )
-{
-  if ( xglTraceIsEnabled("glPixelStoref") )
-    fprintf ( xglTraceFd, "  glPixelStoref ( (GLenum)%s, (GLfloat)%ff ) ;\n" , xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glPixelStoref") )
-    glPixelStoref ( pname, param ) ;
-}
-
-void xglPixelStorei ( GLenum pname, GLint param )
-{
-  if ( xglTraceIsEnabled("glPixelStorei") )
-    fprintf ( xglTraceFd, "  glPixelStorei ( (GLenum)%s, (GLint)%d ) ;\n" , xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glPixelStorei") )
-    glPixelStorei ( pname, param ) ;
-}
-
-void xglPixelTransferf ( GLenum pname, GLfloat param )
-{
-  if ( xglTraceIsEnabled("glPixelTransferf") )
-    fprintf ( xglTraceFd, "  glPixelTransferf ( (GLenum)%s, (GLfloat)%ff ) ;\n" , xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glPixelTransferf") )
-    glPixelTransferf ( pname, param ) ;
-}
-
-void xglPixelTransferi ( GLenum pname, GLint param )
-{
-  if ( xglTraceIsEnabled("glPixelTransferi") )
-    fprintf ( xglTraceFd, "  glPixelTransferi ( (GLenum)%s, (GLint)%d ) ;\n" , xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glPixelTransferi") )
-    glPixelTransferi ( pname, param ) ;
-}
-
-void xglPixelZoom ( GLfloat xfactor, GLfloat yfactor )
-{
-  if ( xglTraceIsEnabled("glPixelZoom") )
-    fprintf ( xglTraceFd, "  glPixelZoom ( (GLfloat)%ff, (GLfloat)%ff ) ;\n" , xfactor, yfactor ) ;
-  if ( xglExecuteIsEnabled("glPixelZoom") )
-    glPixelZoom ( xfactor, yfactor ) ;
-}
-
-void xglPointSize ( GLfloat size )
-{
-  if ( xglTraceIsEnabled("glPointSize") )
-    fprintf ( xglTraceFd, "  glPointSize ( (GLfloat)%ff ) ;\n" , size ) ;
-  if ( xglExecuteIsEnabled("glPointSize") )
-    glPointSize ( size ) ;
-}
-
-void xglPolygonMode ( GLenum face, GLenum mode )
-{
-  if ( xglTraceIsEnabled("glPolygonMode") )
-    fprintf ( xglTraceFd, "  glPolygonMode ( (GLenum)%s, (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) face ), xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glPolygonMode") )
-    glPolygonMode ( face, mode ) ;
-}
-
-void xglPolygonOffsetEXT ( GLfloat factor, GLfloat bias )
-{
-  if ( xglTraceIsEnabled("glPolygonOffsetEXT") )
-    fprintf ( xglTraceFd, "  glPolygonOffsetEXT ( (GLfloat)%ff, (GLfloat)%ff ) ;\n" , factor, bias ) ;
-
-#ifdef GL_VERSION_1_1
-  if ( xglExecuteIsEnabled("glPolygonOffsetEXT") )
-    glPolygonOffset ( factor, bias ) ;
-#else
-#ifdef GL_EXT_polygon_offset
-  if ( xglExecuteIsEnabled("glPolygonOffsetEXT") )
-    glPolygonOffsetEXT ( factor, bias ) ;
-#else
-  fprintf ( xglTraceFd, "  glPolygonOffsetEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglPolygonOffset ( GLfloat factor, GLfloat bias )
-{
-  if ( xglTraceIsEnabled("glPolygonOffset") )
-    fprintf ( xglTraceFd, "  glPolygonOffset ( (GLfloat)%ff, (GLfloat)%ff ) ;\n" , factor, bias ) ;
-#ifdef GL_VERSION_1_1
-  if ( xglExecuteIsEnabled("glPolygonOffset") )
-    glPolygonOffset ( factor, bias ) ;
-#else
-#ifdef GL_EXT_polygon_offset
-  if ( xglExecuteIsEnabled("glPolygonOffset") )
-    glPolygonOffsetEXT ( factor, bias ) ;
-#else
-  fprintf ( xglTraceFd, "  glPolygonOffsetEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglPolygonStipple ( GLubyte* mask )
-{
-  if ( xglTraceIsEnabled("glPolygonStipple") )
-    fprintf ( xglTraceFd, "  glPolygonStipple ( (GLubyte *)0x%08x ) ;\n" , mask ) ;
-  if ( xglExecuteIsEnabled("glPolygonStipple") )
-    glPolygonStipple ( mask ) ;
-}
-
-void xglPopAttrib (  )
-{
-  if ( xglTraceIsEnabled("glPopAttrib") )
-    fprintf ( xglTraceFd, "  glPopAttrib (  ) ;\n"  ) ;
-  if ( xglExecuteIsEnabled("glPopAttrib") )
-    glPopAttrib (  ) ;
-}
-
-void xglPopMatrix (  )
-{
-  if ( xglTraceIsEnabled("glPopMatrix") )
-    fprintf ( xglTraceFd, "  glPopMatrix (  ) ;\n"  ) ;
-  if ( xglExecuteIsEnabled("glPopMatrix") )
-    glPopMatrix (  ) ;
-}
-
-void xglPopName (  )
-{
-  if ( xglTraceIsEnabled("glPopName") )
-    fprintf ( xglTraceFd, "  glPopName (  ) ;\n"  ) ;
-  if ( xglExecuteIsEnabled("glPopName") )
-    glPopName (  ) ;
-}
-
-void xglPushAttrib ( GLbitfield mask )
-{
-  if ( xglTraceIsEnabled("glPushAttrib") )
-    fprintf ( xglTraceFd, "  glPushAttrib ( (GLbitfield)0x%08x ) ;\n" , mask ) ;
-  if ( xglExecuteIsEnabled("glPushAttrib") )
-    glPushAttrib ( mask ) ;
-}
-
-void xglPushMatrix (  )
-{
-  if ( xglTraceIsEnabled("glPushMatrix") )
-    fprintf ( xglTraceFd, "  glPushMatrix (  ) ;\n"  ) ;
-  if ( xglExecuteIsEnabled("glPushMatrix") )
-    glPushMatrix (  ) ;
-}
-
-void xglPushName ( GLuint name )
-{
-  if ( xglTraceIsEnabled("glPushName") )
-    fprintf ( xglTraceFd, "  glPushName ( (GLuint)%u ) ;\n" , name ) ;
-  if ( xglExecuteIsEnabled("glPushName") )
-    glPushName ( name ) ;
-}
-
-void xglRasterPos2d ( GLdouble x, GLdouble y )
-{
-  if ( xglTraceIsEnabled("glRasterPos2d") )
-    fprintf ( xglTraceFd, "  glRasterPos2d ( (GLdouble)%f, (GLdouble)%f ) ;\n" , x, y ) ;
-  if ( xglExecuteIsEnabled("glRasterPos2d") )
-    glRasterPos2d ( x, y ) ;
-}
-
-void xglRasterPos2dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos2dv") )
-    fprintf ( xglTraceFd, "  glRasterPos2dv ( xglBuild2dv((GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos2dv") )
-    glRasterPos2dv ( v ) ;
-}
-
-void xglRasterPos2f ( GLfloat x, GLfloat y )
-{
-  if ( xglTraceIsEnabled("glRasterPos2f") )
-    fprintf ( xglTraceFd, "  glRasterPos2f ( (GLfloat)%ff, (GLfloat)%ff ) ;\n" , x, y ) ;
-  if ( xglExecuteIsEnabled("glRasterPos2f") )
-    glRasterPos2f ( x, y ) ;
-}
-
-void xglRasterPos2fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos2fv") )
-    fprintf ( xglTraceFd, "  glRasterPos2fv ( xglBuild2fv((GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos2fv") )
-    glRasterPos2fv ( v ) ;
-}
-
-void xglRasterPos2i ( GLint x, GLint y )
-{
-  if ( xglTraceIsEnabled("glRasterPos2i") )
-    fprintf ( xglTraceFd, "  glRasterPos2i ( (GLint)%d, (GLint)%d ) ;\n" , x, y ) ;
-  if ( xglExecuteIsEnabled("glRasterPos2i") )
-    glRasterPos2i ( x, y ) ;
-}
-
-void xglRasterPos2iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos2iv") )
-    fprintf ( xglTraceFd, "  glRasterPos2iv ( xglBuild2iv((GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos2iv") )
-    glRasterPos2iv ( v ) ;
-}
-
-void xglRasterPos2s ( GLshort x, GLshort y )
-{
-  if ( xglTraceIsEnabled("glRasterPos2s") )
-    fprintf ( xglTraceFd, "  glRasterPos2s ( (GLshort)%d, (GLshort)%d ) ;\n" , x, y ) ;
-  if ( xglExecuteIsEnabled("glRasterPos2s") )
-    glRasterPos2s ( x, y ) ;
-}
-
-void xglRasterPos2sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos2sv") )
-    fprintf ( xglTraceFd, "  glRasterPos2sv ( xglBuild2sv((GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos2sv") )
-    glRasterPos2sv ( v ) ;
-}
-
-void xglRasterPos3d ( GLdouble x, GLdouble y, GLdouble z )
-{
-  if ( xglTraceIsEnabled("glRasterPos3d") )
-    fprintf ( xglTraceFd, "  glRasterPos3d ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glRasterPos3d") )
-    glRasterPos3d ( x, y, z ) ;
-}
-
-void xglRasterPos3dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos3dv") )
-    fprintf ( xglTraceFd, "  glRasterPos3dv ( xglBuild3dv((GLdouble)%f,(GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos3dv") )
-    glRasterPos3dv ( v ) ;
-}
-
-void xglRasterPos3f ( GLfloat x, GLfloat y, GLfloat z )
-{
-  if ( xglTraceIsEnabled("glRasterPos3f") )
-    fprintf ( xglTraceFd, "  glRasterPos3f ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glRasterPos3f") )
-    glRasterPos3f ( x, y, z ) ;
-}
-
-void xglRasterPos3fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos3fv") )
-    fprintf ( xglTraceFd, "  glRasterPos3fv ( xglBuild3fv((GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos3fv") )
-    glRasterPos3fv ( v ) ;
-}
-
-void xglRasterPos3i ( GLint x, GLint y, GLint z )
-{
-  if ( xglTraceIsEnabled("glRasterPos3i") )
-    fprintf ( xglTraceFd, "  glRasterPos3i ( (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glRasterPos3i") )
-    glRasterPos3i ( x, y, z ) ;
-}
-
-void xglRasterPos3iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos3iv") )
-    fprintf ( xglTraceFd, "  glRasterPos3iv ( xglBuild3iv((GLint)%d,(GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos3iv") )
-    glRasterPos3iv ( v ) ;
-}
-
-void xglRasterPos3s ( GLshort x, GLshort y, GLshort z )
-{
-  if ( xglTraceIsEnabled("glRasterPos3s") )
-    fprintf ( xglTraceFd, "  glRasterPos3s ( (GLshort)%d, (GLshort)%d, (GLshort)%d ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glRasterPos3s") )
-    glRasterPos3s ( x, y, z ) ;
-}
-
-void xglRasterPos3sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos3sv") )
-    fprintf ( xglTraceFd, "  glRasterPos3sv ( xglBuild3sv((GLshort)%d,(GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos3sv") )
-    glRasterPos3sv ( v ) ;
-}
-
-void xglRasterPos4d ( GLdouble x, GLdouble y, GLdouble z, GLdouble w )
-{
-  if ( xglTraceIsEnabled("glRasterPos4d") )
-    fprintf ( xglTraceFd, "  glRasterPos4d ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , x, y, z, w ) ;
-  if ( xglExecuteIsEnabled("glRasterPos4d") )
-    glRasterPos4d ( x, y, z, w ) ;
-}
-
-void xglRasterPos4dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos4dv") )
-    fprintf ( xglTraceFd, "  glRasterPos4dv ( xglBuild4dv((GLdouble)%f,(GLdouble)%f,(GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos4dv") )
-    glRasterPos4dv ( v ) ;
-}
-
-void xglRasterPos4f ( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
-{
-  if ( xglTraceIsEnabled("glRasterPos4f") )
-    fprintf ( xglTraceFd, "  glRasterPos4f ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , x, y, z, w ) ;
-  if ( xglExecuteIsEnabled("glRasterPos4f") )
-    glRasterPos4f ( x, y, z, w ) ;
-}
-
-void xglRasterPos4fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos4fv") )
-    fprintf ( xglTraceFd, "  glRasterPos4fv ( xglBuild4fv((GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos4fv") )
-    glRasterPos4fv ( v ) ;
-}
-
-void xglRasterPos4i ( GLint x, GLint y, GLint z, GLint w )
-{
-  if ( xglTraceIsEnabled("glRasterPos4i") )
-    fprintf ( xglTraceFd, "  glRasterPos4i ( (GLint)%d, (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , x, y, z, w ) ;
-  if ( xglExecuteIsEnabled("glRasterPos4i") )
-    glRasterPos4i ( x, y, z, w ) ;
-}
-
-void xglRasterPos4iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos4iv") )
-    fprintf ( xglTraceFd, "  glRasterPos4iv ( xglBuild4iv((GLint)%d,(GLint)%d,(GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos4iv") )
-    glRasterPos4iv ( v ) ;
-}
-
-void xglRasterPos4s ( GLshort x, GLshort y, GLshort z, GLshort w )
-{
-  if ( xglTraceIsEnabled("glRasterPos4s") )
-    fprintf ( xglTraceFd, "  glRasterPos4s ( (GLshort)%d, (GLshort)%d, (GLshort)%d, (GLshort)%d ) ;\n" , x, y, z, w ) ;
-  if ( xglExecuteIsEnabled("glRasterPos4s") )
-    glRasterPos4s ( x, y, z, w ) ;
-}
-
-void xglRasterPos4sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glRasterPos4sv") )
-    fprintf ( xglTraceFd, "  glRasterPos4sv ( xglBuild4sv((GLshort)%d,(GLshort)%d,(GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glRasterPos4sv") )
-    glRasterPos4sv ( v ) ;
-}
-
-void xglReadBuffer ( GLenum mode )
-{
-  if ( xglTraceIsEnabled("glReadBuffer") )
-    fprintf ( xglTraceFd, "  glReadBuffer ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glReadBuffer") )
-    glReadBuffer ( mode ) ;
-}
-
-void xglReadPixels ( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels )
-{
-  if ( xglTraceIsEnabled("glReadPixels") )
-    fprintf ( xglTraceFd, "  glReadPixels ( (GLint)%d, (GLint)%d, (GLsizei)%d, (GLsizei)%d, (GLenum)%s, (GLenum)%s, (GLvoid *)0x%08x ) ;\n" , x, y, width, height, xglExpandGLenum ( (GLenum) format ), xglExpandGLenum ( (GLenum) type ), pixels ) ;
-  if ( xglExecuteIsEnabled("glReadPixels") )
-    glReadPixels ( x, y, width, height, format, type, pixels ) ;
-}
-
-void xglRectd ( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 )
-{
-  if ( xglTraceIsEnabled("glRectd") )
-    fprintf ( xglTraceFd, "  glRectd ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , x1, y1, x2, y2 ) ;
-  if ( xglExecuteIsEnabled("glRectd") )
-    glRectd ( x1, y1, x2, y2 ) ;
-}
-
-void xglRectdv ( GLdouble* v1, GLdouble* v2 )
-{
-  if ( xglTraceIsEnabled("glRectdv") )
-    fprintf ( xglTraceFd, "  glRectdv ( (GLdouble *)0x%08x, (GLdouble *)0x%08x ) ;\n" , v1, v2 ) ;
-  if ( xglExecuteIsEnabled("glRectdv") )
-    glRectdv ( v1, v2 ) ;
-}
-
-void xglRectf ( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 )
-{
-  if ( xglTraceIsEnabled("glRectf") )
-    fprintf ( xglTraceFd, "  glRectf ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , x1, y1, x2, y2 ) ;
-  if ( xglExecuteIsEnabled("glRectf") )
-    glRectf ( x1, y1, x2, y2 ) ;
-}
-
-void xglRectfv ( GLfloat* v1, GLfloat* v2 )
-{
-  if ( xglTraceIsEnabled("glRectfv") )
-    fprintf ( xglTraceFd, "  glRectfv ( (GLfloat *)0x%08x, (GLfloat *)0x%08x ) ;\n" , v1, v2 ) ;
-  if ( xglExecuteIsEnabled("glRectfv") )
-    glRectfv ( v1, v2 ) ;
-}
-
-void xglRecti ( GLint x1, GLint y1, GLint x2, GLint y2 )
-{
-  if ( xglTraceIsEnabled("glRecti") )
-    fprintf ( xglTraceFd, "  glRecti ( (GLint)%d, (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , x1, y1, x2, y2 ) ;
-  if ( xglExecuteIsEnabled("glRecti") )
-    glRecti ( x1, y1, x2, y2 ) ;
-}
-
-void xglRectiv ( GLint* v1, GLint* v2 )
-{
-  if ( xglTraceIsEnabled("glRectiv") )
-    fprintf ( xglTraceFd, "  glRectiv ( (GLint *)0x%08x, (GLint *)0x%08x ) ;\n" , v1, v2 ) ;
-  if ( xglExecuteIsEnabled("glRectiv") )
-    glRectiv ( v1, v2 ) ;
-}
-
-void xglRects ( GLshort x1, GLshort y1, GLshort x2, GLshort y2 )
-{
-  if ( xglTraceIsEnabled("glRects") )
-    fprintf ( xglTraceFd, "  glRects ( (GLshort)%d, (GLshort)%d, (GLshort)%d, (GLshort)%d ) ;\n" , x1, y1, x2, y2 ) ;
-  if ( xglExecuteIsEnabled("glRects") )
-    glRects ( x1, y1, x2, y2 ) ;
-}
-
-void xglRectsv ( GLshort* v1, GLshort* v2 )
-{
-  if ( xglTraceIsEnabled("glRectsv") )
-    fprintf ( xglTraceFd, "  glRectsv ( (GLshort *)0x%08x, (GLshort *)0x%08x ) ;\n" , v1, v2 ) ;
-  if ( xglExecuteIsEnabled("glRectsv") )
-    glRectsv ( v1, v2 ) ;
-}
-
-void xglRotated ( GLdouble angle, GLdouble x, GLdouble y, GLdouble z )
-{
-  if ( xglTraceIsEnabled("glRotated") )
-    fprintf ( xglTraceFd, "  glRotated ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , angle, x, y, z ) ;
-  if ( xglExecuteIsEnabled("glRotated") )
-    glRotated ( angle, x, y, z ) ;
-}
-
-void xglRotatef ( GLfloat angle, GLfloat x, GLfloat y, GLfloat z )
-{
-  if ( xglTraceIsEnabled("glRotatef") )
-    fprintf ( xglTraceFd, "  glRotatef ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , angle, x, y, z ) ;
-  if ( xglExecuteIsEnabled("glRotatef") )
-    glRotatef ( angle, x, y, z ) ;
-}
-
-void xglScaled ( GLdouble x, GLdouble y, GLdouble z )
-{
-  if ( xglTraceIsEnabled("glScaled") )
-    fprintf ( xglTraceFd, "  glScaled ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glScaled") )
-    glScaled ( x, y, z ) ;
-}
-
-void xglScalef ( GLfloat x, GLfloat y, GLfloat z )
-{
-  if ( xglTraceIsEnabled("glScalef") )
-    fprintf ( xglTraceFd, "  glScalef ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glScalef") )
-    glScalef ( x, y, z ) ;
-}
-
-void xglScissor ( GLint x, GLint y, GLsizei width, GLsizei height )
-{
-  if ( xglTraceIsEnabled("glScissor") )
-    fprintf ( xglTraceFd, "  glScissor ( (GLint)%d, (GLint)%d, (GLsizei)%d, (GLsizei)%d ) ;\n" , x, y, width, height ) ;
-  if ( xglExecuteIsEnabled("glScissor") )
-    glScissor ( x, y, width, height ) ;
-}
-
-void xglSelectBuffer ( GLsizei size, GLuint* buffer )
-{
-  if ( xglTraceIsEnabled("glSelectBuffer") )
-    fprintf ( xglTraceFd, "  glSelectBuffer ( (GLsizei)%d, (GLuint *)0x%08x ) ;\n" , size, buffer ) ;
-  if ( xglExecuteIsEnabled("glSelectBuffer") )
-    glSelectBuffer ( size, buffer ) ;
-}
-
-void xglShadeModel ( GLenum mode )
-{
-  if ( xglTraceIsEnabled("glShadeModel") )
-    fprintf ( xglTraceFd, "  glShadeModel ( (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) mode ) ) ;
-  if ( xglExecuteIsEnabled("glShadeModel") )
-    glShadeModel ( mode ) ;
-}
-
-void xglStencilFunc ( GLenum func, GLint ref, GLuint mask )
-{
-  if ( xglTraceIsEnabled("glStencilFunc") )
-    fprintf ( xglTraceFd, "  glStencilFunc ( (GLenum)%s, (GLint)%d, (GLuint)%u ) ;\n" , xglExpandGLenum ( (GLenum) func ), ref, mask ) ;
-  if ( xglExecuteIsEnabled("glStencilFunc") )
-    glStencilFunc ( func, ref, mask ) ;
-}
-
-void xglStencilMask ( GLuint mask )
-{
-  if ( xglTraceIsEnabled("glStencilMask") )
-    fprintf ( xglTraceFd, "  glStencilMask ( (GLuint)%u ) ;\n" , mask ) ;
-  if ( xglExecuteIsEnabled("glStencilMask") )
-    glStencilMask ( mask ) ;
-}
-
-void xglStencilOp ( GLenum fail, GLenum zfail, GLenum zpass )
-{
-  if ( xglTraceIsEnabled("glStencilOp") )
-    fprintf ( xglTraceFd, "  glStencilOp ( (GLenum)%s, (GLenum)%s, (GLenum)%s ) ;\n" , xglExpandGLenum ( (GLenum) fail ), xglExpandGLenum ( (GLenum) zfail ), xglExpandGLenum ( (GLenum) zpass ) ) ;
-  if ( xglExecuteIsEnabled("glStencilOp") )
-    glStencilOp ( fail, zfail, zpass ) ;
-}
-
-void xglTexCoord1d ( GLdouble s )
-{
-  if ( xglTraceIsEnabled("glTexCoord1d") )
-    fprintf ( xglTraceFd, "  glTexCoord1d ( (GLdouble)%f ) ;\n" , s ) ;
-  if ( xglExecuteIsEnabled("glTexCoord1d") )
-    glTexCoord1d ( s ) ;
-}
-
-void xglTexCoord1dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord1dv") )
-    fprintf ( xglTraceFd, "  glTexCoord1dv ( xglBuild1dv((GLdouble)%f) ) ;\n" , v[0] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord1dv") )
-    glTexCoord1dv ( v ) ;
-}
-
-void xglTexCoord1f ( GLfloat s )
-{
-  if ( xglTraceIsEnabled("glTexCoord1f") )
-    fprintf ( xglTraceFd, "  glTexCoord1f ( (GLfloat)%ff ) ;\n" , s ) ;
-  if ( xglExecuteIsEnabled("glTexCoord1f") )
-    glTexCoord1f ( s ) ;
-}
-
-void xglTexCoord1fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord1fv") )
-    fprintf ( xglTraceFd, "  glTexCoord1fv ( xglBuild1fv((GLfloat)%ff) ) ;\n" , v[0] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord1fv") )
-    glTexCoord1fv ( v ) ;
-}
-
-void xglTexCoord1i ( GLint s )
-{
-  if ( xglTraceIsEnabled("glTexCoord1i") )
-    fprintf ( xglTraceFd, "  glTexCoord1i ( (GLint)%d ) ;\n" , s ) ;
-  if ( xglExecuteIsEnabled("glTexCoord1i") )
-    glTexCoord1i ( s ) ;
-}
-
-void xglTexCoord1iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord1iv") )
-    fprintf ( xglTraceFd, "  glTexCoord1iv ( xglBuild1iv((GLint)%d) ) ;\n" , v[0] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord1iv") )
-    glTexCoord1iv ( v ) ;
-}
-
-void xglTexCoord1s ( GLshort s )
-{
-  if ( xglTraceIsEnabled("glTexCoord1s") )
-    fprintf ( xglTraceFd, "  glTexCoord1s ( (GLshort)%d ) ;\n" , s ) ;
-  if ( xglExecuteIsEnabled("glTexCoord1s") )
-    glTexCoord1s ( s ) ;
-}
-
-void xglTexCoord1sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord1sv") )
-    fprintf ( xglTraceFd, "  glTexCoord1sv ( xglBuild1sv((GLshort)%d) ) ;\n" , v[0] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord1sv") )
-    glTexCoord1sv ( v ) ;
-}
-
-void xglTexCoord2d ( GLdouble s, GLdouble t )
-{
-  if ( xglTraceIsEnabled("glTexCoord2d") )
-    fprintf ( xglTraceFd, "  glTexCoord2d ( (GLdouble)%f, (GLdouble)%f ) ;\n" , s, t ) ;
-  if ( xglExecuteIsEnabled("glTexCoord2d") )
-    glTexCoord2d ( s, t ) ;
-}
-
-void xglTexCoord2dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord2dv") )
-    fprintf ( xglTraceFd, "  glTexCoord2dv ( xglBuild2dv((GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord2dv") )
-    glTexCoord2dv ( v ) ;
-}
-
-void xglTexCoord2f ( GLfloat s, GLfloat t )
-{
-  if ( xglTraceIsEnabled("glTexCoord2f") )
-    fprintf ( xglTraceFd, "  glTexCoord2f ( (GLfloat)%ff, (GLfloat)%ff ) ;\n" , s, t ) ;
-  if ( xglExecuteIsEnabled("glTexCoord2f") )
-    glTexCoord2f ( s, t ) ;
-}
-
-void xglTexCoord2fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord2fv") )
-    fprintf ( xglTraceFd, "  glTexCoord2fv ( xglBuild2fv((GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord2fv") )
-    glTexCoord2fv ( v ) ;
-}
-
-void xglTexCoord2i ( GLint s, GLint t )
-{
-  if ( xglTraceIsEnabled("glTexCoord2i") )
-    fprintf ( xglTraceFd, "  glTexCoord2i ( (GLint)%d, (GLint)%d ) ;\n" , s, t ) ;
-  if ( xglExecuteIsEnabled("glTexCoord2i") )
-    glTexCoord2i ( s, t ) ;
-}
-
-void xglTexCoord2iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord2iv") )
-    fprintf ( xglTraceFd, "  glTexCoord2iv ( xglBuild2iv((GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord2iv") )
-    glTexCoord2iv ( v ) ;
-}
-
-void xglTexCoord2s ( GLshort s, GLshort t )
-{
-  if ( xglTraceIsEnabled("glTexCoord2s") )
-    fprintf ( xglTraceFd, "  glTexCoord2s ( (GLshort)%d, (GLshort)%d ) ;\n" , s, t ) ;
-  if ( xglExecuteIsEnabled("glTexCoord2s") )
-    glTexCoord2s ( s, t ) ;
-}
-
-void xglTexCoord2sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord2sv") )
-    fprintf ( xglTraceFd, "  glTexCoord2sv ( xglBuild2sv((GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord2sv") )
-    glTexCoord2sv ( v ) ;
-}
-
-void xglTexCoord3d ( GLdouble s, GLdouble t, GLdouble r )
-{
-  if ( xglTraceIsEnabled("glTexCoord3d") )
-    fprintf ( xglTraceFd, "  glTexCoord3d ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , s, t, r ) ;
-  if ( xglExecuteIsEnabled("glTexCoord3d") )
-    glTexCoord3d ( s, t, r ) ;
-}
-
-void xglTexCoord3dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord3dv") )
-    fprintf ( xglTraceFd, "  glTexCoord3dv ( xglBuild3dv((GLdouble)%f,(GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord3dv") )
-    glTexCoord3dv ( v ) ;
-}
-
-void xglTexCoord3f ( GLfloat s, GLfloat t, GLfloat r )
-{
-  if ( xglTraceIsEnabled("glTexCoord3f") )
-    fprintf ( xglTraceFd, "  glTexCoord3f ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , s, t, r ) ;
-  if ( xglExecuteIsEnabled("glTexCoord3f") )
-    glTexCoord3f ( s, t, r ) ;
-}
-
-void xglTexCoord3fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord3fv") )
-    fprintf ( xglTraceFd, "  glTexCoord3fv ( xglBuild3fv((GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord3fv") )
-    glTexCoord3fv ( v ) ;
-}
-
-void xglTexCoord3i ( GLint s, GLint t, GLint r )
-{
-  if ( xglTraceIsEnabled("glTexCoord3i") )
-    fprintf ( xglTraceFd, "  glTexCoord3i ( (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , s, t, r ) ;
-  if ( xglExecuteIsEnabled("glTexCoord3i") )
-    glTexCoord3i ( s, t, r ) ;
-}
-
-void xglTexCoord3iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord3iv") )
-    fprintf ( xglTraceFd, "  glTexCoord3iv ( xglBuild3iv((GLint)%d,(GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord3iv") )
-    glTexCoord3iv ( v ) ;
-}
-
-void xglTexCoord3s ( GLshort s, GLshort t, GLshort r )
-{
-  if ( xglTraceIsEnabled("glTexCoord3s") )
-    fprintf ( xglTraceFd, "  glTexCoord3s ( (GLshort)%d, (GLshort)%d, (GLshort)%d ) ;\n" , s, t, r ) ;
-  if ( xglExecuteIsEnabled("glTexCoord3s") )
-    glTexCoord3s ( s, t, r ) ;
-}
-
-void xglTexCoord3sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord3sv") )
-    fprintf ( xglTraceFd, "  glTexCoord3sv ( xglBuild3sv((GLshort)%d,(GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord3sv") )
-    glTexCoord3sv ( v ) ;
-}
-
-void xglTexCoord4d ( GLdouble s, GLdouble t, GLdouble r, GLdouble q )
-{
-  if ( xglTraceIsEnabled("glTexCoord4d") )
-    fprintf ( xglTraceFd, "  glTexCoord4d ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , s, t, r, q ) ;
-  if ( xglExecuteIsEnabled("glTexCoord4d") )
-    glTexCoord4d ( s, t, r, q ) ;
-}
-
-void xglTexCoord4dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord4dv") )
-    fprintf ( xglTraceFd, "  glTexCoord4dv ( xglBuild4dv((GLdouble)%f,(GLdouble)%f,(GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord4dv") )
-    glTexCoord4dv ( v ) ;
-}
-
-void xglTexCoord4f ( GLfloat s, GLfloat t, GLfloat r, GLfloat q )
-{
-  if ( xglTraceIsEnabled("glTexCoord4f") )
-    fprintf ( xglTraceFd, "  glTexCoord4f ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , s, t, r, q ) ;
-  if ( xglExecuteIsEnabled("glTexCoord4f") )
-    glTexCoord4f ( s, t, r, q ) ;
-}
-
-void xglTexCoord4fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord4fv") )
-    fprintf ( xglTraceFd, "  glTexCoord4fv ( xglBuild4fv((GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord4fv") )
-    glTexCoord4fv ( v ) ;
-}
-
-void xglTexCoord4i ( GLint s, GLint t, GLint r, GLint q )
-{
-  if ( xglTraceIsEnabled("glTexCoord4i") )
-    fprintf ( xglTraceFd, "  glTexCoord4i ( (GLint)%d, (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , s, t, r, q ) ;
-  if ( xglExecuteIsEnabled("glTexCoord4i") )
-    glTexCoord4i ( s, t, r, q ) ;
-}
-
-void xglTexCoord4iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord4iv") )
-    fprintf ( xglTraceFd, "  glTexCoord4iv ( xglBuild4iv((GLint)%d,(GLint)%d,(GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord4iv") )
-    glTexCoord4iv ( v ) ;
-}
-
-void xglTexCoord4s ( GLshort s, GLshort t, GLshort r, GLshort q )
-{
-  if ( xglTraceIsEnabled("glTexCoord4s") )
-    fprintf ( xglTraceFd, "  glTexCoord4s ( (GLshort)%d, (GLshort)%d, (GLshort)%d, (GLshort)%d ) ;\n" , s, t, r, q ) ;
-  if ( xglExecuteIsEnabled("glTexCoord4s") )
-    glTexCoord4s ( s, t, r, q ) ;
-}
-
-void xglTexCoord4sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glTexCoord4sv") )
-    fprintf ( xglTraceFd, "  glTexCoord4sv ( xglBuild4sv((GLshort)%d,(GLshort)%d,(GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glTexCoord4sv") )
-    glTexCoord4sv ( v ) ;
-}
-
-void xglTexCoordPointerEXT ( GLint size, GLenum type, GLsizei stride, GLsizei count, void* ptr )
-{
-  if ( xglTraceIsEnabled("glTexCoordPointerEXT") )
-    fprintf ( xglTraceFd, "  glTexCoordPointerEXT ( (GLint)%d, (GLenum)%s, (GLsizei)%d, (GLsizei)%d, (void *)0x%08x ) ;\n" , size, xglExpandGLenum ( (GLenum) type ), stride, count, ptr ) ;
-#ifdef GL_VERSION_1_1
-    glTexCoordPointer ( size, type, stride, ptr ) ;
-#else
-#ifdef GL_EXT_vertex_array
-  if ( xglExecuteIsEnabled("glTexCoordPointerEXT") )
-    glTexCoordPointerEXT ( size, type, stride, count, ptr ) ;
-#else
-  fprintf ( xglTraceFd, "  glTexCoordPointerEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglTexEnvf ( GLenum target, GLenum pname, GLfloat param )
-{
-  if ( xglTraceIsEnabled("glTexEnvf") )
-    fprintf ( xglTraceFd, "  glTexEnvf ( (GLenum)%s, (GLenum)%s, (GLfloat)%ff ) ;\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glTexEnvf") )
-    glTexEnvf ( target, pname, param ) ;
-}
-
-void xglTexEnvfv ( GLenum target, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glTexEnvfv") )
-    fprintf ( xglTraceFd, "  glTexEnvfv ( (GLenum)%s, (GLenum)%s, xglBuild4fv(%ff,%ff,%ff,%ff) ) ;\n",
-                          xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), params[0], params[1], params[2], params[3] ) ;
-  if ( xglExecuteIsEnabled("glTexEnvfv") )
-    glTexEnvfv ( target, pname, params ) ;
-}
-
-void xglTexEnvi ( GLenum target, GLenum pname, GLint param )
-{
-  if ( xglTraceIsEnabled("glTexEnvi") )
-    fprintf ( xglTraceFd, "  glTexEnvi ( (GLenum)%s, (GLenum)%s, (GLint)%s ) ;\n",
-            xglExpandGLenum ( (GLenum) target ),
-            xglExpandGLenum ( (GLenum) pname ),
-            xglExpandGLenum ( (GLenum) param ) ) ;
-
-  if ( xglExecuteIsEnabled("glTexEnvi") )
-    glTexEnvi ( target, pname, param ) ;
-}
-
-void xglTexEnviv ( GLenum target, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glTexEnviv") )
-    fprintf ( xglTraceFd, "  glTexEnviv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glTexEnviv") )
-    glTexEnviv ( target, pname, params ) ;
-}
-
-void xglTexGend ( GLenum coord, GLenum pname, GLdouble param )
-{
-  if ( xglTraceIsEnabled("glTexGend") )
-    fprintf ( xglTraceFd, "  glTexGend ( (GLenum)%s, (GLenum)%s, (GLdouble)%f ) ;\n" , xglExpandGLenum ( (GLenum) coord ), xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glTexGend") )
-    glTexGend ( coord, pname, param ) ;
-}
-
-void xglTexGendv ( GLenum coord, GLenum pname, GLdouble* params )
-{
-  if ( xglTraceIsEnabled("glTexGendv") )
-    fprintf ( xglTraceFd, "  glTexGendv ( (GLenum)%s, (GLenum)%s, (GLdouble *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) coord ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glTexGendv") )
-    glTexGendv ( coord, pname, params ) ;
-}
-
-void xglTexGenf ( GLenum coord, GLenum pname, GLfloat param )
-{
-  if ( xglTraceIsEnabled("glTexGenf") )
-    fprintf ( xglTraceFd, "  glTexGenf ( (GLenum)%s, (GLenum)%s, (GLfloat)%ff ) ;\n" , xglExpandGLenum ( (GLenum) coord ), xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glTexGenf") )
-    glTexGenf ( coord, pname, param ) ;
-}
-
-void xglTexGenfv ( GLenum coord, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glTexGenfv") )
-    fprintf ( xglTraceFd, "  glTexGenfv ( (GLenum)%s, (GLenum)%s, (GLfloat *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) coord ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glTexGenfv") )
-    glTexGenfv ( coord, pname, params ) ;
-}
-
-void xglTexGeni ( GLenum coord, GLenum pname, GLint param )
-{
-  if ( xglTraceIsEnabled("glTexGeni") )
-    fprintf ( xglTraceFd, "  glTexGeni ( (GLenum)%s, (GLenum)%s, (GLint)%d ) ;\n" , xglExpandGLenum ( (GLenum) coord ), xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glTexGeni") )
-    glTexGeni ( coord, pname, param ) ;
-}
-
-void xglTexGeniv ( GLenum coord, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glTexGeniv") )
-    fprintf ( xglTraceFd, "  glTexGeniv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) coord ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glTexGeniv") )
-    glTexGeniv ( coord, pname, params ) ;
-}
-
-void xglTexImage1D ( GLenum target, GLint level, GLint components, GLsizei width, GLint border, GLenum format, GLenum type, GLvoid* pixels )
-{
-  if ( xglTraceIsEnabled("glTexImage1D") )
-    fprintf ( xglTraceFd, "  glTexImage1D ( (GLenum)%s, (GLint)%d, (GLint)%d, (GLsizei)%d, (GLint)%d, (GLenum)%s, (GLenum)%s, (GLvoid *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) target ), level, components, width, border, xglExpandGLenum ( (GLenum) format ), xglExpandGLenum ( (GLenum) type ), pixels ) ;
-  if ( xglExecuteIsEnabled("glTexImage1D") )
-    glTexImage1D ( target, level, components, width, border, format, type, pixels ) ;
-}
-
-void xglTexImage2D ( GLenum target, GLint level, GLint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLvoid* pixels )
-{
-  if ( xglTraceIsEnabled("glTexImage2D") )
-    fprintf ( xglTraceFd, "  glTexImage2D ( (GLenum)%s, (GLint)%d, (GLint)%d, (GLsizei)%d, (GLsizei)%d, (GLint)%d, (GLenum)%s, (GLenum)%s, (GLvoid *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) target ), level, components, width, height, border, xglExpandGLenum ( (GLenum) format ), xglExpandGLenum ( (GLenum) type ), pixels ) ;
-  if ( xglExecuteIsEnabled("glTexImage2D") )
-    glTexImage2D ( target, level, components, width, height, border, format, type, pixels ) ;
-}
-
-void xglTexParameterf ( GLenum target, GLenum pname, GLfloat param )
-{
-  if ( xglTraceIsEnabled("glTexParameterf") )
-    fprintf ( xglTraceFd, "  glTexParameterf ( (GLenum)%s, (GLenum)%s, (GLfloat)%ff ) ;\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glTexParameterf") )
-    glTexParameterf ( target, pname, param ) ;
-}
-
-void xglTexParameterfv ( GLenum target, GLenum pname, GLfloat* params )
-{
-  if ( xglTraceIsEnabled("glTexParameterfv") )
-    fprintf ( xglTraceFd, "  glTexParameterfv ( (GLenum)%s, (GLenum)%s, (GLfloat *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glTexParameterfv") )
-    glTexParameterfv ( target, pname, params ) ;
-}
-
-void xglTexParameteri ( GLenum target, GLenum pname, GLint param )
-{
-  if ( xglTraceIsEnabled("glTexParameteri") )
-    fprintf ( xglTraceFd, "  glTexParameteri ( (GLenum)%s, (GLenum)%s, (GLint)%d ) ;\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), param ) ;
-  if ( xglExecuteIsEnabled("glTexParameteri") )
-    glTexParameteri ( target, pname, param ) ;
-}
-
-void xglTexParameteriv ( GLenum target, GLenum pname, GLint* params )
-{
-  if ( xglTraceIsEnabled("glTexParameteriv") )
-    fprintf ( xglTraceFd, "  glTexParameteriv ( (GLenum)%s, (GLenum)%s, (GLint *)0x%08x ) ;\n" , xglExpandGLenum ( (GLenum) target ), xglExpandGLenum ( (GLenum) pname ), params ) ;
-  if ( xglExecuteIsEnabled("glTexParameteriv") )
-    glTexParameteriv ( target, pname, params ) ;
-}
-
-void xglTranslated ( GLdouble x, GLdouble y, GLdouble z )
-{
-  if ( xglTraceIsEnabled("glTranslated") )
-    fprintf ( xglTraceFd, "  glTranslated ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glTranslated") )
-    glTranslated ( x, y, z ) ;
-}
-
-void xglTranslatef ( GLfloat x, GLfloat y, GLfloat z )
-{
-  if ( xglTraceIsEnabled("glTranslatef") )
-    fprintf ( xglTraceFd, "  glTranslatef ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glTranslatef") )
-    glTranslatef ( x, y, z ) ;
-}
-
-void xglVertex2d ( GLdouble x, GLdouble y )
-{
-  if ( xglTraceIsEnabled("glVertex2d") )
-    fprintf ( xglTraceFd, "  glVertex2d ( (GLdouble)%f, (GLdouble)%f ) ;\n" , x, y ) ;
-  if ( xglExecuteIsEnabled("glVertex2d") )
-    glVertex2d ( x, y ) ;
-}
-
-void xglVertex2dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glVertex2dv") )
-    fprintf ( xglTraceFd, "  glVertex2dv ( xglBuild2dv((GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glVertex2dv") )
-    glVertex2dv ( v ) ;
-}
-
-void xglVertex2f ( GLfloat x, GLfloat y )
-{
-  if ( xglTraceIsEnabled("glVertex2f") )
-    fprintf ( xglTraceFd, "  glVertex2f ( (GLfloat)%ff, (GLfloat)%ff ) ;\n" , x, y ) ;
-  if ( xglExecuteIsEnabled("glVertex2f") )
-    glVertex2f ( x, y ) ;
-}
-
-void xglVertex2fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glVertex2fv") )
-    fprintf ( xglTraceFd, "  glVertex2fv ( xglBuild2fv((GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glVertex2fv") )
-    glVertex2fv ( v ) ;
-}
-
-void xglVertex2i ( GLint x, GLint y )
-{
-  if ( xglTraceIsEnabled("glVertex2i") )
-    fprintf ( xglTraceFd, "  glVertex2i ( (GLint)%d, (GLint)%d ) ;\n" , x, y ) ;
-  if ( xglExecuteIsEnabled("glVertex2i") )
-    glVertex2i ( x, y ) ;
-}
-
-void xglVertex2iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glVertex2iv") )
-    fprintf ( xglTraceFd, "  glVertex2iv ( xglBuild2iv((GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glVertex2iv") )
-    glVertex2iv ( v ) ;
-}
-
-void xglVertex2s ( GLshort x, GLshort y )
-{
-  if ( xglTraceIsEnabled("glVertex2s") )
-    fprintf ( xglTraceFd, "  glVertex2s ( (GLshort)%d, (GLshort)%d ) ;\n" , x, y ) ;
-  if ( xglExecuteIsEnabled("glVertex2s") )
-    glVertex2s ( x, y ) ;
-}
-
-void xglVertex2sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glVertex2sv") )
-    fprintf ( xglTraceFd, "  glVertex2sv ( xglBuild2sv((GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1] ) ;
-  if ( xglExecuteIsEnabled("glVertex2sv") )
-    glVertex2sv ( v ) ;
-}
-
-void xglVertex3d ( GLdouble x, GLdouble y, GLdouble z )
-{
-  if ( xglTraceIsEnabled("glVertex3d") )
-    fprintf ( xglTraceFd, "  glVertex3d ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glVertex3d") )
-    glVertex3d ( x, y, z ) ;
-}
-
-void xglVertex3dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glVertex3dv") )
-    fprintf ( xglTraceFd, "  glVertex3dv ( xglBuild3dv((GLdouble)%f,(GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glVertex3dv") )
-    glVertex3dv ( v ) ;
-}
-
-void xglVertex3f ( GLfloat x, GLfloat y, GLfloat z )
-{
-  if ( xglTraceIsEnabled("glVertex3f") )
-    fprintf ( xglTraceFd, "  glVertex3f ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glVertex3f") )
-    glVertex3f ( x, y, z ) ;
-}
-
-void xglVertex3fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glVertex3fv") )
-    fprintf ( xglTraceFd, "  glVertex3fv ( xglBuild3fv((GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glVertex3fv") )
-    glVertex3fv ( v ) ;
-}
-
-void xglVertex3i ( GLint x, GLint y, GLint z )
-{
-  if ( xglTraceIsEnabled("glVertex3i") )
-    fprintf ( xglTraceFd, "  glVertex3i ( (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glVertex3i") )
-    glVertex3i ( x, y, z ) ;
-}
-
-void xglVertex3iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glVertex3iv") )
-    fprintf ( xglTraceFd, "  glVertex3iv ( xglBuild3iv((GLint)%d,(GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glVertex3iv") )
-    glVertex3iv ( v ) ;
-}
-
-void xglVertex3s ( GLshort x, GLshort y, GLshort z )
-{
-  if ( xglTraceIsEnabled("glVertex3s") )
-    fprintf ( xglTraceFd, "  glVertex3s ( (GLshort)%d, (GLshort)%d, (GLshort)%d ) ;\n" , x, y, z ) ;
-  if ( xglExecuteIsEnabled("glVertex3s") )
-    glVertex3s ( x, y, z ) ;
-}
-
-void xglVertex3sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glVertex3sv") )
-    fprintf ( xglTraceFd, "  glVertex3sv ( xglBuild3sv((GLshort)%d,(GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1], v[2] ) ;
-  if ( xglExecuteIsEnabled("glVertex3sv") )
-    glVertex3sv ( v ) ;
-}
-
-void xglVertex4d ( GLdouble x, GLdouble y, GLdouble z, GLdouble w )
-{
-  if ( xglTraceIsEnabled("glVertex4d") )
-    fprintf ( xglTraceFd, "  glVertex4d ( (GLdouble)%f, (GLdouble)%f, (GLdouble)%f, (GLdouble)%f ) ;\n" , x, y, z, w ) ;
-  if ( xglExecuteIsEnabled("glVertex4d") )
-    glVertex4d ( x, y, z, w ) ;
-}
-
-void xglVertex4dv ( GLdouble* v )
-{
-  if ( xglTraceIsEnabled("glVertex4dv") )
-    fprintf ( xglTraceFd, "  glVertex4dv ( xglBuild4dv((GLdouble)%f,(GLdouble)%f,(GLdouble)%f,(GLdouble)%f) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glVertex4dv") )
-    glVertex4dv ( v ) ;
-}
-
-void xglVertex4f ( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
-{
-  if ( xglTraceIsEnabled("glVertex4f") )
-    fprintf ( xglTraceFd, "  glVertex4f ( (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff, (GLfloat)%ff ) ;\n" , x, y, z, w ) ;
-  if ( xglExecuteIsEnabled("glVertex4f") )
-    glVertex4f ( x, y, z, w ) ;
-}
-
-void xglVertex4fv ( GLfloat* v )
-{
-  if ( xglTraceIsEnabled("glVertex4fv") )
-    fprintf ( xglTraceFd, "  glVertex4fv ( xglBuild4fv((GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff,(GLfloat)%ff) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glVertex4fv") )
-    glVertex4fv ( v ) ;
-}
-
-void xglVertex4i ( GLint x, GLint y, GLint z, GLint w )
-{
-  if ( xglTraceIsEnabled("glVertex4i") )
-    fprintf ( xglTraceFd, "  glVertex4i ( (GLint)%d, (GLint)%d, (GLint)%d, (GLint)%d ) ;\n" , x, y, z, w ) ;
-  if ( xglExecuteIsEnabled("glVertex4i") )
-    glVertex4i ( x, y, z, w ) ;
-}
-
-void xglVertex4iv ( GLint* v )
-{
-  if ( xglTraceIsEnabled("glVertex4iv") )
-    fprintf ( xglTraceFd, "  glVertex4iv ( xglBuild4iv((GLint)%d,(GLint)%d,(GLint)%d,(GLint)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glVertex4iv") )
-    glVertex4iv ( v ) ;
-}
-
-void xglVertex4s ( GLshort x, GLshort y, GLshort z, GLshort w )
-{
-  if ( xglTraceIsEnabled("glVertex4s") )
-    fprintf ( xglTraceFd, "  glVertex4s ( (GLshort)%d, (GLshort)%d, (GLshort)%d, (GLshort)%d ) ;\n" , x, y, z, w ) ;
-  if ( xglExecuteIsEnabled("glVertex4s") )
-    glVertex4s ( x, y, z, w ) ;
-}
-
-void xglVertex4sv ( GLshort* v )
-{
-  if ( xglTraceIsEnabled("glVertex4sv") )
-    fprintf ( xglTraceFd, "  glVertex4sv ( xglBuild4sv((GLshort)%d,(GLshort)%d,(GLshort)%d,(GLshort)%d) ) ;\n" , v[0], v[1], v[2], v[3] ) ;
-  if ( xglExecuteIsEnabled("glVertex4sv") )
-    glVertex4sv ( v ) ;
-}
-
-void xglVertexPointerEXT ( GLint size, GLenum type, GLsizei stride, GLsizei count, void* ptr )
-{
-  if ( xglTraceIsEnabled("glVertexPointerEXT") )
-    fprintf ( xglTraceFd, "  glVertexPointerEXT ( (GLint)%d, (GLenum)%s, (GLsizei)%d, (GLsizei)%d, (void *)0x%08x ) ;\n" , size, xglExpandGLenum ( (GLenum) type ), stride, count, ptr ) ;
-#ifdef GL_VERSION_1_1
-    glVertexPointer ( size, type, stride, ptr ) ;
-#else
-#ifdef GL_EXT_vertex_array
-  if ( xglExecuteIsEnabled("glVertexPointerEXT") )
-    glVertexPointerEXT ( size, type, stride, count, ptr ) ;
-#else
-  fprintf ( xglTraceFd, "  glVertexPointerEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-#endif
-}
-
-void xglViewport ( GLint x, GLint y, GLsizei width, GLsizei height )
-{
-  if ( xglTraceIsEnabled("glViewport") )
-    fprintf ( xglTraceFd, "  glViewport ( (GLint)%d, (GLint)%d, (GLsizei)%d, (GLsizei)%d ) ;\n" , x, y, width, height ) ;
-  if ( xglExecuteIsEnabled("glViewport") )
-    glViewport ( x, y, width, height ) ;
-}
-
-void xglutAddMenuEntry ( char* label, int value )
-{
-  if ( xglTraceIsEnabled("glutAddMenuEntry") )
-    fprintf ( xglTraceFd, "  /* glutAddMenuEntry ( \"%s\", %d ) ; */\n" , label, value ) ;
-  if ( xglExecuteIsEnabled("glutAddMenuEntry") )
-    glutAddMenuEntry ( label, value ) ;
-}
-
-void xglutAttachMenu ( int button )
-{
-  if ( xglTraceIsEnabled("glutAttachMenu") )
-    fprintf ( xglTraceFd, "  /* glutAttachMenu ( %d ) ; */\n" , button ) ;
-  if ( xglExecuteIsEnabled("glutAttachMenu") )
-    glutAttachMenu ( button ) ;
-}
-
-int xglutCreateMenu ( void (*func)(int) )
-{
-  if ( xglTraceIsEnabled("glutCreateMenu") )
-    fprintf ( xglTraceFd, "  /* glutCreateMenu ( 0x%08x ) ; */\n" , func ) ;
-
-  return glutCreateMenu ( func ) ;
-}
-
-int xglutCreateWindow ( char* title )
-{
-  if ( xglTraceIsEnabled("glutCreateWindow") )
-    fprintf ( xglTraceFd, "  /* glutCreateWindow ( \"%s\" ) ; */\n" , title ) ;
-
-  return glutCreateWindow ( title ) ;
-}
-
-void xglutDisplayFunc ( void (*func)(void) )
-{
-  if ( xglTraceIsEnabled("glutDisplayFunc") )
-    fprintf ( xglTraceFd, "  /* glutDisplayFunc ( 0x%08x ) ; */\n" , func ) ;
-  if ( xglExecuteIsEnabled("glutDisplayFunc") )
-    glutDisplayFunc ( func ) ;
-}
-
-void xglutIdleFunc ( void (*func)(void) )
-{
-  if ( xglTraceIsEnabled("glutIdleFunc") )
-    fprintf ( xglTraceFd, "  /* glutIdleFunc ( 0x%08x ) ; */\n" , func ) ;
-  if ( xglExecuteIsEnabled("glutIdleFunc") )
-    glutIdleFunc ( func ) ;
-}
-
-void xglutInit ( int* argcp, char** argv )
-{
-  if(!xglTraceFd ) {     // Not defined by any other means, must be here
-    xglTraceFd = stdout; // avoid a crash from a NULL ptr.
-    }
-  if ( xglTraceIsEnabled("glutInit") )
-    fprintf ( xglTraceFd,
-              "  /* glutInit ( (int *)0x%08x, (char **)0x%08x ) ; */\n" ,
-              argcp, argv ) ;
-  if ( xglExecuteIsEnabled("glutInit") )
-    glutInit ( argcp, argv ) ;
-}
-
-void xglutInitDisplayMode ( unsigned int mode )
-{
-  if ( xglTraceIsEnabled("glutInitDisplayMode") )
-    fprintf ( xglTraceFd, "  /* glutInitDisplayMode ( %u ) ; */\n" , mode ) ;
-  if ( xglExecuteIsEnabled("glutInitDisplayMode") )
-    glutInitDisplayMode ( mode ) ;
-}
-
-void xglutInitWindowPosition ( int x, int y )
-{
-  if ( xglTraceIsEnabled("glutInitWindowPosition") )
-    fprintf ( xglTraceFd, "  /* glutInitWindowPosition ( %d, %d ) ; */\n" , x, y ) ;
-  if ( xglExecuteIsEnabled("glutInitWindowPosition") )
-    glutInitWindowPosition ( x, y ) ;
-}
-
-void xglutInitWindowSize ( int width, int height )
-{
-  if ( xglTraceIsEnabled("glutInitWindowSize") )
-    fprintf ( xglTraceFd, "  /* glutInitWindowSize ( %d, %d ) ; */\n" , width, height ) ;
-  if ( xglExecuteIsEnabled("glutInitWindowSize") )
-    glutInitWindowSize ( width, height ) ;
-}
-
-void xglutKeyboardFunc ( void (*func)(unsigned char key, int x, int y) )
-{
-  if ( xglTraceIsEnabled("glutKeyboardFunc") )
-    fprintf ( xglTraceFd, "  /* glutKeyboardFunc ( 0x%08x ) ; */\n" , func ) ;
-  if ( xglExecuteIsEnabled("glutKeyboardFunc") )
-    glutKeyboardFunc ( func ) ;
-}
-
-void xglutMainLoopUpdate (  )
-{
-  if ( xglTraceIsEnabled("glutMainLoopUpdate") )
-    fprintf ( xglTraceFd, "  /* glutMainLoopUpdate (  ) ; */\n"  ) ;
-  if ( xglExecuteIsEnabled("glutMainLoopUpdate") )
-    /* glutMainLoopUpdate (  ) ; */
-    printf("Steves glutMainLoopUpdate() hack not executed!!!!\n");
-}
-
-void xglutPostRedisplay (  )
-{
-  if ( xglTraceIsEnabled("glutPostRedisplay") )
-    fprintf ( xglTraceFd, "  /* glutPostRedisplay (  ) ; */\n"  ) ;
-  if ( xglExecuteIsEnabled("glutPostRedisplay") )
-    glutPostRedisplay (  ) ;
-}
-
-void xglutPreMainLoop (  )
-{
-  if ( xglTraceIsEnabled("glutPreMainLoop") )
-    fprintf ( xglTraceFd, "  /* glutPreMainLoop (  ) ; */\n"  ) ;
-  if ( xglExecuteIsEnabled("glutPreMainLoop") )
-    /* glutPreMainLoop (  ) ; */
-    printf("Steves glutPreLoopUpdate() hack not executed!!!!\n");
-
-}
-
-void xglutReshapeFunc ( void (*func)(int width, int height) )
-{
-  if ( xglTraceIsEnabled("glutReshapeFunc") )
-    fprintf ( xglTraceFd, "  /* glutReshapeFunc ( 0x%08x ) ; */\n" , func ) ;
-  if ( xglExecuteIsEnabled("glutReshapeFunc") )
-    glutReshapeFunc ( func ) ;
-}
-
-void xglutSwapBuffers ()
-{
-  if ( xglTraceIsEnabled("glutSwapBuffers") )
-    fprintf ( xglTraceFd, "  /* glutSwapBuffers (  ) ; */\n"  ) ;
-  if ( xglExecuteIsEnabled("glutSwapBuffers") )
-    glutSwapBuffers () ;
-}
-
-GLboolean xglAreTexturesResidentEXT ( GLsizei n, GLuint* textures, GLboolean* residences )
-{
-  if ( xglTraceIsEnabled("glAreTexturesResidentEXT") )
-    fprintf ( xglTraceFd, "  /* glAreTexturesResidentEXT ( (GLsizei)%d, (GLuint *)0x%08x, (GLboolean *)0x%08x ) ; */\n" , n, textures, residences ) ;
-
-#ifdef GL_TEXTURE_2D_BINDING_EXT
-  if ( xglExecuteIsEnabled("glAreTexturesResidentEXT") )
-    return glAreTexturesResidentEXT ( n, textures, residences ) ;
-#else
-  fprintf ( xglTraceFd, "  glAreTexturesResidentEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-
-  return TRUE ;
-}
-
-GLboolean xglIsTextureEXT ( GLuint texture )
-{
-  if ( xglTraceIsEnabled("glIsTextureEXT") )
-    fprintf ( xglTraceFd, "  /* glIsTextureEXT ( (GLuint)%u ) ; */\n" , texture ) ;
-
-#ifdef GL_TEXTURE_2D_BINDING_EXT
-  if ( xglExecuteIsEnabled("glIsTextureEXT") )
-    return glIsTextureEXT ( texture ) ;
-#else
-  fprintf ( xglTraceFd, "  glIsTextureEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-
-  return TRUE ;
-}
-
-void xglBindTextureEXT ( GLenum target, GLuint texture )
-{
-  if ( xglTraceIsEnabled("glBindTextureEXT") )
-    fprintf ( xglTraceFd, "  glBindTextureEXT ( (GLenum)%s, (GLuint)%u ) ;\n" , xglExpandGLenum ( (GLenum) target ), texture ) ;
-
-#ifdef GL_TEXTURE_2D_BINDING_EXT
-  if ( xglExecuteIsEnabled("glBindTextureEXT") )
-    glBindTextureEXT ( target, texture ) ;
-#else
-  fprintf ( xglTraceFd, "  glBindTextureEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-}
-
-void xglDeleteTexturesEXT ( GLsizei n, GLuint* textures )
-{
-  if ( xglTraceIsEnabled("glDeleteTexturesEXT") )
-    fprintf ( xglTraceFd, "  glDeleteTexturesEXT ( (GLsizei)%d, (GLuint *)0x%08x ) ;\n" , n, textures ) ;
-
-#ifdef GL_TEXTURE_2D_BINDING_EXT
-  if ( xglExecuteIsEnabled("glDeleteTexturesEXT") )
-    glDeleteTexturesEXT ( n, textures ) ;
-#else
-  fprintf ( xglTraceFd, "  glDeleteTextures isn't supported on this OpenGL!\n" ) ;
-#endif
-}
-
-void xglGenTexturesEXT ( GLsizei n, GLuint* textures )
-{
-  if ( xglTraceIsEnabled("glGenTexturesEXT") )
-    fprintf ( xglTraceFd, "  glGenTexturesEXT ( (GLsizei)%d, (GLuint *)0x%08x ) ;\n" , n, textures ) ;
-
-#ifdef GL_TEXTURE_2D_BINDING_EXT
-  if ( xglExecuteIsEnabled("glGenTexturesEXT") )
-    glGenTexturesEXT ( n, textures ) ;
-#else
-  fprintf ( xglTraceFd, "  glDeleteTexturesEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-}
-
-void xglPrioritizeTexturesEXT ( GLsizei n, GLuint* textures, GLclampf* priorities )
-{
-  if ( xglTraceIsEnabled("glPrioritizeTexturesEXT") )
-    fprintf ( xglTraceFd, "  glPrioritizeTexturesEXT ( (GLsizei)%d, (GLuint *)0x%08x, (GLclampf *)0x%08x ) ;\n" , n, textures, priorities ) ;
-
-#ifdef GL_TEXTURE_2D_BINDING_EXT
-  if ( xglExecuteIsEnabled("glPrioritizeTexturesEXT") )
-    glPrioritizeTexturesEXT ( n, textures, priorities ) ;
-#else
-  fprintf ( xglTraceFd, "  glPrioritizeTexturesEXT isn't supported on this OpenGL!\n" ) ;
-#endif
-}
-
-
-GLboolean xglAreTexturesResident ( GLsizei n, GLuint* textures, GLboolean* residences )
-{
-  if ( xglTraceIsEnabled("glAreTexturesResident") )
-    fprintf ( xglTraceFd, "  /* glAreTexturesResident ( (GLsizei)%d, (GLuint *)0x%08x, (GLboolean *)0x%08x ) ; */\n" , n, textures, residences ) ;
-
-#ifdef GL_VERSION_1_1
-  if ( xglExecuteIsEnabled("glAreTexturesResident") )
-    return glAreTexturesResident ( n, textures, residences ) ;
-#else
-  fprintf ( xglTraceFd, "  glAreTexturesResident isn't supported on this OpenGL!\n" ) ;
-#endif
-
-  return TRUE ;
-}
-
-GLboolean xglIsTexture ( GLuint texture )
-{
-  if ( xglTraceIsEnabled("glIsTexture") )
-    fprintf ( xglTraceFd, "  /* glIsTexture ( (GLuint)%u ) ; */\n" , texture ) ;
-
-#ifdef GL_VERSION_1_1
-  if ( xglExecuteIsEnabled("glIsTexture") )
-    return glIsTexture ( texture ) ;
-#else
-  fprintf ( xglTraceFd, "  glIsTexture isn't supported on this OpenGL!\n" ) ;
-#endif
-
-  return TRUE ;
-}
-
-void xglBindTexture ( GLenum target, GLuint texture )
-{
-  if ( xglTraceIsEnabled("glBindTexture") )
-    fprintf ( xglTraceFd, "  glBindTexture ( (GLenum)%s, (GLuint)%u ) ;\n" , xglExpandGLenum ( (GLenum) target ), texture ) ;
-
-#ifdef GL_VERSION_1_1
-  if ( xglExecuteIsEnabled("glBindTexture") )
-    glBindTexture ( target, texture ) ;
-#else
-  fprintf ( xglTraceFd, "  glBindTexture isn't supported on this OpenGL!\n" ) ;
-#endif
-}
-
-void xglDeleteTextures ( GLsizei n, GLuint* textures )
-{
-  if ( xglTraceIsEnabled("glDeleteTextures") )
-    fprintf ( xglTraceFd, "  glDeleteTextures ( (GLsizei)%d, (GLuint *)0x%08x ) ;\n" , n, textures ) ;
-
-#ifdef GL_VERSION_1_1
-  if ( xglExecuteIsEnabled("glDeleteTextures") )
-    glDeleteTextures ( n, textures ) ;
-#else
-  fprintf ( xglTraceFd, "  glDeleteTextures isn't supported on this OpenGL!\n" ) ;
-#endif
-}
-
-void xglGenTextures ( GLsizei n, GLuint* textures )
-{
-  if ( xglTraceIsEnabled("glGenTextures") )
-    fprintf ( xglTraceFd, "  glGenTextures ( (GLsizei)%d, (GLuint *)0x%08x ) ;\n" , n, textures ) ;
-
-#ifdef GL_VERSION_1_1
-  if ( xglExecuteIsEnabled("glGenTextures") )
-    glGenTextures ( n, textures ) ;
-#else
-  fprintf ( xglTraceFd, "  glDeleteTextures isn't supported on this OpenGL!\n" ) ;
-#endif
-}
-
-void xglPrioritizeTextures ( GLsizei n, GLuint* textures, GLclampf* priorities )
-{
-  if ( xglTraceIsEnabled("glPrioritizeTextures") )
-    fprintf ( xglTraceFd, "  glPrioritizeTextures ( (GLsizei)%d, (GLuint *)0x%08x, (GLclampf *)0x%08x ) ;\n" , n, textures, priorities ) ;
-
-#ifdef GL_VERSION_1_1
-  if ( xglExecuteIsEnabled("glPrioritizeTextures") )
-    glPrioritizeTextures ( n, textures, priorities ) ;
-#else
-  fprintf ( xglTraceFd, "  glPrioritizeTextures isn't supported on this OpenGL!\n" ) ;
-#endif
-}
-
-#endif
-
diff --git a/Lib/XGL/xgl.h b/Lib/XGL/xgl.h
deleted file mode 100644
index 434ab09d6..000000000
--- a/Lib/XGL/xgl.h
+++ /dev/null
@@ -1,837 +0,0 @@
-#ifndef _XGL_H
-#define _XGL_H
-
-
-#ifdef HAVE_WINDOWS_H
-#  include 
-#endif
-
-#include 
-#include 
-#include 
-
-
-#ifdef __cplusplus                                                          
-extern "C" {                            
-#endif                                   
-
-
-/* xgl Utilities */
-
-extern FILE *xglTraceFd ;
-
-int       xglTraceIsEnabled   ( char *gl_function_name ) ;
-int       xglExecuteIsEnabled ( char *gl_function_name ) ;
-char     *xglExpandGLenum     ( GLenum x ) ;
-
-GLdouble *xglBuild1dv  ( GLdouble v ) ;
-GLfloat  *xglBuild1fv  ( GLfloat  v ) ;
-GLbyte   *xglBuild1bv  ( GLbyte   v ) ;
-GLint    *xglBuild1iv  ( GLint    v ) ;
-GLshort  *xglBuild1sv  ( GLshort  v ) ;
-GLubyte  *xglBuild1ubv ( GLubyte  v ) ;
-GLuint   *xglBuild1uiv ( GLuint   v ) ;
-GLushort *xglBuild1usv ( GLushort v ) ;
-
-GLdouble *xglBuild2dv  ( GLdouble v0, GLdouble v1 ) ;
-GLfloat  *xglBuild2fv  ( GLfloat  v0, GLfloat  v1 ) ;
-GLbyte   *xglBuild2bv  ( GLbyte   v0, GLbyte   v1 ) ;
-GLint    *xglBuild2iv  ( GLint    v0, GLint    v1 ) ;
-GLshort  *xglBuild2sv  ( GLshort  v0, GLshort  v1 ) ;
-GLubyte  *xglBuild2ubv ( GLubyte  v0, GLubyte  v1 ) ;
-GLuint   *xglBuild2uiv ( GLuint   v0, GLuint   v1 ) ;
-GLushort *xglBuild2usv ( GLushort v0, GLushort v1 ) ;
-
-GLdouble *xglBuild3dv  ( GLdouble v0, GLdouble v1, GLdouble v2 ) ;
-GLfloat  *xglBuild3fv  ( GLfloat  v0, GLfloat  v1, GLfloat  v2 ) ;
-GLbyte   *xglBuild3bv  ( GLbyte   v0, GLbyte   v1, GLbyte   v2 ) ;
-GLint    *xglBuild3iv  ( GLint    v0, GLint    v1, GLint    v2 ) ;
-GLshort  *xglBuild3sv  ( GLshort  v0, GLshort  v1, GLshort  v2 ) ;
-GLubyte  *xglBuild3ubv ( GLubyte  v0, GLubyte  v1, GLubyte  v2 ) ;
-GLuint   *xglBuild3uiv ( GLuint   v0, GLuint   v1, GLuint   v2 ) ;
-GLushort *xglBuild3usv ( GLushort v0, GLushort v1, GLushort v2 ) ;
-
-GLdouble *xglBuild4dv  ( GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3 ) ;
-GLfloat  *xglBuild4fv  ( GLfloat  v0, GLfloat  v1, GLfloat  v2, GLfloat  v3 ) ;
-GLbyte   *xglBuild4bv  ( GLbyte   v0, GLbyte   v1, GLbyte   v2, GLbyte   v3 ) ;
-GLint    *xglBuild4iv  ( GLint    v0, GLint    v1, GLint    v2, GLint    v3 ) ;
-GLshort  *xglBuild4sv  ( GLshort  v0, GLshort  v1, GLshort  v2, GLshort  v3 ) ;
-GLubyte  *xglBuild4ubv ( GLubyte  v0, GLubyte  v1, GLubyte  v2, GLubyte  v3 ) ;
-GLuint   *xglBuild4uiv ( GLuint   v0, GLuint   v1, GLuint   v2, GLuint   v3 ) ;
-GLushort *xglBuild4usv ( GLushort v0, GLushort v1, GLushort v2, GLushort v3 ) ;
-
-GLfloat  *xglBuildMatrixf ( GLfloat m0 , GLfloat m1 , GLfloat m2 , GLfloat m3 ,
-                            GLfloat m4 , GLfloat m5 , GLfloat m6 , GLfloat m7 ,
-                            GLfloat m8 , GLfloat m9 , GLfloat m10, GLfloat m11,
-                            GLfloat m12, GLfloat m13, GLfloat m14, GLfloat m15 ) ;
-
-GLdouble *xglBuildMatrixd ( GLdouble m0 , GLdouble m1 , GLdouble m2 , GLdouble m3 ,
-                            GLdouble m4 , GLdouble m5 , GLdouble m6 , GLdouble m7 ,
-                            GLdouble m8 , GLdouble m9 , GLdouble m10, GLdouble m11,
-                            GLdouble m12, GLdouble m13, GLdouble m14, GLdouble m15 ) ;
-
-/*
-  Conditionally compile all 'xgl' calls into standard 'gl' calls...
-
-  OR
-
-  Declare all possible 'xgl' calls as 'extern'.
-*/
-
-#ifndef XGL_TRACE
-
-#define xglAccum		glAccum	
-#define xglAlphaFunc		glAlphaFunc	
-#ifdef GL_EXT_vertex_array
-#define xglArrayElementEXT	glArrayElementEXT	
-#endif
-#define xglBegin		glBegin	
-#define xglBitmap		glBitmap	
-#ifdef GL_EXT_blend_color
-#define xglBlendColorEXT	glBlendColorEXT	
-#endif
-#ifdef GL_EXT_blend_minmax
-#define xglBlendEquationEXT	glBlendEquationEXT	
-#endif
-#define xglBlendFunc		glBlendFunc	
-#define xglCallList		glCallList	
-#define xglCallLists		glCallLists	
-#define xglClear		glClear	
-#define xglClearAccum		glClearAccum	
-#define xglClearColor		glClearColor	
-#define xglClearDepth		glClearDepth	
-#define xglClearIndex		glClearIndex	
-#define xglClearStencil		glClearStencil	
-#define xglClipPlane		glClipPlane	
-#define xglColor3b		glColor3b	
-#define xglColor3bv		glColor3bv	
-#define xglColor3d		glColor3d	
-#define xglColor3dv		glColor3dv	
-#define xglColor3f		glColor3f	
-#define xglColor3fv		glColor3fv	
-#define xglColor3i		glColor3i	
-#define xglColor3iv		glColor3iv	
-#define xglColor3s		glColor3s	
-#define xglColor3sv		glColor3sv	
-#define xglColor3ub		glColor3ub	
-#define xglColor3ubv		glColor3ubv	
-#define xglColor3ui		glColor3ui	
-#define xglColor3uiv		glColor3uiv	
-#define xglColor3us		glColor3us	
-#define xglColor3usv		glColor3usv	
-#define xglColor4b		glColor4b	
-#define xglColor4bv		glColor4bv	
-#define xglColor4d		glColor4d	
-#define xglColor4dv		glColor4dv	
-#define xglColor4f		glColor4f	
-#define xglColor4fv		glColor4fv	
-#define xglColor4i		glColor4i	
-#define xglColor4iv		glColor4iv	
-#define xglColor4s		glColor4s	
-#define xglColor4sv		glColor4sv	
-#define xglColor4ub		glColor4ub	
-#define xglColor4ubv		glColor4ubv	
-#define xglColor4ui		glColor4ui	
-#define xglColor4uiv		glColor4uiv	
-#define xglColor4us		glColor4us	
-#define xglColor4usv		glColor4usv	
-#define xglColorMask		glColorMask	
-#define xglColorMaterial	glColorMaterial	
-#ifdef GL_EXT_vertex_array
-#define xglColorPointerEXT	glColorPointerEXT	
-#endif
-#define xglCopyPixels		glCopyPixels	
-#define xglCullFace		glCullFace	
-#define xglDeleteLists		glDeleteLists	
-#define xglDepthFunc		glDepthFunc	
-#define xglDepthMask		glDepthMask	
-#define xglDepthRange		glDepthRange	
-#define xglDisable		glDisable	
-#ifdef GL_EXT_vertex_array
-#define xglDrawArraysEXT	glDrawArraysEXT	
-#endif
-#define xglDrawBuffer		glDrawBuffer	
-#define xglDrawPixels		glDrawPixels	
-#define xglEdgeFlag		glEdgeFlag	
-#ifdef GL_EXT_vertex_array
-#define xglEdgeFlagPointerEXT	glEdgeFlagPointerEXT	
-#endif
-#define xglEdgeFlagv		glEdgeFlagv	
-#define xglEnable		glEnable	
-#define xglEnd			glEnd	
-#define xglEndList		glEndList	
-#define xglEvalCoord1d		glEvalCoord1d	
-#define xglEvalCoord1dv		glEvalCoord1dv	
-#define xglEvalCoord1f		glEvalCoord1f	
-#define xglEvalCoord1fv		glEvalCoord1fv	
-#define xglEvalCoord2d		glEvalCoord2d	
-#define xglEvalCoord2dv		glEvalCoord2dv	
-#define xglEvalCoord2f		glEvalCoord2f	
-#define xglEvalCoord2fv		glEvalCoord2fv	
-#define xglEvalMesh1		glEvalMesh1	
-#define xglEvalMesh2		glEvalMesh2	
-#define xglEvalPoint1		glEvalPoint1	
-#define xglEvalPoint2		glEvalPoint2	
-#define xglFeedbackBuffer	glFeedbackBuffer	
-#define xglFinish		glFinish	
-#define xglFlush		glFlush	
-#define xglFogf			glFogf	
-#define xglFogfv		glFogfv	
-#define xglFogi			glFogi	
-#define xglFogiv		glFogiv	
-#define xglFrontFace		glFrontFace	
-#define xglFrustum		glFrustum	
-#define xglGenLists		glGenLists	
-#define xglGetBooleanv		glGetBooleanv	
-#define xglGetClipPlane		glGetClipPlane	
-#define xglGetDoublev		glGetDoublev	
-#define xglGetError		glGetError	
-#define xglGetFloatv		glGetFloatv	
-#define xglGetIntegerv		glGetIntegerv	
-#define xglGetLightfv		glGetLightfv	
-#define xglGetLightiv		glGetLightiv	
-#define xglGetMapdv		glGetMapdv	
-#define xglGetMapfv		glGetMapfv	
-#define xglGetMapiv		glGetMapiv	
-#define xglGetMaterialfv	glGetMaterialfv	
-#define xglGetMaterialiv	glGetMaterialiv	
-#define xglGetPixelMapfv	glGetPixelMapfv	
-#define xglGetPixelMapuiv	glGetPixelMapuiv	
-#define xglGetPixelMapusv	glGetPixelMapusv	
-#ifdef GL_EXT_vertex_array
-#define xglGetPointervEXT	glGetPointervEXT	
-#endif
-#define xglGetPolygonStipple	glGetPolygonStipple	
-#define xglGetString		glGetString	
-#define xglGetTexEnvfv		glGetTexEnvfv	
-#define xglGetTexEnviv		glGetTexEnviv	
-#define xglGetTexGendv		glGetTexGendv	
-#define xglGetTexGenfv		glGetTexGenfv	
-#define xglGetTexGeniv		glGetTexGeniv	
-#define xglGetTexImage		glGetTexImage	
-#define xglGetTexLevelParameterfv glGetTexLevelParameterfv	
-#define xglGetTexLevelParameteriv glGetTexLevelParameteriv	
-#define xglGetTexParameterfv	glGetTexParameterfv	
-#define xglGetTexParameteriv	glGetTexParameteriv	
-#define xglHint			glHint	
-#define xglIndexMask		glIndexMask	
-#ifdef GL_EXT_vertex_array
-#define xglIndexPointerEXT	glIndexPointerEXT	
-#endif
-#define xglIndexd		glIndexd	
-#define xglIndexdv		glIndexdv	
-#define xglIndexf		glIndexf	
-#define xglIndexfv		glIndexfv	
-#define xglIndexi		glIndexi	
-#define xglIndexiv		glIndexiv	
-#define xglIndexs		glIndexs	
-#define xglIndexsv		glIndexsv	
-#define xglInitNames		glInitNames	
-#define xglIsEnabled		glIsEnabled	
-#define xglIsList		glIsList	
-#define xglLightModelf		glLightModelf	
-#define xglLightModelfv		glLightModelfv	
-#define xglLightModeli		glLightModeli	
-#define xglLightModeliv		glLightModeliv	
-#define xglLightf		glLightf	
-#define xglLightfv		glLightfv	
-#define xglLighti		glLighti	
-#define xglLightiv		glLightiv	
-#define xglLineStipple		glLineStipple	
-#define xglLineWidth		glLineWidth	
-#define xglListBase		glListBase	
-#define xglLoadIdentity		glLoadIdentity	
-#define xglLoadMatrixd		glLoadMatrixd	
-#define xglLoadMatrixf		glLoadMatrixf	
-#define xglLoadName		glLoadName	
-#define xglLogicOp		glLogicOp	
-#define xglMap1d		glMap1d	
-#define xglMap1f		glMap1f	
-#define xglMap2d		glMap2d	
-#define xglMap2f		glMap2f	
-#define xglMapGrid1d		glMapGrid1d	
-#define xglMapGrid1f		glMapGrid1f	
-#define xglMapGrid2d		glMapGrid2d	
-#define xglMapGrid2f		glMapGrid2f	
-#define xglMaterialf		glMaterialf	
-#define xglMaterialfv		glMaterialfv	
-#define xglMateriali		glMateriali	
-#define xglMaterialiv		glMaterialiv	
-#define xglMatrixMode		glMatrixMode	
-#define xglMultMatrixd		glMultMatrixd	
-#define xglMultMatrixf		glMultMatrixf	
-#define xglNewList		glNewList	
-#define xglNormal3b		glNormal3b	
-#define xglNormal3bv		glNormal3bv	
-#define xglNormal3d		glNormal3d	
-#define xglNormal3dv		glNormal3dv	
-#define xglNormal3f		glNormal3f	
-#ifdef DEBUGGING_NORMALS
-#define xglNormal3fv(f)		{\
-float ff = (f)[0]*(f)[0]+(f)[1]*(f)[1]+(f)[2]*(f)[2];\
-if ( ff < 0.9 || ff > 1.1 )\
-{\
-fprintf(stderr,"glNormal3fv Overflow: %f, %f, %f -> %f [%s,%s,%s]\n",\
-(f)[0],(f)[1],(f)[2],ff,str1,str2,str3);\
-normal_bombed = 1 ;\
-}\
-glNormal3fv(f);\
-}
-#else
-#define xglNormal3fv   		glNormal3fv
-#endif
-#define xglNormal3i		glNormal3i	
-#define xglNormal3iv		glNormal3iv	
-#define xglNormal3s		glNormal3s	
-#define xglNormal3sv		glNormal3sv	
-#ifdef GL_EXT_vertex_array
-#define xglNormalPointerEXT	glNormalPointerEXT	
-#endif
-#define xglOrtho		glOrtho	
-#define xglPassThrough		glPassThrough	
-#define xglPixelMapfv		glPixelMapfv	
-#define xglPixelMapuiv		glPixelMapuiv	
-#define xglPixelMapusv		glPixelMapusv	
-#define xglPixelStoref		glPixelStoref	
-#define xglPixelStorei		glPixelStorei	
-#define xglPixelTransferf	glPixelTransferf	
-#define xglPixelTransferi	glPixelTransferi	
-#define xglPixelZoom		glPixelZoom	
-#define xglPointSize		glPointSize	
-#define xglPolygonMode		glPolygonMode	
-#ifdef GL_EXT_polygon_offset
-#define xglPolygonOffsetEXT	glPolygonOffsetEXT	
-#endif
-#define xglPolygonOffset	glPolygonOffset	
-#define xglPolygonStipple	glPolygonStipple	
-#define xglPopAttrib		glPopAttrib	
-#define xglPopMatrix		glPopMatrix	
-#define xglPopName		glPopName	
-#define xglPushAttrib		glPushAttrib	
-#define xglPushMatrix		glPushMatrix	
-#define xglPushName		glPushName	
-#define xglRasterPos2d		glRasterPos2d	
-#define xglRasterPos2dv		glRasterPos2dv	
-#define xglRasterPos2f		glRasterPos2f	
-#define xglRasterPos2fv		glRasterPos2fv	
-#define xglRasterPos2i		glRasterPos2i	
-#define xglRasterPos2iv		glRasterPos2iv	
-#define xglRasterPos2s		glRasterPos2s	
-#define xglRasterPos2sv		glRasterPos2sv	
-#define xglRasterPos3d		glRasterPos3d	
-#define xglRasterPos3dv		glRasterPos3dv	
-#define xglRasterPos3f		glRasterPos3f	
-#define xglRasterPos3fv		glRasterPos3fv	
-#define xglRasterPos3i		glRasterPos3i	
-#define xglRasterPos3iv		glRasterPos3iv	
-#define xglRasterPos3s		glRasterPos3s	
-#define xglRasterPos3sv		glRasterPos3sv	
-#define xglRasterPos4d		glRasterPos4d	
-#define xglRasterPos4dv		glRasterPos4dv	
-#define xglRasterPos4f		glRasterPos4f	
-#define xglRasterPos4fv		glRasterPos4fv	
-#define xglRasterPos4i		glRasterPos4i	
-#define xglRasterPos4iv		glRasterPos4iv	
-#define xglRasterPos4s		glRasterPos4s	
-#define xglRasterPos4sv		glRasterPos4sv	
-#define xglReadBuffer		glReadBuffer	
-#define xglReadPixels		glReadPixels	
-#define xglRectd		glRectd	
-#define xglRectdv		glRectdv	
-#define xglRectf		glRectf	
-#define xglRectfv		glRectfv	
-#define xglRecti		glRecti	
-#define xglRectiv		glRectiv	
-#define xglRects		glRects	
-#define xglRectsv		glRectsv	
-#define xglRenderMode		glRenderMode	
-#define xglRotated		glRotated	
-#define xglRotatef		glRotatef	
-#define xglScaled		glScaled	
-#define xglScalef		glScalef	
-#define xglScissor		glScissor	
-#define xglSelectBuffer		glSelectBuffer	
-#define xglShadeModel		glShadeModel	
-#define xglStencilFunc		glStencilFunc	
-#define xglStencilMask		glStencilMask	
-#define xglStencilOp		glStencilOp	
-#define xglTexCoord1d		glTexCoord1d	
-#define xglTexCoord1dv		glTexCoord1dv	
-#define xglTexCoord1f		glTexCoord1f	
-#define xglTexCoord1fv		glTexCoord1fv	
-#define xglTexCoord1i		glTexCoord1i	
-#define xglTexCoord1iv		glTexCoord1iv	
-#define xglTexCoord1s		glTexCoord1s	
-#define xglTexCoord1sv		glTexCoord1sv	
-#define xglTexCoord2d		glTexCoord2d	
-#define xglTexCoord2dv		glTexCoord2dv	
-#define xglTexCoord2f		glTexCoord2f	
-#define xglTexCoord2fv		glTexCoord2fv	
-#define xglTexCoord2i		glTexCoord2i	
-#define xglTexCoord2iv		glTexCoord2iv	
-#define xglTexCoord2s		glTexCoord2s	
-#define xglTexCoord2sv		glTexCoord2sv	
-#define xglTexCoord3d		glTexCoord3d	
-#define xglTexCoord3dv		glTexCoord3dv	
-#define xglTexCoord3f		glTexCoord3f	
-#define xglTexCoord3fv		glTexCoord3fv	
-#define xglTexCoord3i		glTexCoord3i	
-#define xglTexCoord3iv		glTexCoord3iv	
-#define xglTexCoord3s		glTexCoord3s	
-#define xglTexCoord3sv		glTexCoord3sv	
-#define xglTexCoord4d		glTexCoord4d	
-#define xglTexCoord4dv		glTexCoord4dv	
-#define xglTexCoord4f		glTexCoord4f	
-#define xglTexCoord4fv		glTexCoord4fv	
-#define xglTexCoord4i		glTexCoord4i	
-#define xglTexCoord4iv		glTexCoord4iv	
-#define xglTexCoord4s		glTexCoord4s	
-#define xglTexCoord4sv		glTexCoord4sv	
-#ifdef GL_EXT_vertex_array
-#define xglTexCoordPointerEXT	glTexCoordPointerEXT	
-#endif
-#define xglTexEnvf		glTexEnvf	
-#define xglTexEnvfv		glTexEnvfv	
-#define xglTexEnvi		glTexEnvi	
-#define xglTexEnviv		glTexEnviv	
-#define xglTexGend		glTexGend	
-#define xglTexGendv		glTexGendv	
-#define xglTexGenf		glTexGenf	
-#define xglTexGenfv		glTexGenfv	
-#define xglTexGeni		glTexGeni	
-#define xglTexGeniv		glTexGeniv	
-#define xglTexImage1D		glTexImage1D	
-#define xglTexImage2D		glTexImage2D	
-#define xglTexParameterf	glTexParameterf	
-#define xglTexParameterfv	glTexParameterfv	
-#define xglTexParameteri	glTexParameteri	
-#define xglTexParameteriv	glTexParameteriv	
-#define xglTranslated		glTranslated	
-#define xglTranslatef		glTranslatef	
-#define xglVertex2d		glVertex2d	
-#define xglVertex2dv		glVertex2dv	
-#define xglVertex2f		glVertex2f	
-#define xglVertex2fv		glVertex2fv	
-#define xglVertex2i		glVertex2i	
-#define xglVertex2iv		glVertex2iv	
-#define xglVertex2s		glVertex2s	
-#define xglVertex2sv		glVertex2sv	
-#define xglVertex3d		glVertex3d	
-#define xglVertex3dv		glVertex3dv	
-#define xglVertex3f		glVertex3f	
-#define xglVertex3fv		glVertex3fv	
-#define xglVertex3i		glVertex3i	
-#define xglVertex3iv		glVertex3iv	
-#define xglVertex3s		glVertex3s	
-#define xglVertex3sv		glVertex3sv	
-#define xglVertex4d		glVertex4d	
-#define xglVertex4dv		glVertex4dv	
-#define xglVertex4f		glVertex4f	
-#define xglVertex4fv		glVertex4fv	
-#define xglVertex4i		glVertex4i	
-#define xglVertex4iv		glVertex4iv	
-#define xglVertex4s		glVertex4s	
-#define xglVertex4sv		glVertex4sv	
-#ifdef GL_EXT_vertex_array
-#define xglVertexPointerEXT	glVertexPointerEXT	
-#endif
-#define xglViewport		glViewport	
-
-#ifdef GL_VERSION_1_1
-#define xglAreTexturesResident	  glAreTexturesResident
-#define xglIsTexture		  glIsTexture
-#define xglBindTexture		  glBindTexture
-#define xglDeleteTextures	  glDeleteTextures
-#define xglGenTextures		  glGenTextures
-#define xglPrioritizeTextures	  glPrioritizeTextures
-#endif
-
-#ifdef GL_EXT_texture_object
-#define xglAreTexturesResidentEXT glAreTexturesResidentEXT
-#define xglIsTextureEXT		  glIsTextureEXT
-#define xglBindTextureEXT	  glBindTextureEXT
-#define xglDeleteTexturesEXT	  glDeleteTexturesEXT
-#define xglGenTexturesEXT	  glGenTexturesEXT
-#define xglPrioritizeTexturesEXT  glPrioritizeTexturesEXT
-#endif
-
-#define xglutAddMenuEntry       glutAddMenuEntry
-#define xglutAttachMenu         glutAttachMenu
-#define xglutCreateMenu         glutCreateMenu
-#define xglutCreateWindow       glutCreateWindow
-#define xglutDisplayFunc        glutDisplayFunc
-#define xglutIdleFunc           glutIdleFunc
-#define xglutInit               glutInit
-#define xglutInitDisplayMode    glutInitDisplayMode
-#define xglutInitWindowPosition glutInitWindowPosition
-#define xglutInitWindowSize     glutInitWindowSize
-#define xglutKeyboardFunc       glutKeyboardFunc
-#define xglutMainLoopUpdate     glutMainLoopUpdate
-#define xglutPostRedisplay      glutPostRedisplay
-#define xglutPreMainLoop        glutPreMainLoop
-#define xglutReshapeFunc        glutReshapeFunc
-#define xglutSwapBuffers        glutSwapBuffers
-
-#else
-
-GLboolean xglIsEnabled  ( GLenum cap ) ; 
-GLboolean xglIsList     ( GLuint list ) ; 
-GLenum    xglGetError   () ; 
-GLint     xglRenderMode ( GLenum mode ) ; 
-GLuint    xglGenLists   ( GLsizei range ) ; 
-const GLubyte  *xglGetString  ( GLenum name ) ; 
-
-void xglAccum		( GLenum op, GLfloat value ) ;
-void xglAlphaFunc	( GLenum func, GLclampf ref ) ;
-void xglArrayElementEXT	( GLint i ) ;
-void xglBegin		( GLenum mode ) ;
-void xglBitmap		( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, GLubyte *bitmap ) ;
-void xglBlendColorEXT	( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) ;
-void xglBlendEquationEXT( GLenum mode ) ;
-void xglBlendFunc	( GLenum sfactor, GLenum dfactor ) ;
-void xglCallList	( GLuint list ) ;
-void xglCallLists	( GLsizei n, GLenum type, GLvoid *lists ) ;
-void xglClear		( GLbitfield mask ) ;
-void xglClearAccum	( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) ;
-void xglClearColor	( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) ;
-void xglClearDepth	( GLclampd depth ) ;
-void xglClearIndex	( GLfloat c ) ;
-void xglClearStencil	( GLint s ) ;
-void xglClipPlane	( GLenum plane, GLdouble *equation ) ;
-void xglColor3b		( GLbyte red, GLbyte green, GLbyte blue ) ;
-void xglColor3bv	( GLbyte *v ) ;
-void xglColor3d		( GLdouble red, GLdouble green, GLdouble blue ) ;
-void xglColor3dv	( GLdouble *v ) ;
-void xglColor3f		( GLfloat red, GLfloat green, GLfloat blue ) ;
-void xglColor3fv	( GLfloat *v ) ;
-void xglColor3i		( GLint red, GLint green, GLint blue ) ;
-void xglColor3iv	( GLint *v ) ;
-void xglColor3s		( GLshort red, GLshort green, GLshort blue ) ;
-void xglColor3sv	( GLshort *v ) ;
-void xglColor3ub	( GLubyte red, GLubyte green, GLubyte blue ) ;
-void xglColor3ubv	( GLubyte *v ) ;
-void xglColor3ui	( GLuint red, GLuint green, GLuint blue ) ;
-void xglColor3uiv	( GLuint *v ) ;
-void xglColor3us	( GLushort red, GLushort green, GLushort blue ) ;
-void xglColor3usv	( GLushort *v ) ;
-void xglColor4b		( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha ) ;
-void xglColor4bv	( GLbyte *v ) ;
-void xglColor4d		( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha ) ;
-void xglColor4dv	( GLdouble *v ) ;
-void xglColor4f		( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) ;
-void xglColor4fv	( GLfloat *v ) ;
-void xglColor4i		( GLint red, GLint green, GLint blue, GLint alpha ) ;
-void xglColor4iv	( GLint *v ) ;
-void xglColor4s		( GLshort red, GLshort green, GLshort blue, GLshort alpha ) ;
-void xglColor4sv	( GLshort *v ) ;
-void xglColor4ub	( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha ) ;
-void xglColor4ubv	( GLubyte *v ) ;
-void xglColor4ui	( GLuint red, GLuint green, GLuint blue, GLuint alpha ) ;
-void xglColor4uiv	( GLuint *v ) ;
-void xglColor4us	( GLushort red, GLushort green, GLushort blue, GLushort alpha ) ;
-void xglColor4usv	( GLushort *v ) ;
-void xglColorMask	( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ) ;
-void xglColorMaterial	( GLenum face, GLenum mode ) ;
-void xglColorPointerEXT	( GLint size, GLenum type, GLsizei stride, GLsizei count, void *ptr ) ;
-void xglCopyPixels	( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type ) ;
-void xglCullFace	( GLenum mode ) ;
-void xglDeleteLists	( GLuint list, GLsizei range ) ;
-void xglDepthFunc	( GLenum func ) ;
-void xglDepthMask	( GLboolean flag ) ;
-void xglDepthRange	( GLclampd near_val, GLclampd far_val ) ;
-void xglDisable		( GLenum cap ) ;
-void xglDrawArraysEXT	( GLenum mode, GLint first, GLsizei count ) ;
-void xglDrawBuffer	( GLenum mode ) ;
-void xglDrawPixels	( GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ) ;
-void xglEdgeFlag	( GLboolean flag ) ;
-void xglEdgeFlagPointerEXT( GLsizei stride, GLsizei count, GLboolean *ptr ) ;
-void xglEdgeFlagv	( GLboolean *flag ) ;
-void xglEnable		( GLenum cap ) ;
-void xglEnd		() ;
-void xglEndList		() ;
-void xglEvalCoord1d	( GLdouble u ) ;
-void xglEvalCoord1dv	( GLdouble *u ) ;
-void xglEvalCoord1f	( GLfloat u ) ;
-void xglEvalCoord1fv	( GLfloat *u ) ;
-void xglEvalCoord2d	( GLdouble u, GLdouble v ) ;
-void xglEvalCoord2dv	( GLdouble *u ) ;
-void xglEvalCoord2f	( GLfloat u, GLfloat v ) ;
-void xglEvalCoord2fv	( GLfloat *u ) ;
-void xglEvalMesh1	( GLenum mode, GLint i1, GLint i2 ) ;
-void xglEvalMesh2	( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ) ;
-void xglEvalPoint1	( GLint i ) ;
-void xglEvalPoint2	( GLint i, GLint j ) ;
-void xglFeedbackBuffer	( GLsizei size, GLenum type, GLfloat *buffer ) ;
-void xglFinish		() ;
-void xglFlush		() ;
-void xglFogf		( GLenum pname, GLfloat param ) ;
-void xglFogfv		( GLenum pname, GLfloat *params ) ;
-void xglFogi		( GLenum pname, GLint param ) ;
-void xglFogiv		( GLenum pname, GLint *params ) ;
-void xglFrontFace	( GLenum mode ) ;
-void xglFrustum		( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val ) ;
-void xglGetBooleanv	( GLenum pname, GLboolean *params ) ;
-void xglGetClipPlane	( GLenum plane, GLdouble *equation ) ;
-void xglGetDoublev	( GLenum pname, GLdouble *params ) ;
-void xglGetFloatv	( GLenum pname, GLfloat *params ) ;
-void xglGetIntegerv	( GLenum pname, GLint *params ) ;
-void xglGetLightfv	( GLenum light, GLenum pname, GLfloat *params ) ;
-void xglGetLightiv	( GLenum light, GLenum pname, GLint *params ) ;
-void xglGetMapdv	( GLenum target, GLenum query, GLdouble *v ) ;
-void xglGetMapfv	( GLenum target, GLenum query, GLfloat *v ) ;
-void xglGetMapiv	( GLenum target, GLenum query, GLint *v ) ;
-void xglGetMaterialfv	( GLenum face, GLenum pname, GLfloat *params ) ;
-void xglGetMaterialiv	( GLenum face, GLenum pname, GLint *params ) ;
-void xglGetPixelMapfv	( GLenum map, GLfloat *values ) ;
-void xglGetPixelMapuiv	( GLenum map, GLuint *values ) ;
-void xglGetPixelMapusv	( GLenum map, GLushort *values ) ;
-void xglGetPointervEXT	( GLenum pname, void **params ) ;
-void xglGetPolygonStipple( GLubyte *mask ) ;
-void xglGetTexEnvfv	( GLenum target, GLenum pname, GLfloat *params ) ;
-void xglGetTexEnviv	( GLenum target, GLenum pname, GLint *params ) ;
-void xglGetTexGendv	( GLenum coord, GLenum pname, GLdouble *params ) ;
-void xglGetTexGenfv	( GLenum coord, GLenum pname, GLfloat *params ) ;
-void xglGetTexGeniv	( GLenum coord, GLenum pname, GLint *params ) ;
-void xglGetTexImage	( GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels ) ;
-void xglGetTexLevelParameterfv	( GLenum target, GLint level, GLenum pname, GLfloat *params ) ;
-void xglGetTexLevelParameteriv	( GLenum target, GLint level, GLenum pname, GLint *params ) ;
-void xglGetTexParameterfv	( GLenum target, GLenum pname, GLfloat *params) ;
-void xglGetTexParameteriv	( GLenum target, GLenum pname, GLint *params ) ;
-void xglHint		( GLenum target, GLenum mode ) ;
-void xglIndexMask	( GLuint mask ) ;
-void xglIndexPointerEXT	( GLenum type, GLsizei stride, GLsizei count, void *ptr ) ;
-void xglIndexd		( GLdouble c ) ;
-void xglIndexdv		( GLdouble *c ) ;
-void xglIndexf		( GLfloat c ) ;
-void xglIndexfv		( GLfloat *c ) ;
-void xglIndexi		( GLint c ) ;
-void xglIndexiv		( GLint *c ) ;
-void xglIndexs		( GLshort c ) ;
-void xglIndexsv		( GLshort *c ) ;
-void xglInitNames	() ;
-void xglLightModelf	( GLenum pname, GLfloat param ) ;
-void xglLightModelfv	( GLenum pname, GLfloat *params ) ;
-void xglLightModeli	( GLenum pname, GLint param ) ;
-void xglLightModeliv	( GLenum pname, GLint *params ) ;
-void xglLightf		( GLenum light, GLenum pname, GLfloat param ) ;
-void xglLightfv		( GLenum light, GLenum pname, GLfloat *params ) ;
-void xglLighti		( GLenum light, GLenum pname, GLint param ) ;
-void xglLightiv		( GLenum light, GLenum pname, GLint *params ) ;
-void xglLineStipple	( GLint factor, GLushort pattern ) ;
-void xglLineWidth	( GLfloat width ) ;
-void xglListBase	( GLuint base ) ;
-void xglLoadIdentity	() ;
-void xglLoadMatrixd	( GLdouble *m ) ;
-void xglLoadMatrixf	( GLfloat *m ) ;
-void xglLoadName	( GLuint name ) ;
-void xglLogicOp		( GLenum opcode ) ;
-void xglMap1d		( GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, GLdouble *points ) ;
-void xglMap1f		( GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, GLfloat *points ) ;
-void xglMap2d		( GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble *points ) ;
-void xglMap2f		( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat *points ) ;
-void xglMapGrid1d	( GLint un, GLdouble u1, GLdouble u2 ) ;
-void xglMapGrid1f	( GLint un, GLfloat u1, GLfloat u2 ) ;
-void xglMapGrid2d	( GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2 ) ;
-void xglMapGrid2f	( GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2 ) ;
-void xglMaterialf	( GLenum face, GLenum pname, GLfloat param ) ;
-void xglMaterialfv	( GLenum face, GLenum pname, GLfloat *params ) ;
-void xglMateriali	( GLenum face, GLenum pname, GLint param ) ;
-void xglMaterialiv	( GLenum face, GLenum pname, GLint *params ) ;
-void xglMatrixMode	( GLenum mode ) ;
-void xglMultMatrixd	( GLdouble *m ) ;
-void xglMultMatrixf	( GLfloat *m ) ;
-void xglNewList		( GLuint list, GLenum mode ) ;
-void xglNormal3b	( GLbyte nx, GLbyte ny, GLbyte nz ) ;
-void xglNormal3bv	( GLbyte *v ) ;
-void xglNormal3d	( GLdouble nx, GLdouble ny, GLdouble nz ) ;
-void xglNormal3dv	( GLdouble *v ) ;
-void xglNormal3f	( GLfloat nx, GLfloat ny, GLfloat nz ) ;
-void xglNormal3fv	( GLfloat *v ) ;
-void xglNormal3i	( GLint nx, GLint ny, GLint nz ) ;
-void xglNormal3iv	( GLint *v ) ;
-void xglNormal3s	( GLshort nx, GLshort ny, GLshort nz ) ;
-void xglNormal3sv	( GLshort *v ) ;
-void xglNormalPointerEXT( GLenum type, GLsizei stride, GLsizei count, void *ptr ) ;
-void xglOrtho		( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val ) ;
-void xglPassThrough	( GLfloat token ) ;
-void xglPixelMapfv	( GLenum map, GLint mapsize, GLfloat *values ) ;
-void xglPixelMapuiv	( GLenum map, GLint mapsize, GLuint *values ) ;
-void xglPixelMapusv	( GLenum map, GLint mapsize, GLushort *values ) ;
-void xglPixelStoref	( GLenum pname, GLfloat param ) ;
-void xglPixelStorei	( GLenum pname, GLint param ) ;
-void xglPixelTransferf	( GLenum pname, GLfloat param ) ;
-void xglPixelTransferi	( GLenum pname, GLint param ) ;
-void xglPixelZoom	( GLfloat xfactor, GLfloat yfactor ) ;
-void xglPointSize	( GLfloat size ) ;
-void xglPolygonMode	( GLenum face, GLenum mode ) ;
-void xglPolygonOffsetEXT( GLfloat factor, GLfloat bias ) ;
-void xglPolygonOffset   ( GLfloat factor, GLfloat bias ) ;
-void xglPolygonStipple	( GLubyte *mask ) ;
-void xglPopAttrib	() ;
-void xglPopMatrix	() ;
-void xglPopName		() ;
-void xglPushAttrib	( GLbitfield mask ) ;
-void xglPushMatrix	() ;
-void xglPushName	( GLuint name ) ;
-void xglRasterPos2d	( GLdouble x, GLdouble y ) ;
-void xglRasterPos2dv	( GLdouble *v ) ;
-void xglRasterPos2f	( GLfloat x, GLfloat y ) ;
-void xglRasterPos2fv	( GLfloat *v ) ;
-void xglRasterPos2i	( GLint x, GLint y ) ;
-void xglRasterPos2iv	( GLint *v ) ;
-void xglRasterPos2s	( GLshort x, GLshort y ) ;
-void xglRasterPos2sv	( GLshort *v ) ;
-void xglRasterPos3d	( GLdouble x, GLdouble y, GLdouble z ) ;
-void xglRasterPos3dv	( GLdouble *v ) ;
-void xglRasterPos3f	( GLfloat x, GLfloat y, GLfloat z ) ;
-void xglRasterPos3fv	( GLfloat *v ) ;
-void xglRasterPos3i	( GLint x, GLint y, GLint z ) ;
-void xglRasterPos3iv	( GLint *v ) ;
-void xglRasterPos3s	( GLshort x, GLshort y, GLshort z ) ;
-void xglRasterPos3sv	( GLshort *v ) ;
-void xglRasterPos4d	( GLdouble x, GLdouble y, GLdouble z, GLdouble w ) ;
-void xglRasterPos4dv	( GLdouble *v ) ;
-void xglRasterPos4f	( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) ;
-void xglRasterPos4fv	( GLfloat *v ) ;
-void xglRasterPos4i	( GLint x, GLint y, GLint z, GLint w ) ;
-void xglRasterPos4iv	( GLint *v ) ;
-void xglRasterPos4s	( GLshort x, GLshort y, GLshort z, GLshort w ) ;
-void xglRasterPos4sv	( GLshort *v ) ;
-void xglReadBuffer	( GLenum mode ) ;
-void xglReadPixels	( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ) ;
-void xglRectd		( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ) ;
-void xglRectdv		( GLdouble *v1, GLdouble *v2 ) ;
-void xglRectf		( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ) ;
-void xglRectfv		( GLfloat *v1, GLfloat *v2 ) ;
-void xglRecti		( GLint x1, GLint y1, GLint x2, GLint y2 ) ;
-void xglRectiv		( GLint *v1, GLint *v2 ) ;
-void xglRects		( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ) ;
-void xglRectsv		( GLshort *v1, GLshort *v2 ) ;
-void xglRotated		( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ) ;
-void xglRotatef		( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ) ;
-void xglScaled		( GLdouble x, GLdouble y, GLdouble z ) ;
-void xglScalef		( GLfloat x, GLfloat y, GLfloat z ) ;
-void xglScissor		( GLint x, GLint y, GLsizei width, GLsizei height) ;
-void xglSelectBuffer	( GLsizei size, GLuint *buffer ) ;
-void xglShadeModel	( GLenum mode ) ;
-void xglStencilFunc	( GLenum func, GLint ref, GLuint mask ) ;
-void xglStencilMask	( GLuint mask ) ;
-void xglStencilOp	( GLenum fail, GLenum zfail, GLenum zpass ) ;
-void xglTexCoord1d	( GLdouble s ) ;
-void xglTexCoord1dv	( GLdouble *v ) ;
-void xglTexCoord1f	( GLfloat s ) ;
-void xglTexCoord1fv	( GLfloat *v ) ;
-void xglTexCoord1i	( GLint s ) ;
-void xglTexCoord1iv	( GLint *v ) ;
-void xglTexCoord1s	( GLshort s ) ;
-void xglTexCoord1sv	( GLshort *v ) ;
-void xglTexCoord2d	( GLdouble s, GLdouble t ) ;
-void xglTexCoord2dv	( GLdouble *v ) ;
-void xglTexCoord2f	( GLfloat s, GLfloat t ) ;
-void xglTexCoord2fv	( GLfloat *v ) ;
-void xglTexCoord2i	( GLint s, GLint t ) ;
-void xglTexCoord2iv	( GLint *v ) ;
-void xglTexCoord2s	( GLshort s, GLshort t ) ;
-void xglTexCoord2sv	( GLshort *v ) ;
-void xglTexCoord3d	( GLdouble s, GLdouble t, GLdouble r ) ;
-void xglTexCoord3dv	( GLdouble *v ) ;
-void xglTexCoord3f	( GLfloat s, GLfloat t, GLfloat r ) ;
-void xglTexCoord3fv	( GLfloat *v ) ;
-void xglTexCoord3i	( GLint s, GLint t, GLint r ) ;
-void xglTexCoord3iv	( GLint *v ) ;
-void xglTexCoord3s	( GLshort s, GLshort t, GLshort r ) ;
-void xglTexCoord3sv	( GLshort *v ) ;
-void xglTexCoord4d	( GLdouble s, GLdouble t, GLdouble r, GLdouble q ) ;
-void xglTexCoord4dv	( GLdouble *v ) ;
-void xglTexCoord4f	( GLfloat s, GLfloat t, GLfloat r, GLfloat q ) ;
-void xglTexCoord4fv	( GLfloat *v ) ;
-void xglTexCoord4i	( GLint s, GLint t, GLint r, GLint q ) ;
-void xglTexCoord4iv	( GLint *v ) ;
-void xglTexCoord4s	( GLshort s, GLshort t, GLshort r, GLshort q ) ;
-void xglTexCoord4sv	( GLshort *v ) ;
-void xglTexCoordPointerEXT( GLint size, GLenum type, GLsizei stride, GLsizei count, void *ptr ) ;
-void xglTexEnvf		( GLenum target, GLenum pname, GLfloat param ) ;
-void xglTexEnvfv	( GLenum target, GLenum pname, GLfloat *params ) ;
-void xglTexEnvi		( GLenum target, GLenum pname, GLint param ) ;
-void xglTexEnviv	( GLenum target, GLenum pname, GLint *params ) ;
-void xglTexGend		( GLenum coord, GLenum pname, GLdouble param ) ;
-void xglTexGendv	( GLenum coord, GLenum pname, GLdouble *params ) ;
-void xglTexGenf		( GLenum coord, GLenum pname, GLfloat param ) ;
-void xglTexGenfv	( GLenum coord, GLenum pname, GLfloat *params ) ;
-void xglTexGeni		( GLenum coord, GLenum pname, GLint param ) ;
-void xglTexGeniv	( GLenum coord, GLenum pname, GLint *params ) ;
-void xglTexImage1D	( GLenum target, GLint level, GLint components, GLsizei width, GLint border, GLenum format, GLenum type, GLvoid *pixels ) ;
-void xglTexImage2D	( GLenum target, GLint level, GLint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLvoid *pixels ) ;
-void xglTexParameterf	( GLenum target, GLenum pname, GLfloat param ) ;
-void xglTexParameterfv	( GLenum target, GLenum pname, GLfloat *params ) ;
-void xglTexParameteri	( GLenum target, GLenum pname, GLint param ) ;
-void xglTexParameteriv	( GLenum target, GLenum pname, GLint *params ) ;
-void xglTranslated	( GLdouble x, GLdouble y, GLdouble z ) ;
-void xglTranslatef	( GLfloat x, GLfloat y, GLfloat z ) ;
-void xglVertex2d	( GLdouble x, GLdouble y ) ;
-void xglVertex2dv	( GLdouble *v ) ;
-void xglVertex2f	( GLfloat x, GLfloat y ) ;
-void xglVertex2fv	( GLfloat *v ) ;
-void xglVertex2i	( GLint x, GLint y ) ;
-void xglVertex2iv	( GLint *v ) ;
-void xglVertex2s	( GLshort x, GLshort y ) ;
-void xglVertex2sv	( GLshort *v ) ;
-void xglVertex3d	( GLdouble x, GLdouble y, GLdouble z ) ;
-void xglVertex3dv	( GLdouble *v ) ;
-void xglVertex3f	( GLfloat x, GLfloat y, GLfloat z ) ;
-void xglVertex3fv	( GLfloat *v ) ;
-void xglVertex3i	( GLint x, GLint y, GLint z ) ;
-void xglVertex3iv	( GLint *v ) ;
-void xglVertex3s	( GLshort x, GLshort y, GLshort z ) ;
-void xglVertex3sv	( GLshort *v ) ;
-void xglVertex4d	( GLdouble x, GLdouble y, GLdouble z, GLdouble w ) ;
-void xglVertex4dv	( GLdouble *v ) ;
-void xglVertex4f	( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) ;
-void xglVertex4fv	( GLfloat *v ) ;
-void xglVertex4i	( GLint x, GLint y, GLint z, GLint w ) ;
-void xglVertex4iv	( GLint *v ) ;
-void xglVertex4s	( GLshort x, GLshort y, GLshort z, GLshort w ) ;
-void xglVertex4sv	( GLshort *v ) ;
-void xglVertexPointerEXT( GLint size, GLenum type, GLsizei stride, GLsizei count, void *ptr ) ;
-void xglViewport	( GLint x, GLint y, GLsizei width, GLsizei height ) ;
-
-void xglutAddMenuEntry		( char *label, int value ) ;
-void xglutAttachMenu		( int button ) ;
-int  xglutCreateMenu		( void (*)(int) ) ;
-int  xglutCreateWindow		( char *title ) ;
-void xglutDisplayFunc		( void (*)(void) ) ;
-void xglutIdleFunc		( void (*)(void) ) ;
-void xglutInit			( int *argcp, char **argv ) ;
-void xglutInitDisplayMode	( unsigned int mode ) ;
-void xglutInitWindowPosition	( int x, int y ) ;
-void xglutInitWindowSize	( int width, int height ) ;
-void xglutKeyboardFunc		( void (*)(unsigned char key, int x, int y) ) ;
-void xglutMainLoopUpdate	() ;
-void xglutPostRedisplay		() ;
-void xglutPreMainLoop		() ;
-void xglutReshapeFunc		( void (*)(int width, int height) ) ;
-void xglutSwapBuffers		() ;
-
-GLboolean xglAreTexturesResident( GLsizei n, GLuint *textures, GLboolean *residences ) ;
-GLboolean xglIsTexture          ( GLuint texture ) ;
-void xglBindTexture             ( GLenum target, GLuint texture ) ;
-void xglDeleteTextures          ( GLsizei n, GLuint *textures ) ;
-void xglGenTextures             ( GLsizei n, GLuint *textures ) ;
-void xglPrioritizeTextures      ( GLsizei n, GLuint *textures, GLclampf *priorities ) ;
-
-GLboolean xglAreTexturesResidentEXT ( GLsizei n, GLuint *textures, GLboolean *residences ) ;
-GLboolean xglIsTextureEXT           ( GLuint texture ) ;
-void xglBindTextureEXT              ( GLenum target, GLuint texture ) ;
-void xglDeleteTexturesEXT           ( GLsizei n, GLuint *textures ) ;
-void xglGenTexturesEXT              ( GLsizei n, GLuint *textures ) ;
-void xglPrioritizeTexturesEXT       ( GLsizei n, GLuint *textures, GLclampf *priorities ) ;
-
-#endif
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* _XGL_H */
diff --git a/Lib/XGL/xglUtils.c b/Lib/XGL/xglUtils.c
deleted file mode 100644
index d781fa23f..000000000
--- a/Lib/XGL/xglUtils.c
+++ /dev/null
@@ -1,682 +0,0 @@
-
-#ifdef HAVE_CONFIG_H
-#  include 
-#endif
-
-#include 
-#include 
-#include 
-
-#if !defined( WIN32 )
-#  if !defined( HAVE_STL_SGI_PORT ) && !defined( __MWERKS__ )
-//   Avoid malloc with STLport and MSL
-#    include 
-#  endif
-#endif
-
-#ifdef HAVE_UNISTD_H
-#  include 
-#endif
-
-
-#include "xgl.h"
-
-#ifndef TRUE
-#define TRUE  1
-#define FALSE 0
-#endif
-
-int   xglTraceOn = TRUE ;
-
-FILE *xglTraceFd = NULL;
-
-struct GLenumLookup
-{
-  GLenum val ;
-  char *name ;
-} ;
-
-static struct GLenumLookup glenum_string [] =
-{
-/*
-  Due to ambiguity - these are not in the table...
-
-    GL_NONE = , GL_ZERO = GL_FALSE = GL_POINTS = 0
-    GL_ONE  = , GL_TRUE = GL_LINES = 1
-*/
-  { GL_2D			,"GL_2D" },
-  { GL_2_BYTES			,"GL_2_BYTES" },
-  { GL_3D			,"GL_3D" },
-  { GL_3D_COLOR			,"GL_3D_COLOR" },
-  { GL_3D_COLOR_TEXTURE		,"GL_3D_COLOR_TEXTURE" },
-  { GL_3_BYTES			,"GL_3_BYTES" },
-  { GL_4D_COLOR_TEXTURE		,"GL_4D_COLOR_TEXTURE" },
-  { GL_4_BYTES			,"GL_4_BYTES" },
-  { GL_ACCUM			,"GL_ACCUM" },
-  { GL_ACCUM_ALPHA_BITS		,"GL_ACCUM_ALPHA_BITS" },
-  { GL_ACCUM_BLUE_BITS		,"GL_ACCUM_BLUE_BITS" },
-  { GL_ACCUM_CLEAR_VALUE	,"GL_ACCUM_CLEAR_VALUE" },
-  { GL_ACCUM_GREEN_BITS		,"GL_ACCUM_GREEN_BITS" },
-  { GL_ACCUM_RED_BITS		,"GL_ACCUM_RED_BITS" },
-  { GL_ADD			,"GL_ADD" },
-  { GL_ALPHA			,"GL_ALPHA" },
-  { GL_ALPHA_BIAS		,"GL_ALPHA_BIAS" },
-  { GL_ALPHA_BITS		,"GL_ALPHA_BITS" },
-  { GL_ALPHA_SCALE		,"GL_ALPHA_SCALE" },
-  { GL_ALPHA_TEST		,"GL_ALPHA_TEST" },
-  { GL_ALPHA_TEST_FUNC		,"GL_ALPHA_TEST_FUNC" },
-  { GL_ALPHA_TEST_REF		,"GL_ALPHA_TEST_REF" },
-  { GL_ALWAYS			,"GL_ALWAYS" },
-  { GL_AMBIENT			,"GL_AMBIENT" },
-  { GL_AMBIENT_AND_DIFFUSE	,"GL_AMBIENT_AND_DIFFUSE" },
-  { GL_AND			,"GL_AND" },
-  { GL_AND_INVERTED		,"GL_AND_INVERTED" },
-  { GL_AND_REVERSE		,"GL_AND_REVERSE" },
-  { GL_ATTRIB_STACK_DEPTH	,"GL_ATTRIB_STACK_DEPTH" },
-  { GL_AUTO_NORMAL		,"GL_AUTO_NORMAL" },
-  { GL_AUX0			,"GL_AUX0" },
-  { GL_AUX1			,"GL_AUX1" },
-  { GL_AUX2			,"GL_AUX2" },
-  { GL_AUX3			,"GL_AUX3" },
-  { GL_AUX_BUFFERS		,"GL_AUX_BUFFERS" },
-  { GL_BACK			,"GL_BACK" },
-  { GL_BACK_LEFT		,"GL_BACK_LEFT" },
-  { GL_BACK_RIGHT		,"GL_BACK_RIGHT" },
-  { GL_BITMAP			,"GL_BITMAP" },
-  { GL_BITMAP_TOKEN		,"GL_BITMAP_TOKEN" },
-  { GL_BLEND			,"GL_BLEND" },
-  { GL_BLEND_DST		,"GL_BLEND_DST" },
-#ifdef GL_BLEND_COLOR_EXT
-  { GL_BLEND_COLOR_EXT		,"GL_BLEND_COLOR_EXT" },
-#endif
-#ifdef GL_BLEND_EQUATION_EXT
-  { GL_BLEND_EQUATION_EXT	,"GL_BLEND_EQUATION_EXT" },
-#endif
-  { GL_BLEND_SRC		,"GL_BLEND_SRC" },
-  { GL_BLUE			,"GL_BLUE" },
-  { GL_BLUE_BIAS		,"GL_BLUE_BIAS" },
-  { GL_BLUE_BITS		,"GL_BLUE_BITS" },
-  { GL_BLUE_SCALE		,"GL_BLUE_SCALE" },
-  { GL_BYTE			,"GL_BYTE" },
-  { GL_CCW			,"GL_CCW" },
-  { GL_CLAMP			,"GL_CLAMP" },
-  { GL_CLEAR			,"GL_CLEAR" },
-  { GL_CLIP_PLANE0		,"GL_CLIP_PLANE0" },
-  { GL_CLIP_PLANE1		,"GL_CLIP_PLANE1" },
-  { GL_CLIP_PLANE2		,"GL_CLIP_PLANE2" },
-  { GL_CLIP_PLANE3		,"GL_CLIP_PLANE3" },
-  { GL_CLIP_PLANE4		,"GL_CLIP_PLANE4" },
-  { GL_CLIP_PLANE5		,"GL_CLIP_PLANE5" },
-  { GL_COEFF			,"GL_COEFF" },
-  { GL_COLOR			,"GL_COLOR" },
-#ifdef GL_COLOR_ARRAY_EXT
-  { GL_COLOR_ARRAY_COUNT_EXT	,"GL_COLOR_ARRAY_COUNT_EXT" },
-  { GL_COLOR_ARRAY_EXT		,"GL_COLOR_ARRAY_EXT" },
-  { GL_COLOR_ARRAY_POINTER_EXT	,"GL_COLOR_ARRAY_POINTER_EXT" },
-  { GL_COLOR_ARRAY_SIZE_EXT	,"GL_COLOR_ARRAY_SIZE_EXT" },
-  { GL_COLOR_ARRAY_STRIDE_EXT	,"GL_COLOR_ARRAY_STRIDE_EXT" },
-  { GL_COLOR_ARRAY_TYPE_EXT	,"GL_COLOR_ARRAY_TYPE_EXT" },
-#endif
-  { GL_COLOR_CLEAR_VALUE	,"GL_COLOR_CLEAR_VALUE" },
-  { GL_COLOR_INDEX		,"GL_COLOR_INDEX" },
-  { GL_COLOR_INDEXES		,"GL_COLOR_INDEXES" },
-  { GL_COLOR_MATERIAL		,"GL_COLOR_MATERIAL" },
-  { GL_COLOR_MATERIAL_FACE	,"GL_COLOR_MATERIAL_FACE" },
-  { GL_COLOR_MATERIAL_PARAMETER	,"GL_COLOR_MATERIAL_PARAMETER" },
-  { GL_COLOR_WRITEMASK		,"GL_COLOR_WRITEMASK" },
-  { GL_COMPILE			,"GL_COMPILE" },
-  { GL_COMPILE_AND_EXECUTE	,"GL_COMPILE_AND_EXECUTE" },
-#ifdef GL_CONSTANT_ALPHA_EXT
-  { GL_CONSTANT_ALPHA_EXT	,"GL_CONSTANT_ALPHA_EXT" },
-#endif
-  { GL_CONSTANT_ATTENUATION	,"GL_CONSTANT_ATTENUATION" },
-#ifdef GL_CONSTANT_COLOR_EXT
-  { GL_CONSTANT_COLOR_EXT	,"GL_CONSTANT_COLOR_EXT" },
-#endif
-  { GL_COPY			,"GL_COPY" },
-  { GL_COPY_INVERTED		,"GL_COPY_INVERTED" },
-  { GL_COPY_PIXEL_TOKEN		,"GL_COPY_PIXEL_TOKEN" },
-  { GL_CULL_FACE		,"GL_CULL_FACE" },
-  { GL_CULL_FACE_MODE		,"GL_CULL_FACE_MODE" },
-  { GL_CURRENT_COLOR		,"GL_CURRENT_COLOR" },
-  { GL_CURRENT_INDEX		,"GL_CURRENT_INDEX" },
-  { GL_CURRENT_NORMAL		,"GL_CURRENT_NORMAL" },
-  { GL_CURRENT_RASTER_COLOR	,"GL_CURRENT_RASTER_COLOR" },
-  { GL_CURRENT_RASTER_DISTANCE	,"GL_CURRENT_RASTER_DISTANCE" },
-  { GL_CURRENT_RASTER_INDEX	,"GL_CURRENT_RASTER_INDEX" },
-  { GL_CURRENT_RASTER_POSITION	,"GL_CURRENT_RASTER_POSITION" },
-  { GL_CURRENT_RASTER_POSITION_VALID,"GL_CURRENT_RASTER_POSITION_VALID" },
-  { GL_CURRENT_RASTER_TEXTURE_COORDS,"GL_CURRENT_RASTER_TEXTURE_COORDS" },
-  { GL_CURRENT_TEXTURE_COORDS	,"GL_CURRENT_TEXTURE_COORDS" },
-  { GL_CW			,"GL_CW" },
-  { GL_DECAL			,"GL_DECAL" },
-  { GL_DECR			,"GL_DECR" },
-  { GL_DEPTH			,"GL_DEPTH" },
-  { GL_DEPTH_BIAS		,"GL_DEPTH_BIAS" },
-  { GL_DEPTH_BITS		,"GL_DEPTH_BITS" },
-  { GL_DEPTH_CLEAR_VALUE	,"GL_DEPTH_CLEAR_VALUE" },
-  { GL_DEPTH_COMPONENT		,"GL_DEPTH_COMPONENT" },
-  { GL_DEPTH_FUNC		,"GL_DEPTH_FUNC" },
-  { GL_DEPTH_RANGE		,"GL_DEPTH_RANGE" },
-  { GL_DEPTH_SCALE		,"GL_DEPTH_SCALE" },
-  { GL_DEPTH_TEST		,"GL_DEPTH_TEST" },
-  { GL_DEPTH_WRITEMASK		,"GL_DEPTH_WRITEMASK" },
-  { GL_DIFFUSE			,"GL_DIFFUSE" },
-  { GL_DITHER			,"GL_DITHER" },
-  { GL_DOMAIN			,"GL_DOMAIN" },
-  { GL_DONT_CARE		,"GL_DONT_CARE" },
-  { GL_DOUBLEBUFFER		,"GL_DOUBLEBUFFER" },
-#ifdef GL_DOUBLE_EXT
-  { GL_DOUBLE_EXT		,"GL_DOUBLE_EXT" },
-#endif
-  { GL_DRAW_BUFFER		,"GL_DRAW_BUFFER" },
-  { GL_DRAW_PIXEL_TOKEN		,"GL_DRAW_PIXEL_TOKEN" },
-  { GL_DST_ALPHA		,"GL_DST_ALPHA" },
-  { GL_DST_COLOR		,"GL_DST_COLOR" },
-  { GL_EDGE_FLAG		,"GL_EDGE_FLAG" },
-#ifdef GL_EDGE_FLAG_ARRAY_EXT
-  { GL_EDGE_FLAG_ARRAY_COUNT_EXT,"GL_EDGE_FLAG_ARRAY_COUNT_EXT" },
-  { GL_EDGE_FLAG_ARRAY_EXT	,"GL_EDGE_FLAG_ARRAY_EXT" },
-  { GL_EDGE_FLAG_ARRAY_POINTER_EXT,"GL_EDGE_FLAG_ARRAY_POINTER_EXT" },
-  { GL_EDGE_FLAG_ARRAY_STRIDE_EXT,"GL_EDGE_FLAG_ARRAY_STRIDE_EXT" },
-#endif
-  { GL_EMISSION			,"GL_EMISSION" },
-  { GL_EQUAL			,"GL_EQUAL" },
-  { GL_EQUIV			,"GL_EQUIV" },
-  { GL_EXP			,"GL_EXP" },
-  { GL_EXP2			,"GL_EXP2" },
-  { GL_EXTENSIONS		,"GL_EXTENSIONS" },
-  { GL_EYE_LINEAR		,"GL_EYE_LINEAR" },
-  { GL_EYE_PLANE		,"GL_EYE_PLANE" },
-  { GL_FASTEST			,"GL_FASTEST" },
-  { GL_FEEDBACK			,"GL_FEEDBACK" },
-  { GL_FILL			,"GL_FILL" },
-  { GL_FLAT			,"GL_FLAT" },
-  { GL_FLOAT			,"GL_FLOAT" },
-  { GL_FOG			,"GL_FOG" },
-  { GL_FOG_COLOR		,"GL_FOG_COLOR" },
-  { GL_FOG_DENSITY		,"GL_FOG_DENSITY" },
-  { GL_FOG_END			,"GL_FOG_END" },
-  { GL_FOG_HINT			,"GL_FOG_HINT" },
-  { GL_FOG_INDEX		,"GL_FOG_INDEX" },
-  { GL_FOG_MODE			,"GL_FOG_MODE" },
-  { GL_FOG_START		,"GL_FOG_START" },
-  { GL_FRONT			,"GL_FRONT" },
-  { GL_FRONT_AND_BACK		,"GL_FRONT_AND_BACK" },
-  { GL_FRONT_FACE		,"GL_FRONT_FACE" },
-  { GL_FRONT_LEFT		,"GL_FRONT_LEFT" },
-  { GL_FRONT_RIGHT		,"GL_FRONT_RIGHT" },
-#ifdef GL_FUNC_ADD_EXT
-  { GL_FUNC_ADD_EXT		,"GL_FUNC_ADD_EXT" },
-  { GL_FUNC_REVERSE_SUBTRACT_EXT,"GL_FUNC_REVERSE_SUBTRACT_EXT" },
-  { GL_FUNC_SUBTRACT_EXT	,"GL_FUNC_SUBTRACT_EXT" },
-#endif
-  { GL_GEQUAL			,"GL_GEQUAL" },
-  { GL_GREATER			,"GL_GREATER" },
-  { GL_GREEN			,"GL_GREEN" },
-  { GL_GREEN_BIAS		,"GL_GREEN_BIAS" },
-  { GL_GREEN_BITS		,"GL_GREEN_BITS" },
-  { GL_GREEN_SCALE		,"GL_GREEN_SCALE" },
-  { GL_INCR			,"GL_INCR" },
-#ifdef GL_INDEX_ARRAY_EXT
-  { GL_INDEX_ARRAY_COUNT_EXT	,"GL_INDEX_ARRAY_COUNT_EXT" },
-  { GL_INDEX_ARRAY_EXT		,"GL_INDEX_ARRAY_EXT" },
-  { GL_INDEX_ARRAY_POINTER_EXT	,"GL_INDEX_ARRAY_POINTER_EXT" },
-  { GL_INDEX_ARRAY_STRIDE_EXT	,"GL_INDEX_ARRAY_STRIDE_EXT" },
-  { GL_INDEX_ARRAY_TYPE_EXT	,"GL_INDEX_ARRAY_TYPE_EXT" },
-#endif
-  { GL_INDEX_BITS		,"GL_INDEX_BITS" },
-  { GL_INDEX_CLEAR_VALUE	,"GL_INDEX_CLEAR_VALUE" },
-  { GL_INDEX_MODE		,"GL_INDEX_MODE" },
-  { GL_INDEX_OFFSET		,"GL_INDEX_OFFSET" },
-  { GL_INDEX_SHIFT		,"GL_INDEX_SHIFT" },
-  { GL_INDEX_WRITEMASK		,"GL_INDEX_WRITEMASK" },
-  { GL_INT			,"GL_INT" },
-  { GL_INVALID_ENUM		,"GL_INVALID_ENUM" },
-  { GL_INVALID_OPERATION	,"GL_INVALID_OPERATION" },
-  { GL_INVALID_VALUE		,"GL_INVALID_VALUE" },
-  { GL_INVERT			,"GL_INVERT" },
-  { GL_KEEP			,"GL_KEEP" },
-  { GL_LEFT			,"GL_LEFT" },
-  { GL_LEQUAL			,"GL_LEQUAL" },
-  { GL_LESS			,"GL_LESS" },
-  { GL_LIGHT0			,"GL_LIGHT0" },
-  { GL_LIGHT1			,"GL_LIGHT1" },
-  { GL_LIGHT2			,"GL_LIGHT2" },
-  { GL_LIGHT3			,"GL_LIGHT3" },
-  { GL_LIGHT4			,"GL_LIGHT4" },
-  { GL_LIGHT5			,"GL_LIGHT5" },
-  { GL_LIGHT6			,"GL_LIGHT6" },
-  { GL_LIGHT7			,"GL_LIGHT7" },
-  { GL_LIGHTING			,"GL_LIGHTING" },
-  { GL_LIGHT_MODEL_AMBIENT	,"GL_LIGHT_MODEL_AMBIENT" },
-  { GL_LIGHT_MODEL_LOCAL_VIEWER	,"GL_LIGHT_MODEL_LOCAL_VIEWER" },
-  { GL_LIGHT_MODEL_TWO_SIDE	,"GL_LIGHT_MODEL_TWO_SIDE" },
-  { GL_LINE			,"GL_LINE" },
-  { GL_LINEAR			,"GL_LINEAR" },
-  { GL_LINEAR_ATTENUATION	,"GL_LINEAR_ATTENUATION" },
-  { GL_LINEAR_MIPMAP_LINEAR	,"GL_LINEAR_MIPMAP_LINEAR" },
-  { GL_LINEAR_MIPMAP_NEAREST	,"GL_LINEAR_MIPMAP_NEAREST" },
-  { GL_LINE_LOOP		,"GL_LINE_LOOP" },
-  { GL_LINE_RESET_TOKEN		,"GL_LINE_RESET_TOKEN" },
-  { GL_LINE_SMOOTH		,"GL_LINE_SMOOTH" },
-  { GL_LINE_SMOOTH_HINT		,"GL_LINE_SMOOTH_HINT" },
-  { GL_LINE_STIPPLE		,"GL_LINE_STIPPLE" },
-  { GL_LINE_STIPPLE_PATTERN	,"GL_LINE_STIPPLE_PATTERN" },
-  { GL_LINE_STIPPLE_REPEAT	,"GL_LINE_STIPPLE_REPEAT" },
-  { GL_LINE_STRIP		,"GL_LINE_STRIP" },
-  { GL_LINE_TOKEN		,"GL_LINE_TOKEN" },
-  { GL_LINE_WIDTH		,"GL_LINE_WIDTH" },
-  { GL_LINE_WIDTH_GRANULARITY	,"GL_LINE_WIDTH_GRANULARITY" },
-  { GL_LINE_WIDTH_RANGE		,"GL_LINE_WIDTH_RANGE" },
-  { GL_LIST_BASE		,"GL_LIST_BASE" },
-  { GL_LIST_INDEX		,"GL_LIST_INDEX" },
-  { GL_LIST_MODE		,"GL_LIST_MODE" },
-  { GL_LOAD			,"GL_LOAD" },
-  { GL_LOGIC_OP			,"GL_LOGIC_OP" },
-  { GL_LOGIC_OP_MODE		,"GL_LOGIC_OP_MODE" },
-  { GL_LUMINANCE		,"GL_LUMINANCE" },
-  { GL_LUMINANCE_ALPHA		,"GL_LUMINANCE_ALPHA" },
-  { GL_MAP1_COLOR_4		,"GL_MAP1_COLOR_4" },
-  { GL_MAP1_GRID_DOMAIN		,"GL_MAP1_GRID_DOMAIN" },
-  { GL_MAP1_GRID_SEGMENTS	,"GL_MAP1_GRID_SEGMENTS" },
-  { GL_MAP1_INDEX		,"GL_MAP1_INDEX" },
-  { GL_MAP1_NORMAL		,"GL_MAP1_NORMAL" },
-  { GL_MAP1_TEXTURE_COORD_1	,"GL_MAP1_TEXTURE_COORD_1" },
-  { GL_MAP1_TEXTURE_COORD_2	,"GL_MAP1_TEXTURE_COORD_2" },
-  { GL_MAP1_TEXTURE_COORD_3	,"GL_MAP1_TEXTURE_COORD_3" },
-  { GL_MAP1_TEXTURE_COORD_4	,"GL_MAP1_TEXTURE_COORD_4" },
-  { GL_MAP1_VERTEX_3		,"GL_MAP1_VERTEX_3" },
-  { GL_MAP1_VERTEX_4		,"GL_MAP1_VERTEX_4" },
-  { GL_MAP2_COLOR_4		,"GL_MAP2_COLOR_4" },
-  { GL_MAP2_GRID_DOMAIN		,"GL_MAP2_GRID_DOMAIN" },
-  { GL_MAP2_GRID_SEGMENTS	,"GL_MAP2_GRID_SEGMENTS" },
-  { GL_MAP2_INDEX		,"GL_MAP2_INDEX" },
-  { GL_MAP2_NORMAL		,"GL_MAP2_NORMAL" },
-  { GL_MAP2_TEXTURE_COORD_1	,"GL_MAP2_TEXTURE_COORD_1" },
-  { GL_MAP2_TEXTURE_COORD_2	,"GL_MAP2_TEXTURE_COORD_2" },
-  { GL_MAP2_TEXTURE_COORD_3	,"GL_MAP2_TEXTURE_COORD_3" },
-  { GL_MAP2_TEXTURE_COORD_4	,"GL_MAP2_TEXTURE_COORD_4" },
-  { GL_MAP2_VERTEX_3		,"GL_MAP2_VERTEX_3" },
-  { GL_MAP2_VERTEX_4		,"GL_MAP2_VERTEX_4" },
-  { GL_MAP_COLOR		,"GL_MAP_COLOR" },
-  { GL_MAP_STENCIL		,"GL_MAP_STENCIL" },
-  { GL_MATRIX_MODE		,"GL_MATRIX_MODE" },
-  { GL_MAX_ATTRIB_STACK_DEPTH	,"GL_MAX_ATTRIB_STACK_DEPTH" },
-  { GL_MAX_CLIP_PLANES		,"GL_MAX_CLIP_PLANES" },
-  { GL_MAX_EVAL_ORDER		,"GL_MAX_EVAL_ORDER" },
-#ifdef GL_MAX_EXT
-  { GL_MAX_EXT			,"GL_MAX_EXT" },
-#endif
-  { GL_MAX_LIGHTS		,"GL_MAX_LIGHTS" },
-  { GL_MAX_LIST_NESTING		,"GL_MAX_LIST_NESTING" },
-  { GL_MAX_MODELVIEW_STACK_DEPTH,"GL_MAX_MODELVIEW_STACK_DEPTH" },
-  { GL_MAX_NAME_STACK_DEPTH	,"GL_MAX_NAME_STACK_DEPTH" },
-  { GL_MAX_PIXEL_MAP_TABLE	,"GL_MAX_PIXEL_MAP_TABLE" },
-  { GL_MAX_PROJECTION_STACK_DEPTH,"GL_MAX_PROJECTION_STACK_DEPTH" },
-  { GL_MAX_TEXTURE_SIZE		,"GL_MAX_TEXTURE_SIZE" },
-  { GL_MAX_TEXTURE_STACK_DEPTH	,"GL_MAX_TEXTURE_STACK_DEPTH" },
-  { GL_MAX_VIEWPORT_DIMS	,"GL_MAX_VIEWPORT_DIMS" },
-#ifdef GL_MIN_EXT
-  { GL_MIN_EXT			,"GL_MIN_EXT" },
-#endif
-  { GL_MODELVIEW		,"GL_MODELVIEW" },
-  { GL_MODELVIEW_MATRIX		,"GL_MODELVIEW_MATRIX" },
-  { GL_MODELVIEW_STACK_DEPTH	,"GL_MODELVIEW_STACK_DEPTH" },
-  { GL_MODULATE			,"GL_MODULATE" },
-  { GL_MULT			,"GL_MULT" },
-  { GL_NAME_STACK_DEPTH		,"GL_NAME_STACK_DEPTH" },
-  { GL_NAND			,"GL_NAND" },
-  { GL_NEAREST			,"GL_NEAREST" },
-  { GL_NEAREST_MIPMAP_LINEAR	,"GL_NEAREST_MIPMAP_LINEAR" },
-  { GL_NEAREST_MIPMAP_NEAREST	,"GL_NEAREST_MIPMAP_NEAREST" },
-  { GL_NEVER			,"GL_NEVER" },
-  { GL_NICEST			,"GL_NICEST" },
-  { GL_NOOP			,"GL_NOOP" },
-  { GL_NOR			,"GL_NOR" },
-  { GL_NORMALIZE		,"GL_NORMALIZE" },
-#ifdef GL_NORMAL_ARRAY_EXT
-  { GL_NORMAL_ARRAY_COUNT_EXT	,"GL_NORMAL_ARRAY_COUNT_EXT" },
-  { GL_NORMAL_ARRAY_EXT		,"GL_NORMAL_ARRAY_EXT" },
-  { GL_NORMAL_ARRAY_POINTER_EXT	,"GL_NORMAL_ARRAY_POINTER_EXT" },
-  { GL_NORMAL_ARRAY_STRIDE_EXT	,"GL_NORMAL_ARRAY_STRIDE_EXT" },
-  { GL_NORMAL_ARRAY_TYPE_EXT	,"GL_NORMAL_ARRAY_TYPE_EXT" },
-#endif
-  { GL_NOTEQUAL			,"GL_NOTEQUAL" },
-  { GL_OBJECT_LINEAR		,"GL_OBJECT_LINEAR" },
-  { GL_OBJECT_PLANE		,"GL_OBJECT_PLANE" },
-#ifdef GL_ONE_MINUS_CONSTANT_ALPHA_EXT
-  { GL_ONE_MINUS_CONSTANT_ALPHA_EXT,"GL_ONE_MINUS_CONSTANT_ALPHA_EXT" },
-  { GL_ONE_MINUS_CONSTANT_COLOR_EXT,"GL_ONE_MINUS_CONSTANT_COLOR_EXT" },
-#endif
-  { GL_ONE_MINUS_DST_ALPHA	,"GL_ONE_MINUS_DST_ALPHA" },
-  { GL_ONE_MINUS_DST_COLOR	,"GL_ONE_MINUS_DST_COLOR" },
-  { GL_ONE_MINUS_SRC_ALPHA	,"GL_ONE_MINUS_SRC_ALPHA" },
-  { GL_ONE_MINUS_SRC_COLOR	,"GL_ONE_MINUS_SRC_COLOR" },
-  { GL_OR			,"GL_OR" },
-  { GL_ORDER			,"GL_ORDER" },
-  { GL_OR_INVERTED		,"GL_OR_INVERTED" },
-  { GL_OR_REVERSE		,"GL_OR_REVERSE" },
-  { GL_OUT_OF_MEMORY		,"GL_OUT_OF_MEMORY" },
-  { GL_PACK_ALIGNMENT		,"GL_PACK_ALIGNMENT" },
-  { GL_PACK_LSB_FIRST		,"GL_PACK_LSB_FIRST" },
-  { GL_PACK_ROW_LENGTH		,"GL_PACK_ROW_LENGTH" },
-  { GL_PACK_SKIP_PIXELS		,"GL_PACK_SKIP_PIXELS" },
-  { GL_PACK_SKIP_ROWS		,"GL_PACK_SKIP_ROWS" },
-  { GL_PACK_SWAP_BYTES		,"GL_PACK_SWAP_BYTES" },
-  { GL_PASS_THROUGH_TOKEN	,"GL_PASS_THROUGH_TOKEN" },
-  { GL_PERSPECTIVE_CORRECTION_HINT,"GL_PERSPECTIVE_CORRECTION_HINT" },
-  { GL_PIXEL_MAP_A_TO_A		,"GL_PIXEL_MAP_A_TO_A" },
-  { GL_PIXEL_MAP_A_TO_A_SIZE	,"GL_PIXEL_MAP_A_TO_A_SIZE" },
-  { GL_PIXEL_MAP_B_TO_B		,"GL_PIXEL_MAP_B_TO_B" },
-  { GL_PIXEL_MAP_B_TO_B_SIZE	,"GL_PIXEL_MAP_B_TO_B_SIZE" },
-  { GL_PIXEL_MAP_G_TO_G		,"GL_PIXEL_MAP_G_TO_G" },
-  { GL_PIXEL_MAP_G_TO_G_SIZE	,"GL_PIXEL_MAP_G_TO_G_SIZE" },
-  { GL_PIXEL_MAP_I_TO_A		,"GL_PIXEL_MAP_I_TO_A" },
-  { GL_PIXEL_MAP_I_TO_A_SIZE	,"GL_PIXEL_MAP_I_TO_A_SIZE" },
-  { GL_PIXEL_MAP_I_TO_B		,"GL_PIXEL_MAP_I_TO_B" },
-  { GL_PIXEL_MAP_I_TO_B_SIZE	,"GL_PIXEL_MAP_I_TO_B_SIZE" },
-  { GL_PIXEL_MAP_I_TO_G		,"GL_PIXEL_MAP_I_TO_G" },
-  { GL_PIXEL_MAP_I_TO_G_SIZE	,"GL_PIXEL_MAP_I_TO_G_SIZE" },
-  { GL_PIXEL_MAP_I_TO_I		,"GL_PIXEL_MAP_I_TO_I" },
-  { GL_PIXEL_MAP_I_TO_I_SIZE	,"GL_PIXEL_MAP_I_TO_I_SIZE" },
-  { GL_PIXEL_MAP_I_TO_R		,"GL_PIXEL_MAP_I_TO_R" },
-  { GL_PIXEL_MAP_I_TO_R_SIZE	,"GL_PIXEL_MAP_I_TO_R_SIZE" },
-  { GL_PIXEL_MAP_R_TO_R		,"GL_PIXEL_MAP_R_TO_R" },
-  { GL_PIXEL_MAP_R_TO_R_SIZE	,"GL_PIXEL_MAP_R_TO_R_SIZE" },
-  { GL_PIXEL_MAP_S_TO_S		,"GL_PIXEL_MAP_S_TO_S" },
-  { GL_PIXEL_MAP_S_TO_S_SIZE	,"GL_PIXEL_MAP_S_TO_S_SIZE" },
-  { GL_POINT			,"GL_POINT" },
-  { GL_POINT_SIZE		,"GL_POINT_SIZE" },
-  { GL_POINT_SIZE_GRANULARITY 	,"GL_POINT_SIZE_GRANULARITY" },
-  { GL_POINT_SIZE_RANGE		,"GL_POINT_SIZE_RANGE" },
-  { GL_POINT_SMOOTH		,"GL_POINT_SMOOTH" },
-  { GL_POINT_SMOOTH_HINT	,"GL_POINT_SMOOTH_HINT" },
-  { GL_POINT_TOKEN		,"GL_POINT_TOKEN" },
-  { GL_POLYGON			,"GL_POLYGON" },
-  { GL_POLYGON_MODE		,"GL_POLYGON_MODE" },
-  { GL_POLYGON_SMOOTH		,"GL_POLYGON_SMOOTH" },
-  { GL_POLYGON_SMOOTH_HINT	,"GL_POLYGON_SMOOTH_HINT" },
-  { GL_POLYGON_STIPPLE		,"GL_POLYGON_STIPPLE" },
-#ifdef GL_POLYGON_OFFSET_EXT
-  { GL_POLYGON_OFFSET_BIAS_EXT  ,"GL_POLYGON_OFFSET_BIAS_EXT" },
-  { GL_POLYGON_OFFSET_EXT       ,"GL_POLYGON_OFFSET_EXT" },
-  { GL_POLYGON_OFFSET_FACTOR_EXT,"GL_POLYGON_OFFSET_FACTOR_EXT" },
-#endif
-  { GL_POLYGON_TOKEN		,"GL_POLYGON_TOKEN" },
-  { GL_POSITION			,"GL_POSITION" },
-  { GL_PROJECTION		,"GL_PROJECTION" },
-  { GL_PROJECTION_MATRIX	,"GL_PROJECTION_MATRIX" },
-  { GL_PROJECTION_STACK_DEPTH	,"GL_PROJECTION_STACK_DEPTH" },
-  { GL_Q			,"GL_Q" },
-  { GL_QUADRATIC_ATTENUATION	,"GL_QUADRATIC_ATTENUATION" },
-  { GL_QUADS			,"GL_QUADS" },
-  { GL_QUAD_STRIP		,"GL_QUAD_STRIP" },
-  { GL_R			,"GL_R" },
-  { GL_READ_BUFFER		,"GL_READ_BUFFER" },
-  { GL_RED			,"GL_RED" },
-  { GL_RED_BIAS			,"GL_RED_BIAS" },
-  { GL_RED_BITS			,"GL_RED_BITS" },
-  { GL_RED_SCALE		,"GL_RED_SCALE" },
-  { GL_RENDER			,"GL_RENDER" },
-  { GL_RENDERER			,"GL_RENDERER" },
-  { GL_RENDER_MODE		,"GL_RENDER_MODE" },
-  { GL_REPEAT			,"GL_REPEAT" },
-  { GL_REPLACE			,"GL_REPLACE" },
-#ifdef GL_REPLACE_EXT
-  { GL_REPLACE_EXT		,"GL_REPLACE_EXT" },
-#endif
-  { GL_RETURN			,"GL_RETURN" },
-  { GL_RGB			,"GL_RGB" },
-  { GL_RGBA			,"GL_RGBA" },
-  { GL_RGBA_MODE		,"GL_RGBA_MODE" },
-  { GL_RIGHT			,"GL_RIGHT" },
-  { GL_S			,"GL_S" },
-  { GL_SCISSOR_BOX		,"GL_SCISSOR_BOX" },
-  { GL_SCISSOR_TEST		,"GL_SCISSOR_TEST" },
-  { GL_SELECT			,"GL_SELECT" },
-  { GL_SET			,"GL_SET" },
-  { GL_SHADE_MODEL		,"GL_SHADE_MODEL" },
-  { GL_SHININESS		,"GL_SHININESS" },
-  { GL_SHORT			,"GL_SHORT" },
-  { GL_SMOOTH			,"GL_SMOOTH" },
-  { GL_SPECULAR			,"GL_SPECULAR" },
-  { GL_SPHERE_MAP		,"GL_SPHERE_MAP" },
-  { GL_SPOT_CUTOFF		,"GL_SPOT_CUTOFF" },
-  { GL_SPOT_DIRECTION		,"GL_SPOT_DIRECTION" },
-  { GL_SPOT_EXPONENT		,"GL_SPOT_EXPONENT" },
-  { GL_SRC_ALPHA		,"GL_SRC_ALPHA" },
-  { GL_SRC_ALPHA_SATURATE	,"GL_SRC_ALPHA_SATURATE" },
-  { GL_SRC_COLOR		,"GL_SRC_COLOR" },
-  { GL_STACK_OVERFLOW		,"GL_STACK_OVERFLOW" },
-  { GL_STACK_UNDERFLOW		,"GL_STACK_UNDERFLOW" },
-  { GL_STENCIL			,"GL_STENCIL" },
-  { GL_STENCIL_BITS		,"GL_STENCIL_BITS" },
-  { GL_STENCIL_CLEAR_VALUE	,"GL_STENCIL_CLEAR_VALUE" },
-  { GL_STENCIL_FAIL		,"GL_STENCIL_FAIL" },
-  { GL_STENCIL_FUNC		,"GL_STENCIL_FUNC" },
-  { GL_STENCIL_INDEX		,"GL_STENCIL_INDEX" },
-  { GL_STENCIL_PASS_DEPTH_FAIL	,"GL_STENCIL_PASS_DEPTH_FAIL" },
-  { GL_STENCIL_PASS_DEPTH_PASS	,"GL_STENCIL_PASS_DEPTH_PASS" },
-  { GL_STENCIL_REF		,"GL_STENCIL_REF" },
-  { GL_STENCIL_TEST		,"GL_STENCIL_TEST" },
-  { GL_STENCIL_VALUE_MASK	,"GL_STENCIL_VALUE_MASK" },
-  { GL_STENCIL_WRITEMASK	,"GL_STENCIL_WRITEMASK" },
-  { GL_STEREO			,"GL_STEREO" },
-  { GL_SUBPIXEL_BITS		,"GL_SUBPIXEL_BITS" },
-  { GL_T			,"GL_T" },
-  { GL_TEXTURE			,"GL_TEXTURE" },
-  { GL_TEXTURE_1D		,"GL_TEXTURE_1D" },
-  { GL_TEXTURE_2D		,"GL_TEXTURE_2D" },
-  { GL_TEXTURE_BORDER		,"GL_TEXTURE_BORDER" },
-  { GL_TEXTURE_BORDER_COLOR	,"GL_TEXTURE_BORDER_COLOR" },
-  { GL_TEXTURE_COMPONENTS	,"GL_TEXTURE_COMPONENTS" },
-#ifdef GL_TEXTURE_COORD_ARRAY_EXT
-  { GL_TEXTURE_COORD_ARRAY_COUNT_EXT,"GL_TEXTURE_COORD_ARRAY_COUNT_EXT" },
-  { GL_TEXTURE_COORD_ARRAY_EXT	,"GL_TEXTURE_COORD_ARRAY_EXT" },
-  { GL_TEXTURE_COORD_ARRAY_POINTER_EXT,"GL_TEXTURE_COORD_ARRAY_POINTER_EXT" },
-  { GL_TEXTURE_COORD_ARRAY_SIZE_EXT,"GL_TEXTURE_COORD_ARRAY_SIZE_EXT" },
-  { GL_TEXTURE_COORD_ARRAY_STRIDE_EXT,"GL_TEXTURE_COORD_ARRAY_STRIDE_EXT" },
-  { GL_TEXTURE_COORD_ARRAY_TYPE_EXT,"GL_TEXTURE_COORD_ARRAY_TYPE_EXT" },
-#endif
-  { GL_TEXTURE_ENV		,"GL_TEXTURE_ENV" },
-  { GL_TEXTURE_ENV_COLOR	,"GL_TEXTURE_ENV_COLOR" },
-  { GL_TEXTURE_ENV_MODE		,"GL_TEXTURE_ENV_MODE" },
-  { GL_TEXTURE_GEN_MODE		,"GL_TEXTURE_GEN_MODE" },
-  { GL_TEXTURE_GEN_Q		,"GL_TEXTURE_GEN_Q" },
-  { GL_TEXTURE_GEN_R		,"GL_TEXTURE_GEN_R" },
-  { GL_TEXTURE_GEN_S		,"GL_TEXTURE_GEN_S" },
-  { GL_TEXTURE_GEN_T		,"GL_TEXTURE_GEN_T" },
-  { GL_TEXTURE_HEIGHT		,"GL_TEXTURE_HEIGHT" },
-  { GL_TEXTURE_MAG_FILTER	,"GL_TEXTURE_MAG_FILTER" },
-  { GL_TEXTURE_MATRIX		,"GL_TEXTURE_MATRIX" },
-  { GL_TEXTURE_MIN_FILTER	,"GL_TEXTURE_MIN_FILTER" },
-  { GL_TEXTURE_STACK_DEPTH	,"GL_TEXTURE_STACK_DEPTH" },
-  { GL_TEXTURE_WIDTH		,"GL_TEXTURE_WIDTH" },
-  { GL_TEXTURE_WRAP_S		,"GL_TEXTURE_WRAP_S" },
-  { GL_TEXTURE_WRAP_T		,"GL_TEXTURE_WRAP_T" },
-  { GL_TRIANGLES		,"GL_TRIANGLES" },
-  { GL_TRIANGLE_FAN		,"GL_TRIANGLE_FAN" },
-  { GL_TRIANGLE_STRIP		,"GL_TRIANGLE_STRIP" },
-  { GL_UNPACK_ALIGNMENT		,"GL_UNPACK_ALIGNMENT" },
-  { GL_UNPACK_LSB_FIRST		,"GL_UNPACK_LSB_FIRST" },
-  { GL_UNPACK_ROW_LENGTH	,"GL_UNPACK_ROW_LENGTH" },
-  { GL_UNPACK_SKIP_PIXELS	,"GL_UNPACK_SKIP_PIXELS" },
-  { GL_UNPACK_SKIP_ROWS		,"GL_UNPACK_SKIP_ROWS" },
-  { GL_UNPACK_SWAP_BYTES	,"GL_UNPACK_SWAP_BYTES" },
-  { GL_UNSIGNED_BYTE		,"GL_UNSIGNED_BYTE" },
-  { GL_UNSIGNED_INT		,"GL_UNSIGNED_INT" },
-  { GL_UNSIGNED_SHORT		,"GL_UNSIGNED_SHORT" },
-  { GL_VENDOR			,"GL_VENDOR" },
-  { GL_VERSION			,"GL_VERSION" },
-#ifdef GL_VERTEX_ARRAY_EXT
-  { GL_VERTEX_ARRAY_COUNT_EXT	,"GL_VERTEX_ARRAY_COUNT_EXT" },
-  { GL_VERTEX_ARRAY_EXT		,"GL_VERTEX_ARRAY_EXT" },
-  { GL_VERTEX_ARRAY_POINTER_EXT	,"GL_VERTEX_ARRAY_POINTER_EXT" },
-  { GL_VERTEX_ARRAY_SIZE_EXT	,"GL_VERTEX_ARRAY_SIZE_EXT" },
-  { GL_VERTEX_ARRAY_STRIDE_EXT	,"GL_VERTEX_ARRAY_STRIDE_EXT" },
-  { GL_VERTEX_ARRAY_TYPE_EXT	,"GL_VERTEX_ARRAY_TYPE_EXT" },
-#endif
-  { GL_VIEWPORT			,"GL_VIEWPORT" },
-  { GL_XOR			,"GL_XOR" },
-  { GL_ZOOM_X			,"GL_ZOOM_X" },
-  { GL_ZOOM_Y			,"GL_ZOOM_Y" },
-
-  /* Magic end-marker - do not remove! */
-  { GL_ZERO, NULL }
-} ;
-
-
-int xglTraceIsEnabled ( char *gl_function_name )
-{
-  static int frameno   = 0 ;
-  static int countdown = 0 ;
-
-  if ( strcmp ( gl_function_name, "glutSwapBuffers" ) == 0 )
-  {
-    if ( countdown == 0 )
-    {
-      char s [ 100 ] ;
-
-      fprintf ( stderr, "\nContinue Tracing after frame %d [Yes,No,Countdown,eXit] ?", ++frameno ) ;
-      gets ( s ) ;
-
-      if ( s[0] == 'x' )
-        exit ( 1 ) ;
-
-      xglTraceOn = ( s[0] != 'n' && s[0] != 'c' ) ;
-
-      if ( s[0] == 'c' )
-      {
-	fprintf ( stderr, "\nHow many frames should I wait until I ask again?" ) ;
-	gets ( s ) ;
-	countdown = atoi(s) ;
-      }
-
-      fprintf ( xglTraceFd, "/* Frame %d - tracing %s */\n", frameno, xglTraceOn ? "ON" : "OFF" ) ;
-    }
-    else
-      countdown-- ;
-  }
-
-  return xglTraceOn ;
-}
-
-
-int xglExecuteIsEnabled ( char *gl_function_name )
-{
-  return TRUE ;
-}
-
-char *xglExpandGLenum ( GLenum x )
-{
-  static GLenum last_val = GL_NONE ;
-  static char  *last_str = NULL ;
-  char *error_message;
-  int i;
-
-  /* Due to ambiguity - these are output as numbers...
-
-      GL_NONE = , GL_ZERO = GL_FALSE = GL_POINTS = 0
-      GL_ONE  = , GL_TRUE = GL_LINES = 1
-  */
-
-  if ( (int) x == 0 ) return "(GLenum) 0" ;
-  if ( (int) x == 1 ) return "(GLenum) 1" ;
-
-  if ( last_val == x ) return last_str ;
-
-  for ( i = 0 ; glenum_string [i].name != NULL ; i++ )
-    if ( glenum_string [i].val == x )
-      return  glenum_string [i].name ;
-
-  /*
-    WARNING - this will leak memory - but it is an error condition,
-              so I suppose it's acceptable.
-              You can't declare the 'error_message' string as a
-              static - or else double errors will go mis-reported.
-  */
-
-  error_message = (char *)malloc( 100 * sizeof(char) ) ;
-
-  sprintf ( error_message, "(GLenum) 0x%04x /* Illegal? */", (int) x ) ;
-
-  return error_message ;
-}
-
-static GLbyte    b1 [ 1 ],  b2 [ 2 ],  b3 [ 3 ],  b4 [ 4 ] ;
-static GLdouble  d1 [ 1 ],  d2 [ 2 ],  d3 [ 3 ],  d4 [ 4 ] ;
-static GLfloat   f1 [ 1 ],  f2 [ 2 ],  f3 [ 3 ],  f4 [ 4 ] ;
-static GLint     i1 [ 1 ],  i2 [ 2 ],  i3 [ 3 ],  i4 [ 4 ] ;
-static GLshort   s1 [ 1 ],  s2 [ 2 ],  s3 [ 3 ],  s4 [ 4 ] ;
-static GLubyte  ub1 [ 1 ], ub2 [ 2 ], ub3 [ 3 ], ub4 [ 4 ] ;
-static GLuint   ui1 [ 1 ], ui2 [ 2 ], ui3 [ 3 ], ui4 [ 4 ] ;
-static GLushort us1 [ 1 ], us2 [ 2 ], us3 [ 3 ], us4 [ 4 ] ;
-
-static GLdouble md [ 16 ] ;
-static GLfloat  mf [ 16 ] ;
-
-GLdouble *xglBuild1dv  ( GLdouble v ) {  d1[0] = v ; return  d1 ; }
-GLfloat  *xglBuild1fv  ( GLfloat  v ) {  f1[0] = v ; return  f1 ; }
-GLbyte   *xglBuild1bv  ( GLbyte   v ) {  b1[0] = v ; return  b1 ; }
-GLint    *xglBuild1iv  ( GLint    v ) {  i1[0] = v ; return  i1 ; }
-GLshort  *xglBuild1sv  ( GLshort  v ) {  s1[0] = v ; return  s1 ; }
-GLubyte  *xglBuild1ubv ( GLubyte  v ) { ub1[0] = v ; return ub1 ; }
-GLuint   *xglBuild1uiv ( GLuint   v ) { ui1[0] = v ; return ui1 ; }
-GLushort *xglBuild1usv ( GLushort v ) { us1[0] = v ; return us1 ; }
-
-GLdouble *xglBuild2dv  ( GLdouble v0, GLdouble v1 ) {  d2[0] = v0 ;  d2[1] = v1 ; return  d2 ; }
-GLfloat  *xglBuild2fv  ( GLfloat  v0, GLfloat  v1 ) {  f2[0] = v0 ;  f2[1] = v1 ; return  f2 ; }
-GLbyte   *xglBuild2bv  ( GLbyte   v0, GLbyte   v1 ) {  b2[0] = v0 ;  b2[1] = v1 ; return  b2 ; }
-GLint    *xglBuild2iv  ( GLint    v0, GLint    v1 ) {  i2[0] = v0 ;  i2[1] = v1 ; return  i2 ; }
-GLshort  *xglBuild2sv  ( GLshort  v0, GLshort  v1 ) {  s2[0] = v0 ;  s2[1] = v1 ; return  s2 ; }
-GLubyte  *xglBuild2ubv ( GLubyte  v0, GLubyte  v1 ) { ub2[0] = v0 ; ub2[1] = v1 ; return ub2 ; }
-GLuint   *xglBuild2uiv ( GLuint   v0, GLuint   v1 ) { ui2[0] = v0 ; ui2[1] = v1 ; return ui2 ; }
-GLushort *xglBuild2usv ( GLushort v0, GLushort v1 ) { us2[0] = v0 ; us2[1] = v1 ; return us2 ; }
-
-GLdouble *xglBuild3dv  ( GLdouble v0, GLdouble v1, GLdouble v2 ) {  d3[0] = v0 ;  d3[1] = v1 ;  d3[2] = v2 ; return  d3 ; }
-GLfloat  *xglBuild3fv  ( GLfloat  v0, GLfloat  v1, GLfloat  v2 ) {  f3[0] = v0 ;  f3[1] = v1 ;  f3[2] = v2 ; return  f3 ; }
-GLbyte   *xglBuild3bv  ( GLbyte   v0, GLbyte   v1, GLbyte   v2 ) {  b3[0] = v0 ;  b3[1] = v1 ;  b3[2] = v2 ; return  b3 ; }
-GLint    *xglBuild3iv  ( GLint    v0, GLint    v1, GLint    v2 ) {  i3[0] = v0 ;  i3[1] = v1 ;  i3[2] = v2 ; return  i3 ; }
-GLshort  *xglBuild3sv  ( GLshort  v0, GLshort  v1, GLshort  v2 ) {  s3[0] = v0 ;  s3[1] = v1 ;  s3[2] = v2 ; return  s3 ; }
-GLubyte  *xglBuild3ubv ( GLubyte  v0, GLubyte  v1, GLubyte  v2 ) { ub3[0] = v0 ; ub3[1] = v1 ; ub3[2] = v2 ; return ub3 ; }
-GLuint   *xglBuild3uiv ( GLuint   v0, GLuint   v1, GLuint   v2 ) { ui3[0] = v0 ; ui3[1] = v1 ; ui3[2] = v2 ; return ui3 ; }
-GLushort *xglBuild3usv ( GLushort v0, GLushort v1, GLushort v2 ) { us3[0] = v0 ; us3[1] = v1 ; us3[2] = v2 ; return us3 ; }
-
-
-GLdouble *xglBuild4dv  ( GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3 ) {  d4[0] = v0 ;  d4[1] = v1 ;  d4[2] = v2 ;  d4[3] = v3 ; return  d4 ; }
-GLfloat  *xglBuild4fv  ( GLfloat  v0, GLfloat  v1, GLfloat  v2, GLfloat  v3 ) {  f4[0] = v0 ;  f4[1] = v1 ;  f4[2] = v2 ;  f4[3] = v3 ; return  f4 ; }
-GLbyte   *xglBuild4bv  ( GLbyte   v0, GLbyte   v1, GLbyte   v2, GLbyte   v3 ) {  b4[0] = v0 ;  b4[1] = v1 ;  b4[2] = v2 ;  b4[3] = v3 ; return  b4 ; }
-GLint    *xglBuild4iv  ( GLint    v0, GLint    v1, GLint    v2, GLint    v3 ) {  i4[0] = v0 ;  i4[1] = v1 ;  i4[2] = v2 ;  i4[3] = v3 ; return  i4 ; }
-GLshort  *xglBuild4sv  ( GLshort  v0, GLshort  v1, GLshort  v2, GLshort  v3 ) {  s4[0] = v0 ;  s4[1] = v1 ;  s4[2] = v2 ;  s4[3] = v3 ; return  s4 ; }
-GLubyte  *xglBuild4ubv ( GLubyte  v0, GLubyte  v1, GLubyte  v2, GLubyte  v3 ) { ub4[0] = v0 ; ub4[1] = v1 ; ub4[2] = v2 ; ub4[3] = v3 ; return ub4 ; }
-GLuint   *xglBuild4uiv ( GLuint   v0, GLuint   v1, GLuint   v2, GLuint   v3 ) { ui4[0] = v0 ; ui4[1] = v1 ; ui4[2] = v2 ; ui4[3] = v3 ; return ui4 ; }
-GLushort *xglBuild4usv ( GLushort v0, GLushort v1, GLushort v2, GLushort v3 ) { us4[0] = v0 ; us4[1] = v1 ; us4[2] = v2 ; us4[3] = v3 ; return us4 ; }
-
-GLdouble *xglBuildMatrixd ( GLdouble m0 , GLdouble m1 , GLdouble m2 , GLdouble m3 ,
-                            GLdouble m4 , GLdouble m5 , GLdouble m6 , GLdouble m7 ,
-                            GLdouble m8 , GLdouble m9 , GLdouble m10, GLdouble m11,
-                            GLdouble m12, GLdouble m13, GLdouble m14, GLdouble m15 )
-{
-  md[ 0] = m0  ; md[ 1] = m1  ; md[ 2] = m2  ; md[ 3] = m3  ;
-  md[ 4] = m4  ; md[ 5] = m5  ; md[ 6] = m6  ; md[ 7] = m7  ;
-  md[ 8] = m8  ; md[ 9] = m9  ; md[10] = m10 ; md[11] = m11 ;
-  md[12] = m12 ; md[13] = m13 ; md[14] = m14 ; md[15] = m15 ;
-
-  return md ;
-}
-
-
-GLfloat *xglBuildMatrixf ( GLfloat m0 , GLfloat m1 , GLfloat m2 , GLfloat m3 ,
-                           GLfloat m4 , GLfloat m5 , GLfloat m6 , GLfloat m7 ,
-                           GLfloat m8 , GLfloat m9 , GLfloat m10, GLfloat m11,
-                           GLfloat m12, GLfloat m13, GLfloat m14, GLfloat m15 )
-{
-  mf[ 0] = m0  ; mf[ 1] = m1  ; mf[ 2] = m2  ; mf[ 3] = m3  ;
-  mf[ 4] = m4  ; mf[ 5] = m5  ; mf[ 6] = m6  ; mf[ 7] = m7  ;
-  mf[ 8] = m8  ; mf[ 9] = m9  ; mf[10] = m10 ; mf[11] = m11 ;
-  mf[12] = m12 ; mf[13] = m13 ; mf[14] = m14 ; mf[15] = m15 ;
-
-  return mf ;
-}
-
diff --git a/Lib/zlib/ChangeLog b/Lib/zlib/ChangeLog
deleted file mode 100644
index 57386a26f..000000000
--- a/Lib/zlib/ChangeLog
+++ /dev/null
@@ -1,471 +0,0 @@
-
-		ChangeLog file for zlib
-
-Changes in 1.1.3 (9 July 1998)
-- fix "an inflate input buffer bug that shows up on rare but persistent
-  occasions" (Mark)
-- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
-- fix gzseek(..., SEEK_SET) in write mode
-- fix crc check after a gzeek (Frank Faubert)
-- fix miniunzip when the last entry in a zip file is itself a zip file
-  (J Lillge)
-- add contrib/asm586 and contrib/asm686 (Brian Raiter)
-  See http://www.muppetlabs.com/~breadbox/software/assembly.html
-- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
-- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
-- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
-- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
-- added a FAQ file
-
-- Support gzdopen on Mac with Metrowerks (Jason Linhart)
-- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart)
-- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young)
-- avoid some warnings with Borland C (Tom Tanner)
-- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant)
-- emulate utime() for WIN32 in contrib/untgz  (Gilles Vollant)
-- allow several arguments to configure (Tim Mooney, Frodo Looijaard)
-- use libdir and includedir in Makefile.in (Tim Mooney)
-- support shared libraries on OSF1 V4 (Tim Mooney)
-- remove so_locations in "make clean"  (Tim Mooney)
-- fix maketree.c compilation error (Glenn, Mark)
-- Python interface to zlib now in Python 1.5 (Jeremy Hylton)
-- new Makefile.riscos (Rich Walker)
-- initialize static descriptors in trees.c for embedded targets (Nick Smith)
-- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith)
-- add the OS/2 files in Makefile.in too (Andrew Zabolotny)
-- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane)
-- fix maketree.c to allow clean compilation of inffixed.h (Mark)
-- fix parameter check in deflateCopy (Gunther Nikl)
-- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler)
-- Many portability patches by Christian Spieler:
-  . zutil.c, zutil.h: added "const" for zmem*
-  . Make_vms.com: fixed some typos
-  . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists
-  . msdos/Makefile.msc: remove "default rtl link library" info from obj files
-  . msdos/Makefile.*: use model-dependent name for the built zlib library
-  . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc:
-     new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT)
-- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane)
-- replace __far with _far for better portability (Christian Spieler, Tom Lane)
-- fix test for errno.h in configure (Tim Newsham)
-
-Changes in 1.1.2 (19 March 98)
-- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant)
-  See http://www.winimage.com/zLibDll/unzip.html
-- preinitialize the inflate tables for fixed codes, to make the code
-  completely thread safe (Mark)
-- some simplifications and slight speed-up to the inflate code (Mark)
-- fix gzeof on non-compressed files (Allan Schrum)
-- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs)
-- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn)
-- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny)
-- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori)
-- do not wrap extern "C" around system includes (Tom Lane)
-- mention zlib binding for TCL in README (Andreas Kupries)
-- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert)
-- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson)
-- allow "configure --prefix $HOME" (Tim Mooney)
-- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson)
-- move Makefile.sas to amiga/Makefile.sas
-
-Changes in 1.1.1 (27 Feb 98)
-- fix macros _tr_tally_* in deflate.h for debug mode  (Glenn Randers-Pehrson)
-- remove block truncation heuristic which had very marginal effect for zlib
-  (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
-  compression ratio on some files. This also allows inlining _tr_tally for
-  matches in deflate_slow.
-- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
-
-Changes in 1.1.0 (24 Feb 98)
-- do not return STREAM_END prematurely in inflate (John Bowler)
-- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler)
-- compile with -DFASTEST to get compression code optimized for speed only
-- in minigzip, try mmap'ing the input file first (Miguel Albrecht)
-- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain
-  on Sun but significant on HP)
-
-- add a pointer to experimental unzip library in README (Gilles Vollant)
-- initialize variable gcc in configure (Chris Herborth)
-
-Changes in 1.0.9 (17 Feb 1998)
-- added gzputs and gzgets functions
-- do not clear eof flag in gzseek (Mark Diekhans)
-- fix gzseek for files in transparent mode (Mark Diekhans)
-- do not assume that vsprintf returns the number of bytes written (Jens Krinke)
-- replace EXPORT with ZEXPORT to avoid conflict with other programs
-- added compress2 in zconf.h, zlib.def, zlib.dnt
-- new asm code from Gilles Vollant in contrib/asm386
-- simplify the inflate code (Mark):
- . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new()
- . ZALLOC the length list in inflate_trees_fixed() instead of using stack
- . ZALLOC the value area for huft_build() instead of using stack
- . Simplify Z_FINISH check in inflate()
-
-- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8
-- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi)
-- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with
-  the declaration of FAR (Gilles VOllant)
-- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann)
-- read_buf buf parameter of type Bytef* instead of charf*
-- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout)
-- do not redeclare unlink in minigzip.c for WIN32 (John Bowler)
-- fix check for presence of directories in "make install" (Ian Willis)
-
-Changes in 1.0.8 (27 Jan 1998)
-- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant)
-- fix gzgetc and gzputc for big endian systems (Markus Oberhumer)
-- added compress2() to allow setting the compression level
-- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
-- use constant arrays for the static trees in trees.c instead of computing
-  them at run time (thanks to Ken Raeburn for this suggestion). To create
-  trees.h, compile with GEN_TREES_H and run "make test".
-- check return code of example in "make test" and display result
-- pass minigzip command line options to file_compress
-- simplifying code of inflateSync to avoid gcc 2.8 bug
-
-- support CC="gcc -Wall" in configure -s (QingLong)
-- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn)
-- fix test for shared library support to avoid compiler warnings
-- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant)
-- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit)
-- do not use fdopen for Metrowerks on Mac (Brad Pettit))
-- add checks for gzputc and gzputc in example.c
-- avoid warnings in gzio.c and deflate.c (Andreas Kleinert)
-- use const for the CRC table (Ken Raeburn)
-- fixed "make uninstall" for shared libraries
-- use Tracev instead of Trace in infblock.c
-- in example.c use correct compressed length for test_sync
-- suppress +vnocompatwarnings in configure for HPUX (not always supported)
-
-Changes in 1.0.7 (20 Jan 1998)
-- fix gzseek which was broken in write mode
-- return error for gzseek to negative absolute position
-- fix configure for Linux (Chun-Chung Chen)
-- increase stack space for MSC (Tim Wegner)
-- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant)
-- define EXPORTVA for gzprintf (Gilles Vollant)
-- added man page zlib.3 (Rick Rodgers)
-- for contrib/untgz, fix makedir() and improve Makefile
-
-- check gzseek in write mode in example.c
-- allocate extra buffer for seeks only if gzseek is actually called
-- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant)
-- add inflateSyncPoint in zconf.h
-- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def
-
-Changes in 1.0.6 (19 Jan 1998)
-- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
-  gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
-- Fix a deflate bug occuring only with compression level 0 (thanks to
-  Andy Buckler for finding this one).
-- In minigzip, pass transparently also the first byte for .Z files.
-- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
-- check Z_FINISH in inflate (thanks to Marc Schluper)
-- Implement deflateCopy (thanks to Adam Costello)
-- make static libraries by default in configure, add --shared option.
-- move MSDOS or Windows specific files to directory msdos
-- suppress the notion of partial flush to simplify the interface
-  (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
-- suppress history buffer provided by application to simplify the interface
-  (this feature was not implemented anyway in 1.0.4)
-- next_in and avail_in must be initialized before calling inflateInit or
-  inflateInit2
-- add EXPORT in all exported functions (for Windows DLL)
-- added Makefile.nt (thanks to Stephen Williams)
-- added the unsupported "contrib" directory:
-   contrib/asm386/ by Gilles Vollant 
-	386 asm code replacing longest_match().
-   contrib/iostream/ by Kevin Ruland 
-        A C++ I/O streams interface to the zlib gz* functions
-   contrib/iostream2/  by Tyge Løvset 
-	Another C++ I/O streams interface
-   contrib/untgz/  by "Pedro A. Aranda Guti\irrez" 
-	A very simple tar.gz file extractor using zlib
-   contrib/visual-basic.txt by Carlos Rios 
-        How to use compress(), uncompress() and the gz* functions from VB.
-- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
-  level) in minigzip (thanks to Tom Lane)
-
-- use const for rommable constants in deflate
-- added test for gzseek and gztell in example.c
-- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
-- add undocumented function zError to convert error code to string
-  (for Tim Smithers)
-- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.
-- Use default memcpy for Symantec MSDOS compiler.
-- Add EXPORT keyword for check_func (needed for Windows DLL)
-- add current directory to LD_LIBRARY_PATH for "make test"
-- create also a link for libz.so.1
-- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura)
-- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX)
-- added -soname for Linux in configure (Chun-Chung Chen,
-- assign numbers to the exported functions in zlib.def (for Windows DLL)
-- add advice in zlib.h for best usage of deflateSetDictionary
-- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn)
-- allow compilation with ANSI keywords only enabled for TurboC in large model
-- avoid "versionString"[0] (Borland bug)
-- add NEED_DUMMY_RETURN for Borland
-- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
-- allow compilation with CC
-- defined STDC for OS/2 (David Charlap)	
-- limit external names to 8 chars for MVS (Thomas Lund)
-- in minigzip.c, use static buffers only for 16-bit systems
-- fix suffix check for "minigzip -d foo.gz"
-- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee)
-- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
-- added makelcc.bat for lcc-win32 (Tom St Denis)
-- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
-- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
-- check for unistd.h in configure (for off_t)
-- remove useless check parameter in inflate_blocks_free
-- avoid useless assignment of s->check to itself in inflate_blocks_new
-- do not flush twice in gzclose (thanks to Ken Raeburn)
-- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h
-- use NO_ERRNO_H instead of enumeration of operating systems with errno.h
-- work around buggy fclose on pipes for HP/UX
-- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson)
-- fix configure if CC is already equal to gcc
-
-Changes in 1.0.5 (3 Jan 98)
-- Fix inflate to terminate gracefully when fed corrupted or invalid data
-- Use const for rommable constants in inflate
-- Eliminate memory leaks on error conditions in inflate
-- Removed some vestigial code in inflate
-- Update web address in README
-  
-Changes in 1.0.4 (24 Jul 96)
-- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
-  bit, so the decompressor could decompress all the correct data but went
-  on to attempt decompressing extra garbage data. This affected minigzip too.
-- zlibVersion and gzerror return const char* (needed for DLL)
-- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
-- use z_error only for DEBUG (avoid problem with DLLs)
-
-Changes in 1.0.3 (2 Jul 96)
-- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS
-  small and medium models; this makes the library incompatible with previous
-  versions for these models. (No effect in large model or on other systems.)
-- return OK instead of BUF_ERROR if previous deflate call returned with
-  avail_out as zero but there is nothing to do
-- added memcmp for non STDC compilers
-- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly)
-- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO)
-- better check for 16-bit mode MSC (avoids problem with Symantec)
-
-Changes in 1.0.2 (23 May 96)
-- added Windows DLL support
-- added a function zlibVersion (for the DLL support)
-- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model)
-- Bytef is define's instead of typedef'd only for Borland C
-- avoid reading uninitialized memory in example.c
-- mention in README that the zlib format is now RFC1950
-- updated Makefile.dj2
-- added algorithm.doc
-
-Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
-- fix array overlay in deflate.c which sometimes caused bad compressed data
-- fix inflate bug with empty stored block
-- fix MSDOS medium model which was broken in 0.99
-- fix deflateParams() which could generated bad compressed data.
-- Bytef is define'd instead of typedef'ed (work around Borland bug)
-- added an INDEX file
-- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
-  Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas)
-- speed up adler32 for modern machines without auto-increment
-- added -ansi for IRIX in configure
-- static_init_done in trees.c is an int
-- define unlink as delete for VMS
-- fix configure for QNX
-- add configure branch for SCO and HPUX
-- avoid many warnings (unused variables, dead assignments, etc...)
-- no fdopen for BeOS
-- fix the Watcom fix for 32 bit mode (define FAR as empty)
-- removed redefinition of Byte for MKWERKS
-- work around an MWKERKS bug (incorrect merge of all .h files)
-
-Changes in 0.99 (27 Jan 96)
-- allow preset dictionary shared between compressor and decompressor
-- allow compression level 0 (no compression)
-- add deflateParams in zlib.h: allow dynamic change of compression level
-  and compression strategy.
-- test large buffers and deflateParams in example.c
-- add optional "configure" to build zlib as a shared library
-- suppress Makefile.qnx, use configure instead
-- fixed deflate for 64-bit systems (detected on Cray)
-- fixed inflate_blocks for 64-bit systems (detected on Alpha)
-- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2)
-- always return Z_BUF_ERROR when deflate() has nothing to do
-- deflateInit and inflateInit are now macros to allow version checking
-- prefix all global functions and types with z_ with -DZ_PREFIX
-- make falloc completely reentrant (inftrees.c)
-- fixed very unlikely race condition in ct_static_init
-- free in reverse order of allocation to help memory manager
-- use zlib-1.0/* instead of zlib/* inside the tar.gz
-- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith
-  -Wconversion -Wstrict-prototypes -Wmissing-prototypes"
-- allow gzread on concatenated .gz files
-- deflateEnd now returns Z_DATA_ERROR if it was premature
-- deflate is finally (?) fully deterministic (no matches beyond end of input)
-- Document Z_SYNC_FLUSH
-- add uninstall in Makefile
-- Check for __cpluplus in zlib.h
-- Better test in ct_align for partial flush
-- avoid harmless warnings for Borland C++
-- initialize hash_head in deflate.c
-- avoid warning on fdopen (gzio.c) for HP cc -Aa
-- include stdlib.h for STDC compilers
-- include errno.h for Cray
-- ignore error if ranlib doesn't exist
-- call ranlib twice for NeXTSTEP
-- use exec_prefix instead of prefix for libz.a
-- renamed ct_* as _tr_* to avoid conflict with applications
-- clear z->msg in inflateInit2 before any error return
-- initialize opaque in example.c, gzio.c, deflate.c and inflate.c
-- fixed typo in zconf.h (_GNUC__ => __GNUC__)
-- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode)
-- fix typo in Make_vms.com (f$trnlnm -> f$getsyi)
-- in fcalloc, normalize pointer if size > 65520 bytes
-- don't use special fcalloc for 32 bit Borland C++
-- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
-- use Z_BINARY instead of BINARY
-- document that gzclose after gzdopen will close the file
-- allow "a" as mode in gzopen.
-- fix error checking in gzread
-- allow skipping .gz extra-field on pipes
-- added reference to Perl interface in README
-- put the crc table in FAR data (I dislike more and more the medium model :)
-- added get_crc_table
-- added a dimension to all arrays (Borland C can't count).
-- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
-- guard against multiple inclusion of *.h (for precompiled header on Mac)
-- Watcom C pretends to be Microsoft C small model even in 32 bit mode.
-- don't use unsized arrays to avoid silly warnings by Visual C++:
-     warning C4746: 'inflate_mask' : unsized array treated as  '__far'
-     (what's wrong with far data in far model?).
-- define enum out of inflate_blocks_state to allow compilation with C++
-
-Changes in 0.95 (16 Aug 95)
-- fix MSDOS small and medium model (now easier to adapt to any compiler)
-- inlined send_bits
-- fix the final (:-) bug for deflate with flush (output was correct but
-  not completely flushed in rare occasions).
-- default window size is same for compression and decompression
-  (it's now sufficient to set MAX_WBITS in zconf.h).
-- voidp -> voidpf and voidnp -> voidp (for consistency with other
-  typedefs and because voidnp was not near in large model).
-
-Changes in 0.94 (13 Aug 95)
-- support MSDOS medium model
-- fix deflate with flush (could sometimes generate bad output)
-- fix deflateReset (zlib header was incorrectly suppressed)
-- added support for VMS
-- allow a compression level in gzopen()
-- gzflush now calls fflush
-- For deflate with flush, flush even if no more input is provided.
-- rename libgz.a as libz.a
-- avoid complex expression in infcodes.c triggering Turbo C bug
-- work around a problem with gcc on Alpha (in INSERT_STRING)
-- don't use inline functions (problem with some gcc versions)
-- allow renaming of Byte, uInt, etc... with #define.
-- avoid warning about (unused) pointer before start of array in deflate.c
-- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
-- avoid reserved word 'new' in trees.c
-
-Changes in 0.93 (25 June 95)
-- temporarily disable inline functions
-- make deflate deterministic
-- give enough lookahead for PARTIAL_FLUSH
-- Set binary mode for stdin/stdout in minigzip.c for OS/2
-- don't even use signed char in inflate (not portable enough)
-- fix inflate memory leak for segmented architectures
-
-Changes in 0.92 (3 May 95)
-- don't assume that char is signed (problem on SGI)
-- Clear bit buffer when starting a stored block
-- no memcpy on Pyramid
-- suppressed inftest.c
-- optimized fill_window, put longest_match inline for gcc
-- optimized inflate on stored blocks.
-- untabify all sources to simplify patches
-
-Changes in 0.91 (2 May 95)
-- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h
-- Document the memory requirements in zconf.h
-- added "make install"
-- fix sync search logic in inflateSync
-- deflate(Z_FULL_FLUSH) now works even if output buffer too short
-- after inflateSync, don't scare people with just "lo world"
-- added support for DJGPP
-
-Changes in 0.9 (1 May 95)
-- don't assume that zalloc clears the allocated memory (the TurboC bug
-  was Mark's bug after all :)
-- let again gzread copy uncompressed data unchanged (was working in 0.71)
-- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
-- added a test of inflateSync in example.c
-- moved MAX_WBITS to zconf.h because users might want to change that.
-- document explicitly that zalloc(64K) on MSDOS must return a normalized
-  pointer (zero offset)
-- added Makefiles for Microsoft C, Turbo C, Borland C++
-- faster crc32()
-
-Changes in 0.8 (29 April 95)
-- added fast inflate (inffast.c)
-- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
-  is incompatible with previous versions of zlib which returned Z_OK.
-- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
-  (actually that was not a compiler bug, see 0.81 above)
-- gzread no longer reads one extra byte in certain cases
-- In gzio destroy(), don't reference a freed structure
-- avoid many warnings for MSDOS
-- avoid the ERROR symbol which is used by MS Windows
-
-Changes in 0.71 (14 April 95)
-- Fixed more MSDOS compilation problems :( There is still a bug with
-  TurboC large model.
-
-Changes in 0.7 (14 April 95)
-- Added full inflate support.
-- Simplified the crc32() interface. The pre- and post-conditioning
-  (one's complement) is now done inside crc32(). WARNING: this is
-  incompatible with previous versions; see zlib.h for the new usage.
-
-Changes in 0.61 (12 April 95)
-- workaround for a bug in TurboC. example and minigzip now work on MSDOS.
-
-Changes in 0.6 (11 April 95)
-- added minigzip.c
-- added gzdopen to reopen a file descriptor as gzFile
-- added transparent reading of non-gziped files in gzread.
-- fixed bug in gzread (don't read crc as data)
-- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).
-- don't allocate big arrays in the stack (for MSDOS)
-- fix some MSDOS compilation problems
-
-Changes in 0.5:
-- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
-  not yet Z_FULL_FLUSH.
-- support decompression but only in a single step (forced Z_FINISH)
-- added opaque object for zalloc and zfree.
-- added deflateReset and inflateReset
-- added a variable zlib_version for consistency checking.
-- renamed the 'filter' parameter of deflateInit2 as 'strategy'.
-  Added Z_FILTERED and Z_HUFFMAN_ONLY constants.
-
-Changes in 0.4:
-- avoid "zip" everywhere, use zlib instead of ziplib.
-- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
-  if compression method == 8.
-- added adler32 and crc32
-- renamed deflateOptions as deflateInit2, call one or the other but not both
-- added the method parameter for deflateInit2.
-- added inflateInit2
-- simplied considerably deflateInit and inflateInit by not supporting
-  user-provided history buffer. This is supported only in deflateInit2
-  and inflateInit2.
-
-Changes in 0.3:
-- prefix all macro names with Z_
-- use Z_FINISH instead of deflateEnd to finish compression.
-- added Z_HUFFMAN_ONLY
-- added gzerror()
diff --git a/Lib/zlib/FAQ b/Lib/zlib/FAQ
deleted file mode 100644
index 0feb6d3e9..000000000
--- a/Lib/zlib/FAQ
+++ /dev/null
@@ -1,72 +0,0 @@
-
-		Frequently Asked Questions about zlib
-
-
-If your question is not there, please check the zlib home page 
-http://www.cdrom.com/pub/infozip/zlib/ which may have more recent information.
-
-
-1) I need a Windows DLL
-2) I need a Visual Basic interface to zlib
-3) compress() returns Z_BUF_ERROR
-4) deflate or inflate returns Z_BUF_ERROR
-5) Where is the zlib documentation (man pages, etc...)?
-6) Why don't you use GNU autoconf, libtool, etc...?
-7) There is a bug in zlib.
-8) I get "undefined reference to gzputc"
-
-
-
-1) I need a Windows DLL
-
-  The zlib sources can be compiled without change to produce a DLL.
-  If you want a precompiled DLL, see http://www.winimage.com/zLibDll
-
-
-2) I need a Visual Basic interface to zlib
-
-  See http://www.tcfb.com/dowseware/cmp-z-it.zip
-      http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm
-  and contrib/visual-basic.txt
-
-3) compress() returns Z_BUF_ERROR
-
-  Make sure that before the call of compress, the length of the
-  compressed buffer is equal to the total size of the compressed buffer
-  and not zero.  For Visual Basic, check that this parameter is passed
-  by reference ("as any"), not by value ("as long").
-
-
-4) deflate or inflate returns Z_BUF_ERROR
-
-  Make sure that before the call avail_in and avail_out are not zero.
-
-
-5) Where is the zlib documentation (man pages, etc...)?
-
-  It's in zlib.h for the moment. Volunteers to transform this
-  to man pages, please contact jloup@gzip.org. Examples of zlib usage
-  are in the files example.c and minigzip.c.
-
-
-6) Why don't you use GNU autoconf, libtool, etc...?
-
-  Because we would like to keep zlib as a very small and simple package.
-  zlib is rather portable and doesn't need much configuration.
-
-
-7) There is a bug in zlib.
-
-  Most of the time, such problems are due to an incorrect usage
-  of zlib. Please try to reproduce the problem with a small
-  program and send us the corresponding source at zlib@quest.jpl.nasa.gov
-  Do not send multi-megabyte data files without prior agreement.
-
-
-8) I get "undefined reference to gzputc"
-
-  If "make test" produces something like
-     example.o(.text+0x174): 
-  check that you don't have old files libz.* in /usr/lib, /usr/local/lib
-  or /usr/X11R6/lib. Remove old versions then do "make install".
-
diff --git a/Lib/zlib/INDEX b/Lib/zlib/INDEX
deleted file mode 100644
index 8a2457664..000000000
--- a/Lib/zlib/INDEX
+++ /dev/null
@@ -1,86 +0,0 @@
-ChangeLog		history of changes
-INDEX			this file
-FAQ			Frequently Asked Questions about zlib
-Make_vms.com		script for Vax/VMS
-Makefile		makefile for Unix (generated by configure)
-Makefile.in		makefile for Unix (template for configure)
-Makefile.riscos 	makefile for RISCOS
-README			guess what
-algorithm.txt		description of the (de)compression algorithm
-configure		configure script for Unix
-descrip.mms		makefile for Vax/VMS
-zlib.3			mini man page for zlib (volunteers to write full
-			man pages from zlib.h welcome. write to jloup@gzip.org)
-
-amiga/Makefile.sas	makefile for Amiga SAS/C
-amiga/Makefile.pup      makefile for Amiga powerUP SAS/C PPC
-
-msdos/Makefile.w32      makefile for Microsoft Visual C++ 32-bit
-msdos/Makefile.b32	makefile for Borland C++   32-bit
-msdos/Makefile.bor	makefile for Borland C/C++ 16-bit
-msdos/Makefile.dj2	makefile for DJGPP 2.x
-msdos/Makefile.emx	makefile for EMX 0.9c (32-bit DOS/OS2)
-msdos/Makefile.msc	makefile for Microsoft C 16-bit
-msdos/Makefile.tc	makefile for Turbo C
-msdos/Makefile.wat	makefile for Watcom C
-msdos/zlib.def        	definition file for Windows DLL
-msdos/zlib.rc         	definition file for Windows DLL
-
-nt/Makefile.nt		makefile for Windows NT
-nt/zlib.dnt		definition file for Windows NT DLL
-nt/Makefile.emx		makefile for EMX 0.9c/RSXNT 1.41 (Win32 Intel)
-nt/Makefile.gcc		makefile for Windows NT using GCC (mingw32)
-
-
-		zlib public header files (must be kept):
-zconf.h
-zlib.h
-
-		private source files used to build the zlib library:
-adler32.c
-compress.c
-crc32.c
-deflate.c
-deflate.h
-gzio.c
-infblock.c
-infblock.h
-infcodes.c
-infcodes.h
-inffast.c
-inffast.h
-inflate.c
-inftrees.c
-inftrees.h
-infutil.c
-infutil.h
-maketree.c
-trees.c
-uncompr.c
-zutil.c
-zutil.h
-
-		source files for sample programs:
-example.c
-minigzip.c
-
-		unsupported contribution by third parties
-
-contrib/asm386/ by Gilles Vollant 
-	386 asm code replacing longest_match().
-
-contrib/minizip/ by Gilles Vollant 
-	Mini zip and unzip based on zlib
-        See http://www.winimage.com/zLibDll/unzip.html
-
-contrib/iostream/ by Kevin Ruland 
-        A C++ I/O streams interface to the zlib gz* functions
-
-contrib/iostream2/  by Tyge Løvset 
-	Another C++ I/O streams interface
-
-contrib/untgz/  by "Pedro A. Aranda Guti\irrez" 
-	A very simple tar.gz extractor using zlib
-
-contrib/visual-basic.txt by Carlos Rios 
-        How to use compress(), uncompress() and the gz* functions from VB.
diff --git a/Lib/zlib/Make_vms.com b/Lib/zlib/Make_vms.com
deleted file mode 100644
index 1c57e8f0e..000000000
--- a/Lib/zlib/Make_vms.com
+++ /dev/null
@@ -1,115 +0,0 @@
-$! make libz under VMS
-$! written by Martin P.J. Zinser 
-$!
-$! Look for the compiler used
-$!
-$ ccopt = ""
-$ if f$getsyi("HW_MODEL").ge.1024
-$ then
-$  ccopt = "/prefix=all"+ccopt
-$  comp  = "__decc__=1"
-$  if f$trnlnm("SYS").eqs."" then define sys sys$library:
-$ else
-$  if f$search("SYS$SYSTEM:DECC$COMPILER.EXE").eqs.""
-$   then
-$    comp  = "__vaxc__=1"
-$    if f$trnlnm("SYS").eqs."" then define sys sys$library:
-$   else
-$    if f$trnlnm("SYS").eqs."" then define sys decc$library_include:
-$    ccopt = "/decc/prefix=all"+ccopt
-$    comp  = "__decc__=1"
-$  endif
-$ endif
-$!
-$! Build the thing plain or with mms
-$!
-$ write sys$output "Compiling Zlib sources ..."
-$ if f$search("SYS$SYSTEM:MMS.EXE").eqs.""
-$  then
-$   dele example.obj;*,minigzip.obj;*
-$   CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" -
-                adler32.c zlib.h zconf.h
-$   CALL MAKE compress.OBJ "CC ''CCOPT' compress" -
-                compress.c zlib.h zconf.h
-$   CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" -
-                crc32.c zlib.h zconf.h
-$   CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" -
-                deflate.c deflate.h zutil.h zlib.h zconf.h
-$   CALL MAKE gzio.OBJ "CC ''CCOPT' gzio" -
-                gzio.c zutil.h zlib.h zconf.h
-$   CALL MAKE infblock.OBJ "CC ''CCOPT' infblock" -
-                infblock.c zutil.h zlib.h zconf.h infblock.h
-$   CALL MAKE infcodes.OBJ "CC ''CCOPT' infcodes" -
-                infcodes.c zutil.h zlib.h zconf.h inftrees.h
-$   CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" -
-                inffast.c zutil.h zlib.h zconf.h inffast.h
-$   CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" -
-                inflate.c zutil.h zlib.h zconf.h infblock.h
-$   CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" -
-                inftrees.c zutil.h zlib.h zconf.h inftrees.h
-$   CALL MAKE infutil.OBJ "CC ''CCOPT' infutil" -
-                infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
-$   CALL MAKE trees.OBJ "CC ''CCOPT' trees" -
-                trees.c deflate.h zutil.h zlib.h zconf.h
-$   CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" -
-                uncompr.c zlib.h zconf.h
-$   CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" -
-                zutil.c zutil.h zlib.h zconf.h
-$   write sys$output "Building Zlib ..."
-$   CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ
-$   write sys$output "Building example..."
-$   CALL MAKE example.OBJ "CC ''CCOPT' example" -
-                example.c zlib.h zconf.h
-$   call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb
-$   write sys$output "Building minigzip..."
-$   CALL MAKE minigzip.OBJ "CC ''CCOPT' minigzip" -
-                minigzip.c zlib.h zconf.h
-$   call make minigzip.exe - 
-                "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" - 
-                minigzip.obj libz.olb
-$  else
-$   mms/macro=('comp')
-$  endif
-$ write sys$output "Zlib build completed"
-$ exit
-$!
-$!
-$MAKE: SUBROUTINE   !SUBROUTINE TO CHECK DEPENDENCIES
-$ V = 'F$Verify(0)
-$! P1 = What we are trying to make
-$! P2 = Command to make it
-$! P3 - P8  What it depends on
-$
-$ If F$Search(P1) .Eqs. "" Then Goto Makeit
-$ Time = F$CvTime(F$File(P1,"RDT"))
-$arg=3
-$Loop:
-$       Argument = P'arg
-$       If Argument .Eqs. "" Then Goto Exit
-$       El=0
-$Loop2:
-$       File = F$Element(El," ",Argument)
-$       If File .Eqs. " " Then Goto Endl
-$       AFile = ""
-$Loop3:
-$       OFile = AFile
-$       AFile = F$Search(File)
-$       If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl
-$       If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit
-$       Goto Loop3
-$NextEL:
-$       El = El + 1
-$       Goto Loop2
-$EndL:
-$ arg=arg+1
-$ If arg .Le. 8 Then Goto Loop
-$ Goto Exit
-$
-$Makeit:
-$ VV=F$VERIFY(0)
-$ write sys$output P2
-$ 'P2
-$ VV='F$Verify(VV)
-$Exit:
-$ If V Then Set Verify
-$ENDSUBROUTINE
diff --git a/Lib/zlib/Makefile.am b/Lib/zlib/Makefile.am
deleted file mode 100644
index 0c93862fc..000000000
--- a/Lib/zlib/Makefile.am
+++ /dev/null
@@ -1,31 +0,0 @@
-EXTRA_DIST = ChangeLog INDEX Make_vms.com Makefile.riscos README \
-	algorithm.txt descrip.mms example.c maketree.c minigzip.c zlib.3
-
-lib_LIBRARIES = libz.a
-
-libz_a_SOURCES = \
-	adler32.c \
-	compress.c \
-	crc32.c \
-	deflate.c \
-	deflate.h \
-	gzio.c \
-	infblock.c \
-	infblock.h \
-	infcodes.c \
-	infcodes.h \
-	inffast.c \
-	inffast.h \
-	inffixed.h \
-	inflate.c \
-	inftrees.c \
-	inftrees.h \
-	infutil.c \
-	infutil.h \
-	trees.c \
-	trees.h \
-	uncompr.c \
-	zconf.h \
-	zlib.h \
-	zutil.c \
-	zutil.h
diff --git a/Lib/zlib/Makefile.riscos b/Lib/zlib/Makefile.riscos
deleted file mode 100644
index d97f44923..000000000
--- a/Lib/zlib/Makefile.riscos
+++ /dev/null
@@ -1,151 +0,0 @@
-# Project:   zlib_1_03
-# Patched for zlib 1.1.2 rw@shadow.org.uk 19980430
-# test works out-of-the-box, installs `somewhere' on demand
-
-# Toolflags:
-CCflags = -c -depend !Depend -IC: -g -throwback  -DRISCOS  -fah 
-C++flags = -c -depend !Depend -IC: -throwback
-Linkflags = -aif -c++ -o $@ 
-ObjAsmflags = -throwback -NoCache -depend !Depend
-CMHGflags = 
-LibFileflags = -c -l -o $@ 
-Squeezeflags = -o $@
-
-# change the line below to where _you_ want the library installed.
-libdest = lib:zlib
-
-# Final targets:
-@.lib:   @.o.adler32 @.o.compress @.o.crc32 @.o.deflate @.o.gzio \
-        @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil @.o.trees \
-        @.o.uncompr @.o.zutil 
-        LibFile $(LibFileflags) @.o.adler32 @.o.compress @.o.crc32 @.o.deflate \
-        @.o.gzio @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil \
-        @.o.trees @.o.uncompr @.o.zutil 
-test:   @.minigzip @.example @.lib
-	@copy @.lib @.libc  A~C~DF~L~N~P~Q~RS~TV
-	@echo running tests: hang on.
-	@/@.minigzip -f -9 libc
-	@/@.minigzip -d libc-gz
-	@/@.minigzip -f -1 libc
-	@/@.minigzip -d libc-gz
-	@/@.minigzip -h -9 libc
-	@/@.minigzip -d libc-gz
-	@/@.minigzip -h -1 libc
-	@/@.minigzip -d libc-gz
-	@/@.minigzip -9 libc
-	@/@.minigzip -d libc-gz
-	@/@.minigzip -1 libc
-	@/@.minigzip -d libc-gz
-	@diff @.lib @.libc
-	@echo that should have reported '@.lib and @.libc identical' if you have diff.
-	@/@.example @.fred @.fred
-	@echo that will have given lots of hello!'s.
-
-@.minigzip:   @.o.minigzip @.lib C:o.Stubs 
-        Link $(Linkflags) @.o.minigzip @.lib C:o.Stubs 
-@.example:   @.o.example @.lib C:o.Stubs 
-        Link $(Linkflags) @.o.example @.lib C:o.Stubs
-
-install: @.lib
-	cdir $(libdest)
-	cdir $(libdest).h
-	@copy @.h.zlib $(libdest).h.zlib A~C~DF~L~N~P~Q~RS~TV
-	@copy @.h.zconf $(libdest).h.zconf A~C~DF~L~N~P~Q~RS~TV
-	@copy @.lib $(libdest).lib  A~C~DF~L~N~P~Q~RS~TV
-	@echo okay, installed zlib in $(libdest)
-
-clean:; remove @.minigzip
-	remove @.example
-	remove @.libc
-	-wipe @.o.* F~r~cV
-	remove @.fred
-
-# User-editable dependencies:
-.c.o:
-        cc $(ccflags) -o $@ $<
-
-# Static dependencies:
-
-# Dynamic dependencies:
-o.example:	c.example
-o.example:	h.zlib
-o.example:	h.zconf
-o.minigzip:	c.minigzip
-o.minigzip:	h.zlib
-o.minigzip:	h.zconf
-o.adler32:	c.adler32
-o.adler32:	h.zlib
-o.adler32:	h.zconf
-o.compress:	c.compress
-o.compress:	h.zlib
-o.compress:	h.zconf
-o.crc32:	c.crc32
-o.crc32:	h.zlib
-o.crc32:	h.zconf
-o.deflate:	c.deflate
-o.deflate:	h.deflate
-o.deflate:	h.zutil
-o.deflate:	h.zlib
-o.deflate:	h.zconf
-o.gzio:	c.gzio
-o.gzio:	h.zutil
-o.gzio:	h.zlib
-o.gzio:	h.zconf
-o.infblock:	c.infblock
-o.infblock:	h.zutil
-o.infblock:	h.zlib
-o.infblock:	h.zconf
-o.infblock:	h.infblock
-o.infblock:	h.inftrees
-o.infblock:	h.infcodes
-o.infblock:	h.infutil
-o.infcodes:	c.infcodes
-o.infcodes:	h.zutil
-o.infcodes:	h.zlib
-o.infcodes:	h.zconf
-o.infcodes:	h.inftrees
-o.infcodes:	h.infblock
-o.infcodes:	h.infcodes
-o.infcodes:	h.infutil
-o.infcodes:	h.inffast
-o.inffast:	c.inffast
-o.inffast:	h.zutil
-o.inffast:	h.zlib
-o.inffast:	h.zconf
-o.inffast:	h.inftrees
-o.inffast:	h.infblock
-o.inffast:	h.infcodes
-o.inffast:	h.infutil
-o.inffast:	h.inffast
-o.inflate:	c.inflate
-o.inflate:	h.zutil
-o.inflate:	h.zlib
-o.inflate:	h.zconf
-o.inflate:	h.infblock
-o.inftrees:	c.inftrees
-o.inftrees:	h.zutil
-o.inftrees:	h.zlib
-o.inftrees:	h.zconf
-o.inftrees:	h.inftrees
-o.inftrees:	h.inffixed
-o.infutil:	c.infutil
-o.infutil:	h.zutil
-o.infutil:	h.zlib
-o.infutil:	h.zconf
-o.infutil:	h.infblock
-o.infutil:	h.inftrees
-o.infutil:	h.infcodes
-o.infutil:	h.infutil
-o.trees:	c.trees
-o.trees:	h.deflate
-o.trees:	h.zutil
-o.trees:	h.zlib
-o.trees:	h.zconf
-o.trees:	h.trees
-o.uncompr:	c.uncompr
-o.uncompr:	h.zlib
-o.uncompr:	h.zconf
-o.zutil:	c.zutil
-o.zutil:	h.zutil
-o.zutil:	h.zlib
-o.zutil:	h.zconf
diff --git a/Lib/zlib/README b/Lib/zlib/README
deleted file mode 100644
index 8ff458799..000000000
--- a/Lib/zlib/README
+++ /dev/null
@@ -1,148 +0,0 @@
-zlib 1.1.3 is a general purpose data compression library.  All the code
-is thread safe.  The data format used by the zlib library
-is described by RFCs (Request for Comments) 1950 to 1952 in the files 
-ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate
-format) and rfc1952.txt (gzip format). These documents are also available in
-other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
-
-All functions of the compression library are documented in the file zlib.h
-(volunteer to write man pages welcome, contact jloup@gzip.org). A usage
-example of the library is given in the file example.c which also tests that
-the library is working correctly. Another example is given in the file
-minigzip.c. The compression library itself is composed of all source files
-except example.c and minigzip.c.
-
-To compile all files and run the test program, follow the instructions
-given at the top of Makefile. In short "make test; make install"
-should work for most machines. For Unix: "configure; make test; make install"
-For MSDOS, use one of the special makefiles such as Makefile.msc.
-For VMS, use Make_vms.com or descrip.mms.
-
-Questions about zlib should be sent to , or to
-Gilles Vollant  for the Windows DLL version.
-The zlib home page is http://www.cdrom.com/pub/infozip/zlib/
-The official zlib ftp site is ftp://ftp.cdrom.com/pub/infozip/zlib/
-Before reporting a problem, please check those sites to verify that
-you have the latest version of zlib; otherwise get the latest version and
-check whether the problem still exists or not.
-
-Mark Nelson  wrote an article about zlib for the Jan. 1997
-issue of  Dr. Dobb's Journal; a copy of the article is available in
-http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm
-
-The changes made in version 1.1.3 are documented in the file ChangeLog.
-The main changes since 1.1.2 are:
-
-- fix "an inflate input buffer bug that shows up on rare but persistent
-  occasions" (Mark)
-- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
-- fix gzseek(..., SEEK_SET) in write mode
-- fix crc check after a gzeek (Frank Faubert)
-- fix miniunzip when the last entry in a zip file is itself a zip file
-  (J Lillge)
-- add contrib/asm586 and contrib/asm686 (Brian Raiter)
-  See http://www.muppetlabs.com/~breadbox/software/assembly.html
-- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
-- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
-- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
-- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
-- added a FAQ file
-
-plus many changes for portability.
-
-Unsupported third party contributions are provided in directory "contrib".
-
-A Java implementation of zlib is available in the Java Development Kit 1.1
-http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html
-See the zlib home page http://www.cdrom.com/pub/infozip/zlib/ for details.
-
-A Perl interface to zlib written by Paul Marquess 
-is in the CPAN (Comprehensive Perl Archive Network) sites, such as:
-ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
-
-A Python interface to zlib written by A.M. Kuchling 
-is available in Python 1.5 and later versions, see
-http://www.python.org/doc/lib/module-zlib.html
-
-A zlib binding for TCL written by Andreas Kupries 
-is availlable at http://www.westend.com/~kupries/doc/trf/man/man.html
-
-An experimental package to read and write files in .zip format,
-written on top of zlib by Gilles Vollant , is
-available at http://www.winimage.com/zLibDll/unzip.html
-and also in the contrib/minizip directory of zlib.
-
-
-Notes for some targets:
-
-- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc
-  and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL
-  The zlib DLL support was initially done by Alessandro Iacopetti and is
-  now maintained by Gilles Vollant . Check the zlib DLL
-  home page at http://www.winimage.com/zLibDll
-
-  From Visual Basic, you can call the DLL functions which do not take
-  a structure as argument: compress, uncompress and all gz* functions.
-  See contrib/visual-basic.txt for more information, or get
-  http://www.tcfb.com/dowseware/cmp-z-it.zip
-
-- For 64-bit Irix, deflate.c must be compiled without any optimization.
-  With -O, one libpng test fails. The test works in 32 bit mode (with
-  the -n32 compiler flag). The compiler bug has been reported to SGI.
-
-- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1   
-  it works when compiled with cc.
-
-- on Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1
-  is necessary to get gzprintf working correctly. This is done by configure.
-
-- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works
-  with other compilers. Use "make test" to check your compiler.
-
-- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers.
-
-- For Turbo C the small model is supported only with reduced performance to
-  avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
-
-- For PalmOs, see http://www.cs.uit.no/~perm/PASTA/pilot/software.html
-  Per Harald Myrvang 
-
-
-Acknowledgments:
-
-  The deflate format used by zlib was defined by Phil Katz. The deflate
-  and zlib specifications were written by L. Peter Deutsch. Thanks to all the
-  people who reported problems and suggested various improvements in zlib;
-  they are too numerous to cite here.
-
-Copyright notice:
-
- (C) 1995-1998 Jean-loup Gailly and Mark Adler
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-  Jean-loup Gailly        Mark Adler
-  jloup@gzip.org          madler@alumni.caltech.edu
-
-If you use the zlib library in a product, we would appreciate *not*
-receiving lengthy legal documents to sign. The sources are provided
-for free but without warranty of any kind.  The library has been
-entirely written by Jean-loup Gailly and Mark Adler; it does not
-include third-party code.
-
-If you redistribute modified sources, we would appreciate that you include
-in the file ChangeLog history information documenting your changes.
diff --git a/Lib/zlib/adler32.c b/Lib/zlib/adler32.c
deleted file mode 100644
index 16cf9a703..000000000
--- a/Lib/zlib/adler32.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* adler32.c -- compute the Adler-32 checksum of a data stream
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* @(#) $Id$ */
-
-#include "zlib.h"
-
-#define BASE 65521L /* largest prime smaller than 65536 */
-#define NMAX 5552
-/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
-
-#define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
-#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
-#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
-#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
-#define DO16(buf)   DO8(buf,0); DO8(buf,8);
-
-/* ========================================================================= */
-uLong ZEXPORT adler32(adler, buf, len)
-    uLong adler;
-    const Bytef *buf;
-    uInt len;
-{
-    unsigned long s1 = adler & 0xffff;
-    unsigned long s2 = (adler >> 16) & 0xffff;
-    int k;
-
-    if (buf == Z_NULL) return 1L;
-
-    while (len > 0) {
-        k = len < NMAX ? len : NMAX;
-        len -= k;
-        while (k >= 16) {
-            DO16(buf);
-	    buf += 16;
-            k -= 16;
-        }
-        if (k != 0) do {
-            s1 += *buf++;
-	    s2 += s1;
-        } while (--k);
-        s1 %= BASE;
-        s2 %= BASE;
-    }
-    return (s2 << 16) | s1;
-}
diff --git a/Lib/zlib/algorithm.txt b/Lib/zlib/algorithm.txt
deleted file mode 100644
index cdc830b5d..000000000
--- a/Lib/zlib/algorithm.txt
+++ /dev/null
@@ -1,213 +0,0 @@
-1. Compression algorithm (deflate)
-
-The deflation algorithm used by gzip (also zip and zlib) is a variation of
-LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
-the input data.  The second occurrence of a string is replaced by a
-pointer to the previous string, in the form of a pair (distance,
-length).  Distances are limited to 32K bytes, and lengths are limited
-to 258 bytes. When a string does not occur anywhere in the previous
-32K bytes, it is emitted as a sequence of literal bytes.  (In this
-description, `string' must be taken as an arbitrary sequence of bytes,
-and is not restricted to printable characters.)
-
-Literals or match lengths are compressed with one Huffman tree, and
-match distances are compressed with another tree. The trees are stored
-in a compact form at the start of each block. The blocks can have any
-size (except that the compressed data for one block must fit in
-available memory). A block is terminated when deflate() determines that
-it would be useful to start another block with fresh trees. (This is
-somewhat similar to the behavior of LZW-based _compress_.)
-
-Duplicated strings are found using a hash table. All input strings of
-length 3 are inserted in the hash table. A hash index is computed for
-the next 3 bytes. If the hash chain for this index is not empty, all
-strings in the chain are compared with the current input string, and
-the longest match is selected.
-
-The hash chains are searched starting with the most recent strings, to
-favor small distances and thus take advantage of the Huffman encoding.
-The hash chains are singly linked. There are no deletions from the
-hash chains, the algorithm simply discards matches that are too old.
-
-To avoid a worst-case situation, very long hash chains are arbitrarily
-truncated at a certain length, determined by a runtime option (level
-parameter of deflateInit). So deflate() does not always find the longest
-possible match but generally finds a match which is long enough.
-
-deflate() also defers the selection of matches with a lazy evaluation
-mechanism. After a match of length N has been found, deflate() searches for
-a longer match at the next input byte. If a longer match is found, the
-previous match is truncated to a length of one (thus producing a single
-literal byte) and the process of lazy evaluation begins again. Otherwise,
-the original match is kept, and the next match search is attempted only N
-steps later.
-
-The lazy match evaluation is also subject to a runtime parameter. If
-the current match is long enough, deflate() reduces the search for a longer
-match, thus speeding up the whole process. If compression ratio is more
-important than speed, deflate() attempts a complete second search even if
-the first match is already long enough.
-
-The lazy match evaluation is not performed for the fastest compression
-modes (level parameter 1 to 3). For these fast modes, new strings
-are inserted in the hash table only when no match was found, or
-when the match is not too long. This degrades the compression ratio
-but saves time since there are both fewer insertions and fewer searches.
-
-
-2. Decompression algorithm (inflate)
-
-2.1 Introduction
-
-The real question is, given a Huffman tree, how to decode fast.  The most
-important realization is that shorter codes are much more common than
-longer codes, so pay attention to decoding the short codes fast, and let
-the long codes take longer to decode.
-
-inflate() sets up a first level table that covers some number of bits of
-input less than the length of longest code.  It gets that many bits from the
-stream, and looks it up in the table.  The table will tell if the next
-code is that many bits or less and how many, and if it is, it will tell
-the value, else it will point to the next level table for which inflate()
-grabs more bits and tries to decode a longer code.
-
-How many bits to make the first lookup is a tradeoff between the time it
-takes to decode and the time it takes to build the table.  If building the
-table took no time (and if you had infinite memory), then there would only
-be a first level table to cover all the way to the longest code.  However,
-building the table ends up taking a lot longer for more bits since short
-codes are replicated many times in such a table.  What inflate() does is
-simply to make the number of bits in the first table a variable, and set it
-for the maximum speed.
-
-inflate() sends new trees relatively often, so it is possibly set for a
-smaller first level table than an application that has only one tree for
-all the data.  For inflate, which has 286 possible codes for the
-literal/length tree, the size of the first table is nine bits.  Also the
-distance trees have 30 possible values, and the size of the first table is
-six bits.  Note that for each of those cases, the table ended up one bit
-longer than the ``average'' code length, i.e. the code length of an
-approximately flat code which would be a little more than eight bits for
-286 symbols and a little less than five bits for 30 symbols.  It would be
-interesting to see if optimizing the first level table for other
-applications gave values within a bit or two of the flat code size.
-
-
-2.2 More details on the inflate table lookup
-
-Ok, you want to know what this cleverly obfuscated inflate tree actually  
-looks like.  You are correct that it's not a Huffman tree.  It is simply a  
-lookup table for the first, let's say, nine bits of a Huffman symbol.  The  
-symbol could be as short as one bit or as long as 15 bits.  If a particular  
-symbol is shorter than nine bits, then that symbol's translation is duplicated
-in all those entries that start with that symbol's bits.  For example, if the  
-symbol is four bits, then it's duplicated 32 times in a nine-bit table.  If a  
-symbol is nine bits long, it appears in the table once.
-
-If the symbol is longer than nine bits, then that entry in the table points  
-to another similar table for the remaining bits.  Again, there are duplicated  
-entries as needed.  The idea is that most of the time the symbol will be short
-and there will only be one table look up.  (That's whole idea behind data  
-compression in the first place.)  For the less frequent long symbols, there  
-will be two lookups.  If you had a compression method with really long  
-symbols, you could have as many levels of lookups as is efficient.  For  
-inflate, two is enough.
-
-So a table entry either points to another table (in which case nine bits in  
-the above example are gobbled), or it contains the translation for the symbol  
-and the number of bits to gobble.  Then you start again with the next  
-ungobbled bit.
-
-You may wonder: why not just have one lookup table for how ever many bits the  
-longest symbol is?  The reason is that if you do that, you end up spending  
-more time filling in duplicate symbol entries than you do actually decoding.   
-At least for deflate's output that generates new trees every several 10's of  
-kbytes.  You can imagine that filling in a 2^15 entry table for a 15-bit code  
-would take too long if you're only decoding several thousand symbols.  At the  
-other extreme, you could make a new table for every bit in the code.  In fact,
-that's essentially a Huffman tree.  But then you spend two much time  
-traversing the tree while decoding, even for short symbols.
-
-So the number of bits for the first lookup table is a trade of the time to  
-fill out the table vs. the time spent looking at the second level and above of
-the table.
-
-Here is an example, scaled down:
-
-The code being decoded, with 10 symbols, from 1 to 6 bits long:
-
-A: 0
-B: 10
-C: 1100
-D: 11010
-E: 11011
-F: 11100
-G: 11101
-H: 11110
-I: 111110
-J: 111111
-
-Let's make the first table three bits long (eight entries):
-
-000: A,1
-001: A,1
-010: A,1
-011: A,1
-100: B,2
-101: B,2
-110: -> table X (gobble 3 bits)
-111: -> table Y (gobble 3 bits)
-
-Each entry is what the bits decode to and how many bits that is, i.e. how  
-many bits to gobble.  Or the entry points to another table, with the number of
-bits to gobble implicit in the size of the table.
-
-Table X is two bits long since the longest code starting with 110 is five bits
-long:
-
-00: C,1
-01: C,1
-10: D,2
-11: E,2
-
-Table Y is three bits long since the longest code starting with 111 is six  
-bits long:
-
-000: F,2
-001: F,2
-010: G,2
-011: G,2
-100: H,2
-101: H,2
-110: I,3
-111: J,3
-
-So what we have here are three tables with a total of 20 entries that had to  
-be constructed.  That's compared to 64 entries for a single table.  Or  
-compared to 16 entries for a Huffman tree (six two entry tables and one four  
-entry table).  Assuming that the code ideally represents the probability of  
-the symbols, it takes on the average 1.25 lookups per symbol.  That's compared
-to one lookup for the single table, or 1.66 lookups per symbol for the  
-Huffman tree.
-
-There, I think that gives you a picture of what's going on.  For inflate, the  
-meaning of a particular symbol is often more than just a letter.  It can be a  
-byte (a "literal"), or it can be either a length or a distance which  
-indicates a base value and a number of bits to fetch after the code that is  
-added to the base value.  Or it might be the special end-of-block code.  The  
-data structures created in inftrees.c try to encode all that information  
-compactly in the tables.
-
-
-Jean-loup Gailly        Mark Adler
-jloup@gzip.org          madler@alumni.caltech.edu
-
-
-References:
-
-[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data
-Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3,
-pp. 337-343.
-
-``DEFLATE Compressed Data Format Specification'' available in
-ftp://ds.internic.net/rfc/rfc1951.txt
diff --git a/Lib/zlib/amiga/Makefile.pup b/Lib/zlib/amiga/Makefile.pup
deleted file mode 100644
index 6cfad1dc0..000000000
--- a/Lib/zlib/amiga/Makefile.pup
+++ /dev/null
@@ -1,66 +0,0 @@
-# Amiga powerUP (TM) Makefile
-# makefile for libpng and SAS C V6.58/7.00 PPC compiler
-# Copyright (C) 1998 by Andreas R. Kleinert
-
-CC       = scppc
-CFLAGS   = NOSTKCHK NOSINT OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL \
-           OPTLOOP OPTRDEP=8 OPTDEP=8 OPTCOMP=8
-LIBNAME  = libzip.a
-AR       = ppc-amigaos-ar
-AR_FLAGS = cr
-RANLIB   = ppc-amigaos-ranlib
-LDFLAGS  = -r -o
-LDLIBS   = LIB:scppc.a
-LN       = ppc-amigaos-ld
-RM       = delete quiet
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-all: example minigzip
-
-test: all
-        example
-        echo hello world | minigzip | minigzip -d
-
-$(LIBNAME): $(OBJS)
-            $(AR) $(AR_FLAGS) $@ $(OBJS)
-            $(RANLIB) $@
-
-example: example.o $(LIBNAME)
-        $(LN) $(LDFLAGS) example LIB:c_ppc.o example.o $(LIBNAME) $(LDLIBS) LIB:end.o
-
-minigzip: minigzip.o $(LIBNAME)
-        $(LN) $(LDFLAGS) minigzip LIB:c_ppc.o minigzip.o $(LIBNAME) $(LDLIBS) LIB:end.o
-
-clean:
-        $(RM) *.o example minigzip $(LIBNAME) foo.gz
-
-zip:
-        zip -ul9 zlib README ChangeLog Makefile Make????.??? Makefile.?? \
-          descrip.mms *.[ch]
-
-tgz:
-        cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \
-          zlib/Make????.??? zlib/Makefile.?? zlib/descrip.mms zlib/*.[ch]
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
-
-adler32.o: zutil.h zlib.h zconf.h
-compress.o: zlib.h zconf.h
-crc32.o: zutil.h zlib.h zconf.h
-deflate.o: deflate.h zutil.h zlib.h zconf.h
-example.o: zlib.h zconf.h
-gzio.o: zutil.h zlib.h zconf.h
-infblock.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
-infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h
-inffast.o: zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
-inflate.o: zutil.h zlib.h zconf.h infblock.h
-inftrees.o: zutil.h zlib.h zconf.h inftrees.h
-infutil.o: zutil.h zlib.h zconf.h inftrees.h infutil.h
-minigzip.o: zlib.h zconf.h
-trees.o: deflate.h zutil.h zlib.h zconf.h
-uncompr.o: zlib.h zconf.h
-zutil.o: zutil.h zlib.h zconf.h
diff --git a/Lib/zlib/amiga/Makefile.sas b/Lib/zlib/amiga/Makefile.sas
deleted file mode 100644
index 5323e8217..000000000
--- a/Lib/zlib/amiga/Makefile.sas
+++ /dev/null
@@ -1,64 +0,0 @@
-# SMakefile for zlib
-# Modified from the standard UNIX Makefile Copyright Jean-loup Gailly
-# Osma Ahvenlampi 
-# Amiga, SAS/C 6.56 & Smake
-
-CC=sc
-CFLAGS=OPT
-#CFLAGS=OPT CPU=68030
-#CFLAGS=DEBUG=LINE
-LDFLAGS=LIB z.lib
-
-SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \
-       NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX 
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-all: SCOPTIONS example minigzip
-
-test: all
-	`cd`/example
-	echo hello world | minigzip | minigzip -d 
-
-install: z.lib
-	copy zlib.h zconf.h INCLUDE: clone
-	copy z.lib LIB: clone
-
-z.lib: $(OBJS)
-	oml z.lib r $(OBJS)
-
-example: example.o z.lib
-	$(CC) $(CFLAGS) LINK TO $@ example.o $(LDFLAGS)
-
-minigzip: minigzip.o z.lib
-	$(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS)
-
-clean:
-	-delete force quiet *.o example minigzip z.lib foo.gz *.lnk SCOPTIONS
-
-SCOPTIONS: Smakefile
-        copy to $@  64K on 16-bit machine: */
-    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
-#endif
-    stream.next_out = dest;
-    stream.avail_out = (uInt)*destLen;
-    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
-
-    stream.zalloc = (alloc_func)0;
-    stream.zfree = (free_func)0;
-    stream.opaque = (voidpf)0;
-
-    err = deflateInit(&stream, level);
-    if (err != Z_OK) return err;
-
-    err = deflate(&stream, Z_FINISH);
-    if (err != Z_STREAM_END) {
-        deflateEnd(&stream);
-        return err == Z_OK ? Z_BUF_ERROR : err;
-    }
-    *destLen = stream.total_out;
-
-    err = deflateEnd(&stream);
-    return err;
-}
-
-/* ===========================================================================
- */
-int ZEXPORT compress (dest, destLen, source, sourceLen)
-    Bytef *dest;
-    uLongf *destLen;
-    const Bytef *source;
-    uLong sourceLen;
-{
-    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
-}
diff --git a/Lib/zlib/configure b/Lib/zlib/configure
deleted file mode 100755
index 82eadd628..000000000
--- a/Lib/zlib/configure
+++ /dev/null
@@ -1,214 +0,0 @@
-#!/bin/sh
-# configure script for zlib. This script is needed only if
-# you wish to build a shared library and your system supports them,
-# of if you need special compiler, flags or install directory.
-# Otherwise, you can just use directly "make test; make install"
-#
-# To create a shared library, use "configure --shared"; by default a static
-# library is created. If the primitive shared library support provided here
-# does not work, use ftp://prep.ai.mit.edu/pub/gnu/libtool-*.tar.gz
-#
-# To impose specific compiler or flags or install directory, use for example:
-#    prefix=$HOME CC=cc CFLAGS="-O4" ./configure
-# or for csh/tcsh users:
-#    (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure)
-# LDSHARED is the command to be used to create a shared library
-
-# Incorrect settings of CC or CFLAGS may prevent creating a shared library.
-# If you have problems, try without defining CC and CFLAGS before reporting
-# an error.
-
-LIBS=libz.a
-SHAREDLIB=libz.so
-VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`
-AR=${AR-"ar rc"}
-RANLIB=${RANLIB-"ranlib"}
-prefix=${prefix-/usr/local}
-exec_prefix=${exec_prefix-'${prefix}'}
-libdir=${libdir-'${exec_prefix}/lib'}
-includedir=${includedir-'${prefix}/include'}
-shared_ext='.so'
-shared=0
-gcc=0
-old_cc="$CC"
-old_cflags="$CFLAGS"
-
-while test $# -ge 1
-do
-case "$1" in
-    -p*=* | --p*=*) prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
-    -e*=* | --e*=*) exec_prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
-    -l*=* | --libdir=*) libdir=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
-    -i*=* | --includedir=*) includedir=`echo $1 | sed 's/[-a-z_]*=//'`;shift;;
-    -p* | --p*) prefix="$2"; shift; shift;;
-    -e* | --e*) exec_prefix="$2"; shift; shift;;
-    -l* | --l*) libdir="$2"; shift; shift;;
-    -i* | --i*) includedir="$2"; shift; shift;;
-    -sh* | --sh*) shared=1; shift;;
-    --src*) shift;;
-    --c*) shift;;
-    *)
-      echo 'usage:'
-      echo '  configure [--shared] [--prefix=PREFIX]  [--exec_prefix=EXPREFIX]'
-      echo '     [--libdir=LIBDIR] [--includedir=INCLUDEDIR]'
-        exit 0;;
-    esac
-done
-
-test=ztest$$
-cat > $test.c </dev/null; then
-  CC="$cc"
-  SFLAGS=${CFLAGS-"-fPIC -O3"}
-  CFLAGS="$cflags"
-  case `(uname -s || echo unknown) 2>/dev/null` in
-  Linux | linux) LDSHARED=${LDSHARED-"gcc -shared -Wl,-soname,libz.so.1"};;
-  *)             LDSHARED=${LDSHARED-"gcc -shared"};;
-  esac
-else
-  # find system name and corresponding cc options
-  CC=${CC-cc}
-  case `(uname -sr || echo unknown) 2>/dev/null` in
-  HP-UX*)    SFLAGS=${CFLAGS-"-O +z"}
-	     CFLAGS=${CFLAGS-"-O"}
-#	     LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"}
-	     LDSHARED=${LDSHARED-"ld -b"}
-	     shared_ext='.sl'
-	     SHAREDLIB='libz.sl';;
-  IRIX*)     SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."}
-	     CFLAGS=${CFLAGS-"-ansi -O2"}
-	     LDSHARED=${LDSHARED-"cc -shared"};;
-  OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"}
-	     CFLAGS=${CFLAGS-"-O -std1"}
-	     LDSHARED=${LDSHARED-"cc -shared  -Wl,-soname,$SHAREDLIB -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};;
-  OSF1*)     SFLAGS=${CFLAGS-"-O -std1"}
-	     CFLAGS=${CFLAGS-"-O -std1"}
-	     LDSHARED=${LDSHARED-"cc -shared"};;
-  QNX*)      SFLAGS=${CFLAGS-"-4 -O"}
-             CFLAGS=${CFLAGS-"-4 -O"}
-	     LDSHARED=${LDSHARED-"cc"}
-             RANLIB=${RANLIB-"true"}
-             AR="cc -A";;
-  SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "}
-	     CFLAGS=${CFLAGS-"-O3"}
-	     LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};;
-  SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."}
-             CFLAGS=${CFLAGS-"-fast -xcg89"}
-	     LDSHARED=${LDSHARED-"cc -G"};;
-  SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"}
-	     CFLAGS=${CFLAGS-"-O2"}
-	     LDSHARED=${LDSHARED-"ld"};;
-  UNIX_System_V\ 4.2.0) 
-	     SFLAGS=${CFLAGS-"-KPIC -O"}
-	     CFLAGS=${CFLAGS-"-O"}
-	     LDSHARED=${LDSHARED-"cc -G"};;
-  UNIX_SV\ 4.2MP)
-	     SFLAGS=${CFLAGS-"-Kconform_pic -O"}
-	     CFLAGS=${CFLAGS-"-O"}
-	     LDSHARED=${LDSHARED-"cc -G"};;
-  # send working options for other systems to support@gzip.org
-  *)         SFLAGS=${CFLAGS-"-O"}
-	     CFLAGS=${CFLAGS-"-O"}
-	     LDSHARED=${LDSHARED-"cc -shared"};;
-  esac
-fi
-
-if test $shared -eq 1; then
-  echo Checking for shared library support...
-  # we must test in two steps (cc then ld), required at least on SunOS 4.x
-  if test "`($CC -c $SFLAGS $test.c) 2>&1`" = "" &&
-     test "`($LDSHARED -o $test$shared_ext $test.o) 2>&1`" = ""; then
-    CFLAGS="$SFLAGS"
-    LIBS="$SHAREDLIB.$VER"
-    echo Building shared library $SHAREDLIB.$VER with $CC.
-  elif test -z "$old_cc" -a -z "$old_cflags"; then
-    echo No shared library suppport.
-    shared=0;
-  else
-    echo 'No shared library suppport; try without defining CC and CFLAGS'
-    shared=0;
-  fi
-fi
-if test $shared -eq 0; then
-  LDSHARED="$CC"
-  echo Building static library $LIBS version $VER with $CC.
-fi
-
-cat > $test.c <
-int main() { return 0; }
-EOF
-if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
-  CFLAGS="$CFLAGS -DHAVE_UNISTD_H"
-  echo "Checking for unistd.h... Yes."
-else
-  echo "Checking for unistd.h... No."
-fi
-
-cat > $test.c <
-int main() { return 0; }
-EOF
-if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
-  echo "Checking for errno.h...	 Yes."
-else
-  echo "Checking for errno.h...	 No."
-  CFLAGS="$CFLAGS -DNO_ERRNO_H"
-fi
-
-cat > $test.c <
-#include 
-#include 
-caddr_t hello() {
-  return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0); 
-}
-EOF
-if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
-  CFLAGS="$CFLAGS -DUSE_MMAP"
-  echo Checking for mmap support... Yes.
-else
-  echo Checking for mmap support... No.
-fi
-
-CPP=${CPP-"$CC -E"}
-case $CFLAGS in
-  *ASMV*)
-    if test "`nm $test.o | grep _hello`" = ""; then
-      CPP="$CPP -DNO_UNDERLINE"
-      echo Checking for underline in external names... No.
-    else
-      echo Checking for underline in external names... Yes.
-    fi;;
-esac
-
-rm -f $test.[co] $test$shared_ext
-
-# udpate Makefile
-sed < Makefile.in "
-/^CC *=/s%=.*%=$CC%
-/^CFLAGS *=/s%=.*%=$CFLAGS%
-/^CPP *=/s%=.*%=$CPP%
-/^LDSHARED *=/s%=.*%=$LDSHARED%
-/^LIBS *=/s%=.*%=$LIBS%
-/^SHAREDLIB *=/s%=.*%=$SHAREDLIB%
-/^AR *=/s%=.*%=$AR%
-/^RANLIB *=/s%=.*%=$RANLIB%
-/^VER *=/s%=.*%=$VER%
-/^prefix *=/s%=.*%=$prefix%
-/^exec_prefix *=/s%=.*%=$exec_prefix%
-/^libdir *=/s%=.*%=$libdir%
-/^includedir *=/s%=.*%=$includedir%
-" > Makefile
diff --git a/Lib/zlib/contrib/README.contrib b/Lib/zlib/contrib/README.contrib
deleted file mode 100644
index 7ad191cf5..000000000
--- a/Lib/zlib/contrib/README.contrib
+++ /dev/null
@@ -1,34 +0,0 @@
-All files under this contrib directory are UNSUPPORTED. There were
-provided by users of zlib and were not tested by the authors of zlib.
-Use at your own risk. Please contact the authors of the contributions
-for help about these, not the zlib authors. Thanks.
-
-
-asm386/     by Gilles Vollant 
-	386 asm code replacing longest_match(), for Visual C++ 4.2 and ML 6.11c
-
-asm586/ and asm686/    by Brian Raiter  
-        asm code for Pentium and Pentium Pro
-        See http://www.muppetlabs.com/~breadbox/software/assembly.html
-
-delphi/      by Bob Dellaca 
-	Support for Delphi
-
-delphi2/     by Davide Moretti 
-        Another support for C++Builder and Delphi
-
-minizip/    by Gilles Vollant 
-	Mini zip and unzip based on zlib
-        See http://www.winimage.com/zLibDll/unzip.html
-
-iostream/   by Kevin Ruland 
-        A C++ I/O streams interface to the zlib gz* functions
-
-iostream2/  by Tyge Løvset 
-	Another C++ I/O streams interface
-
-untgz/      by "Pedro A. Aranda Guti\irrez" 
-	A very simple tar.gz file extractor using zlib
-
-visual-basic.txt by Carlos Rios 
-        How to use compress(), uncompress() and the gz* functions from VB.
diff --git a/Lib/zlib/contrib/asm386/gvmat32.asm b/Lib/zlib/contrib/asm386/gvmat32.asm
deleted file mode 100644
index 28d527f47..000000000
--- a/Lib/zlib/contrib/asm386/gvmat32.asm
+++ /dev/null
@@ -1,559 +0,0 @@
-;
-; gvmat32.asm -- Asm portion of the optimized longest_match for 32 bits x86
-; Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
-; File written by Gilles Vollant, by modifiying the longest_match
-;  from Jean-loup Gailly in deflate.c
-; It need wmask == 0x7fff
-;     (assembly code is faster with a fixed wmask)
-;
-; For Visual C++ 4.2 and ML 6.11c (version in directory \MASM611C of Win95 DDK)
-;   I compile with : "ml /coff /Zi /c gvmat32.asm"
-;
-
-;uInt longest_match_7fff(s, cur_match)
-;    deflate_state *s;
-;    IPos cur_match;                             /* current match */
-
-        NbStack         equ     76
-        cur_match       equ     dword ptr[esp+NbStack-0]
-        str_s           equ     dword ptr[esp+NbStack-4]
-; 5 dword on top (ret,ebp,esi,edi,ebx)
-        adrret          equ     dword ptr[esp+NbStack-8]
-        pushebp         equ     dword ptr[esp+NbStack-12]
-        pushedi         equ     dword ptr[esp+NbStack-16]
-        pushesi         equ     dword ptr[esp+NbStack-20]
-        pushebx         equ     dword ptr[esp+NbStack-24]
-
-        chain_length    equ     dword ptr [esp+NbStack-28]
-        limit           equ     dword ptr [esp+NbStack-32]
-        best_len        equ     dword ptr [esp+NbStack-36]
-        window          equ     dword ptr [esp+NbStack-40]
-        prev            equ     dword ptr [esp+NbStack-44]
-        scan_start      equ      word ptr [esp+NbStack-48]
-        wmask           equ     dword ptr [esp+NbStack-52]
-        match_start_ptr equ     dword ptr [esp+NbStack-56]
-        nice_match      equ     dword ptr [esp+NbStack-60]
-        scan            equ     dword ptr [esp+NbStack-64]
-
-        windowlen       equ     dword ptr [esp+NbStack-68]
-        match_start     equ     dword ptr [esp+NbStack-72]
-        strend          equ     dword ptr [esp+NbStack-76]
-        NbStackAdd      equ     (NbStack-24)
-
-    .386p
-
-    name    gvmatch
-    .MODEL  FLAT
-
-
-
-;  all the +4 offsets are due to the addition of pending_buf_size (in zlib
-;  in the deflate_state structure since the asm code was first written
-;  (if you compile with zlib 1.0.4 or older, remove the +4).
-;  Note : these value are good with a 8 bytes boundary pack structure
-    dep_chain_length    equ     70h+4
-    dep_window          equ     2ch+4
-    dep_strstart        equ     60h+4
-    dep_prev_length     equ     6ch+4
-    dep_nice_match      equ     84h+4
-    dep_w_size          equ     20h+4
-    dep_prev            equ     34h+4
-    dep_w_mask          equ     28h+4
-    dep_good_match      equ     80h+4
-    dep_match_start     equ     64h+4
-    dep_lookahead       equ     68h+4
-
-
-_TEXT                   segment
-
-IFDEF NOUNDERLINE
-                        public  longest_match_7fff
-;                        public  match_init
-ELSE
-                        public  _longest_match_7fff
-;                        public  _match_init
-ENDIF
-
-    MAX_MATCH           equ     258
-    MIN_MATCH           equ     3
-    MIN_LOOKAHEAD       equ     (MAX_MATCH+MIN_MATCH+1)
-
-
-
-IFDEF NOUNDERLINE
-;match_init      proc near
-;                ret
-;match_init      endp
-ELSE
-;_match_init     proc near
-;                ret
-;_match_init     endp
-ENDIF
-
-
-IFDEF NOUNDERLINE
-longest_match_7fff   proc near
-ELSE
-_longest_match_7fff  proc near
-ENDIF
-
-        mov     edx,[esp+4]
-
-
-
-        push    ebp
-        push    edi
-        push    esi
-        push    ebx
-
-        sub     esp,NbStackAdd
-
-; initialize or check the variables used in match.asm.
-        mov     ebp,edx
-
-; chain_length = s->max_chain_length
-; if (prev_length>=good_match) chain_length >>= 2
-        mov     edx,[ebp+dep_chain_length]
-        mov     ebx,[ebp+dep_prev_length]
-        cmp     [ebp+dep_good_match],ebx
-        ja      noshr
-        shr     edx,2
-noshr:
-; we increment chain_length because in the asm, the --chain_lenght is in the beginning of the loop
-        inc     edx
-        mov     edi,[ebp+dep_nice_match]
-        mov     chain_length,edx
-        mov     eax,[ebp+dep_lookahead]
-        cmp     eax,edi
-; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
-        jae     nolookaheadnicematch
-        mov     edi,eax
-nolookaheadnicematch:
-; best_len = s->prev_length
-        mov     best_len,ebx
-
-; window = s->window
-        mov     esi,[ebp+dep_window]
-        mov     ecx,[ebp+dep_strstart]
-        mov     window,esi
-
-        mov     nice_match,edi
-; scan = window + strstart
-        add     esi,ecx
-        mov     scan,esi
-; dx = *window
-        mov     dx,word ptr [esi]
-; bx = *(window+best_len-1)
-        mov     bx,word ptr [esi+ebx-1]
-        add     esi,MAX_MATCH-1
-; scan_start = *scan
-        mov     scan_start,dx
-; strend = scan + MAX_MATCH-1
-        mov     strend,esi
-; bx = scan_end = *(window+best_len-1)
-
-;    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
-;        s->strstart - (IPos)MAX_DIST(s) : NIL;
-
-        mov     esi,[ebp+dep_w_size]
-        sub     esi,MIN_LOOKAHEAD
-; here esi = MAX_DIST(s)
-        sub     ecx,esi
-        ja      nodist
-        xor     ecx,ecx
-nodist:
-        mov     limit,ecx
-
-; prev = s->prev
-        mov     edx,[ebp+dep_prev]
-        mov     prev,edx
-
-;
-        mov     edx,dword ptr [ebp+dep_match_start]
-        mov     bp,scan_start
-        mov     eax,cur_match
-        mov     match_start,edx
-
-        mov     edx,window
-        mov     edi,edx
-        add     edi,best_len
-        mov     esi,prev
-        dec     edi
-; windowlen = window + best_len -1
-        mov     windowlen,edi
-
-        jmp     beginloop2
-        align   4
-
-; here, in the loop
-;       eax = ax = cur_match
-;       ecx = limit
-;        bx = scan_end
-;        bp = scan_start
-;       edi = windowlen (window + best_len -1)
-;       esi = prev
-
-
-;// here; chain_length <=16
-normalbeg0add16:
-        add     chain_length,16
-        jz      exitloop
-normalbeg0:
-        cmp     word ptr[edi+eax],bx
-        je      normalbeg2noroll
-rcontlabnoroll:
-; cur_match = prev[cur_match & wmask]
-        and     eax,7fffh
-        mov     ax,word ptr[esi+eax*2]
-; if cur_match > limit, go to exitloop
-        cmp     ecx,eax
-        jnb     exitloop
-; if --chain_length != 0, go to exitloop
-        dec     chain_length
-        jnz     normalbeg0
-        jmp     exitloop
-
-normalbeg2noroll:
-; if (scan_start==*(cur_match+window)) goto normalbeg2
-        cmp     bp,word ptr[edx+eax]
-        jne     rcontlabnoroll
-        jmp     normalbeg2
-
-contloop3:
-        mov     edi,windowlen
-
-; cur_match = prev[cur_match & wmask]
-        and     eax,7fffh
-        mov     ax,word ptr[esi+eax*2]
-; if cur_match > limit, go to exitloop
-        cmp     ecx,eax
-jnbexitloopshort1:
-        jnb     exitloop
-; if --chain_length != 0, go to exitloop
-
-
-; begin the main loop
-beginloop2:
-        sub     chain_length,16+1
-; if chain_length <=16, don't use the unrolled loop
-        jna     normalbeg0add16
-
-do16:
-        cmp     word ptr[edi+eax],bx
-        je      normalbeg2dc0
-
-maccn   MACRO   lab
-        and     eax,7fffh
-        mov     ax,word ptr[esi+eax*2]
-        cmp     ecx,eax
-        jnb     exitloop
-        cmp     word ptr[edi+eax],bx
-        je      lab
-        ENDM
-
-rcontloop0:
-        maccn   normalbeg2dc1
-
-rcontloop1:
-        maccn   normalbeg2dc2
-
-rcontloop2:
-        maccn   normalbeg2dc3
-
-rcontloop3:
-        maccn   normalbeg2dc4
-
-rcontloop4:
-        maccn   normalbeg2dc5
-
-rcontloop5:
-        maccn   normalbeg2dc6
-
-rcontloop6:
-        maccn   normalbeg2dc7
-
-rcontloop7:
-        maccn   normalbeg2dc8
-
-rcontloop8:
-        maccn   normalbeg2dc9
-
-rcontloop9:
-        maccn   normalbeg2dc10
-
-rcontloop10:
-        maccn   short normalbeg2dc11
-
-rcontloop11:
-        maccn   short normalbeg2dc12
-
-rcontloop12:
-        maccn   short normalbeg2dc13
-
-rcontloop13:
-        maccn   short normalbeg2dc14
-
-rcontloop14:
-        maccn   short normalbeg2dc15
-
-rcontloop15:
-        and     eax,7fffh
-        mov     ax,word ptr[esi+eax*2]
-        cmp     ecx,eax
-        jnb     exitloop
-
-        sub     chain_length,16
-        ja      do16
-        jmp     normalbeg0add16
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-normbeg MACRO   rcontlab,valsub
-; if we are here, we know that *(match+best_len-1) == scan_end
-        cmp     bp,word ptr[edx+eax]
-; if (match != scan_start) goto rcontlab
-        jne     rcontlab
-; calculate the good chain_length, and we'll compare scan and match string
-        add     chain_length,16-valsub
-        jmp     iseq
-        ENDM
-
-
-normalbeg2dc11:
-        normbeg rcontloop11,11
-
-normalbeg2dc12:
-        normbeg short rcontloop12,12
-
-normalbeg2dc13:
-        normbeg short rcontloop13,13
-
-normalbeg2dc14:
-        normbeg short rcontloop14,14
-
-normalbeg2dc15:
-        normbeg short rcontloop15,15
-
-normalbeg2dc10:
-        normbeg rcontloop10,10
-
-normalbeg2dc9:
-        normbeg rcontloop9,9
-
-normalbeg2dc8:
-        normbeg rcontloop8,8
-
-normalbeg2dc7:
-        normbeg rcontloop7,7
-
-normalbeg2dc6:
-        normbeg rcontloop6,6
-
-normalbeg2dc5:
-        normbeg rcontloop5,5
-
-normalbeg2dc4:
-        normbeg rcontloop4,4
-
-normalbeg2dc3:
-        normbeg rcontloop3,3
-
-normalbeg2dc2:
-        normbeg rcontloop2,2
-
-normalbeg2dc1:
-        normbeg rcontloop1,1
-
-normalbeg2dc0:
-        normbeg rcontloop0,0
-
-
-; we go in normalbeg2 because *(ushf*)(match+best_len-1) == scan_end
-
-normalbeg2:
-        mov     edi,window
-
-        cmp     bp,word ptr[edi+eax]
-        jne     contloop3                   ; if *(ushf*)match != scan_start, continue
-
-iseq:
-; if we are here, we know that *(match+best_len-1) == scan_end
-; and (match == scan_start)
-
-        mov     edi,edx
-        mov     esi,scan                    ; esi = scan
-        add     edi,eax                     ; edi = window + cur_match = match
-
-        mov     edx,[esi+3]                 ; compare manually dword at match+3
-        xor     edx,[edi+3]                 ; and scan +3
-
-        jz      begincompare                ; if equal, go to long compare
-
-; we will determine the unmatch byte and calculate len (in esi)
-        or      dl,dl
-        je      eq1rr
-        mov     esi,3
-        jmp     trfinval
-eq1rr:
-        or      dx,dx
-        je      eq1
-
-        mov     esi,4
-        jmp     trfinval
-eq1:
-        and     edx,0ffffffh
-        jz      eq11
-        mov     esi,5
-        jmp     trfinval
-eq11:
-        mov     esi,6
-        jmp     trfinval
-
-begincompare:
-        ; here we now scan and match begin same
-        add     edi,6
-        add     esi,6
-        mov     ecx,(MAX_MATCH-(2+4))/4     ; scan for at most MAX_MATCH bytes
-        repe    cmpsd                       ; loop until mismatch
-
-        je      trfin                       ; go to trfin if not unmatch
-; we determine the unmatch byte
-        sub     esi,4
-        mov     edx,[edi-4]
-        xor     edx,[esi]
-
-        or      dl,dl
-        jnz     trfin
-        inc     esi
-
-        or      dx,dx
-        jnz     trfin
-        inc     esi
-
-        and     edx,0ffffffh
-        jnz     trfin
-        inc     esi
-
-trfin:
-        sub     esi,scan          ; esi = len
-trfinval:
-; here we have finised compare, and esi contain len of equal string
-        cmp     esi,best_len        ; if len > best_len, go newbestlen
-        ja      short newbestlen
-; now we restore edx, ecx and esi, for the big loop
-        mov     esi,prev
-        mov     ecx,limit
-        mov     edx,window
-        jmp     contloop3
-
-newbestlen:
-        mov     best_len,esi        ; len become best_len
-
-        mov     match_start,eax     ; save new position as match_start
-        cmp     esi,nice_match      ; if best_len >= nice_match, exit
-        jae     exitloop
-        mov     ecx,scan
-        mov     edx,window          ; restore edx=window
-        add     ecx,esi
-        add     esi,edx
-
-        dec     esi
-        mov     windowlen,esi       ; windowlen = window + best_len-1
-        mov     bx,[ecx-1]          ; bx = *(scan+best_len-1) = scan_end
-
-; now we restore ecx and esi, for the big loop :
-        mov     esi,prev
-        mov     ecx,limit
-        jmp     contloop3
-
-exitloop:
-; exit : s->match_start=match_start
-        mov     ebx,match_start
-        mov     ebp,str_s
-        mov     ecx,best_len
-        mov     dword ptr [ebp+dep_match_start],ebx        
-        mov     eax,dword ptr [ebp+dep_lookahead]
-        cmp     ecx,eax
-        ja      minexlo
-        mov     eax,ecx
-minexlo:
-; return min(best_len,s->lookahead)
-        
-; restore stack and register ebx,esi,edi,ebp
-        add     esp,NbStackAdd
-
-        pop     ebx
-        pop     esi
-        pop     edi
-        pop     ebp
-        ret
-InfoAuthor:
-; please don't remove this string !
-; Your are free use gvmat32 in any fre or commercial apps if you don't remove the string in the binary!
-        db     0dh,0ah,"GVMat32 optimised assembly code written 1996-98 by Gilles Vollant",0dh,0ah
-
-
-
-IFDEF NOUNDERLINE
-longest_match_7fff   endp
-ELSE
-_longest_match_7fff  endp
-ENDIF
-
-
-IFDEF NOUNDERLINE
-cpudetect32     proc near
-ELSE
-_cpudetect32    proc near
-ENDIF
-
-
-	pushfd                  ; push original EFLAGS
-	pop     eax             ; get original EFLAGS
-	mov     ecx, eax        ; save original EFLAGS
-	xor     eax, 40000h     ; flip AC bit in EFLAGS
-	push    eax             ; save new EFLAGS value on stack
-	popfd                   ; replace current EFLAGS value
-	pushfd                  ; get new EFLAGS
-	pop     eax             ; store new EFLAGS in EAX
-	xor     eax, ecx        ; canÂ’t toggle AC bit, processor=80386
-	jz      end_cpu_is_386  ; jump if 80386 processor
-	push    ecx
-	popfd                   ; restore AC bit in EFLAGS first
-
-	pushfd
-	pushfd
-	pop     ecx
-			
-	mov     eax, ecx        ; get original EFLAGS
-	xor     eax, 200000h    ; flip ID bit in EFLAGS
-	push    eax             ; save new EFLAGS value on stack
-	popfd                   ; replace current EFLAGS value
-	pushfd                  ; get new EFLAGS
-	pop		eax	            ; store new EFLAGS in EAX
-	popfd                   ; restore original EFLAGS
-	xor		eax, ecx        ; canÂ’t toggle ID bit,
-	je		is_old_486		; processor=old
-
-	mov     eax,1
-	db      0fh,0a2h        ;CPUID   
-
-exitcpudetect:
-	ret
-
-end_cpu_is_386:
-	mov     eax,0300h
-	jmp     exitcpudetect
-
-is_old_486:
-	mov     eax,0400h
-	jmp     exitcpudetect
-
-IFDEF NOUNDERLINE
-cpudetect32     endp
-ELSE
-_cpudetect32    endp
-ENDIF
-
-_TEXT   ends
-end
diff --git a/Lib/zlib/contrib/asm386/gvmat32c.c b/Lib/zlib/contrib/asm386/gvmat32c.c
deleted file mode 100644
index d853bb7ce..000000000
--- a/Lib/zlib/contrib/asm386/gvmat32c.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86
- * Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
- * File written by Gilles Vollant, by modifiying the longest_match
- *  from Jean-loup Gailly in deflate.c
- *  it prepare all parameters and call the assembly longest_match_gvasm
- *  longest_match execute standard C code is wmask != 0x7fff
- *     (assembly code is faster with a fixed wmask)
- *
- */
-
-#include "deflate.h"
-
-#undef FAR
-#include 
-
-#ifdef ASMV
-#define NIL 0
-
-#define UNALIGNED_OK
-
-
-/* if your C compiler don't add underline before function name,
-		define ADD_UNDERLINE_ASMFUNC */
-#ifdef ADD_UNDERLINE_ASMFUNC
-#define longest_match_7fff _longest_match_7fff
-#endif
-
-
-
-void match_init()
-{
-}
-
-unsigned long cpudetect32();
-
-uInt longest_match_c(
-    deflate_state *s,
-    IPos cur_match);                             /* current match */
-
-
-uInt longest_match_7fff(
-    deflate_state *s,
-    IPos cur_match);                             /* current match */
-
-uInt longest_match(
-    deflate_state *s,
-    IPos cur_match)                             /* current match */
-{
-	static uInt iIsPPro=2;
-
-    if ((s->w_mask == 0x7fff) && (iIsPPro==0))
-        return longest_match_7fff(s,cur_match);
-
-	if (iIsPPro==2)
-		iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0;
-
-	return longest_match_c(s,cur_match);
-}
-
-
-
-uInt longest_match_c(s, cur_match)
-    deflate_state *s;
-    IPos cur_match;                             /* current match */
-{
-    unsigned chain_length = s->max_chain_length;/* max hash chain length */
-    register Bytef *scan = s->window + s->strstart; /* current string */
-    register Bytef *match;                       /* matched string */
-    register int len;                           /* length of current match */
-    int best_len = s->prev_length;              /* best match length so far */
-    int nice_match = s->nice_match;             /* stop if match long enough */
-    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
-        s->strstart - (IPos)MAX_DIST(s) : NIL;
-    /* Stop when cur_match becomes <= limit. To simplify the code,
-     * we prevent matches with the string of window index 0.
-     */
-    Posf *prev = s->prev;
-    uInt wmask = s->w_mask;
-
-#ifdef UNALIGNED_OK
-    /* Compare two bytes at a time. Note: this is not always beneficial.
-     * Try with and without -DUNALIGNED_OK to check.
-     */
-    register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
-    register ush scan_start = *(ushf*)scan;
-    register ush scan_end   = *(ushf*)(scan+best_len-1);
-#else
-    register Bytef *strend = s->window + s->strstart + MAX_MATCH;
-    register Byte scan_end1  = scan[best_len-1];
-    register Byte scan_end   = scan[best_len];
-#endif
-
-    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
-     * It is easy to get rid of this optimization if necessary.
-     */
-    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
-
-    /* Do not waste too much time if we already have a good match: */
-    if (s->prev_length >= s->good_match) {
-        chain_length >>= 2;
-    }
-    /* Do not look for matches beyond the end of the input. This is necessary
-     * to make deflate deterministic.
-     */
-    if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
-
-    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
-
-    do {
-        Assert(cur_match < s->strstart, "no future");
-        match = s->window + cur_match;
-
-        /* Skip to next match if the match length cannot increase
-         * or if the match length is less than 2:
-         */
-#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
-        /* This code assumes sizeof(unsigned short) == 2. Do not use
-         * UNALIGNED_OK if your compiler uses a different size.
-         */
-        if (*(ushf*)(match+best_len-1) != scan_end ||
-            *(ushf*)match != scan_start) continue;
-
-        /* It is not necessary to compare scan[2] and match[2] since they are
-         * always equal when the other bytes match, given that the hash keys
-         * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
-         * strstart+3, +5, ... up to strstart+257. We check for insufficient
-         * lookahead only every 4th comparison; the 128th check will be made
-         * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
-         * necessary to put more guard bytes at the end of the window, or
-         * to check more often for insufficient lookahead.
-         */
-        Assert(scan[2] == match[2], "scan[2]?");
-        scan++, match++;
-        do {
-        } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 scan < strend);
-        /* The funny "do {}" generates better code on most compilers */
-
-        /* Here, scan <= window+strstart+257 */
-        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-        if (*scan == *match) scan++;
-
-        len = (MAX_MATCH - 1) - (int)(strend-scan);
-        scan = strend - (MAX_MATCH-1);
-
-#else /* UNALIGNED_OK */
-
-        if (match[best_len]   != scan_end  ||
-            match[best_len-1] != scan_end1 ||
-            *match            != *scan     ||
-            *++match          != scan[1])      continue;
-
-        /* The check at best_len-1 can be removed because it will be made
-         * again later. (This heuristic is not always a win.)
-         * It is not necessary to compare scan[2] and match[2] since they
-         * are always equal when the other bytes match, given that
-         * the hash keys are equal and that HASH_BITS >= 8.
-         */
-        scan += 2, match++;
-        Assert(*scan == *match, "match[2]?");
-
-        /* We check for insufficient lookahead only every 8th comparison;
-         * the 256th check will be made at strstart+258.
-         */
-        do {
-        } while (*++scan == *++match && *++scan == *++match &&
-                 *++scan == *++match && *++scan == *++match &&
-                 *++scan == *++match && *++scan == *++match &&
-                 *++scan == *++match && *++scan == *++match &&
-                 scan < strend);
-
-        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
-        len = MAX_MATCH - (int)(strend - scan);
-        scan = strend - MAX_MATCH;
-
-#endif /* UNALIGNED_OK */
-
-        if (len > best_len) {
-            s->match_start = cur_match;
-            best_len = len;
-            if (len >= nice_match) break;
-#ifdef UNALIGNED_OK
-            scan_end = *(ushf*)(scan+best_len-1);
-#else
-            scan_end1  = scan[best_len-1];
-            scan_end   = scan[best_len];
-#endif
-        }
-    } while ((cur_match = prev[cur_match & wmask]) > limit
-             && --chain_length != 0);
-
-    if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
-    return s->lookahead;
-}
-
-#endif /* ASMV */
diff --git a/Lib/zlib/contrib/asm386/mkgvmt32.bat b/Lib/zlib/contrib/asm386/mkgvmt32.bat
deleted file mode 100644
index 6c5ffd7a0..000000000
--- a/Lib/zlib/contrib/asm386/mkgvmt32.bat
+++ /dev/null
@@ -1 +0,0 @@
-c:\masm611\bin\ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm
diff --git a/Lib/zlib/contrib/asm386/zlibvc.def b/Lib/zlib/contrib/asm386/zlibvc.def
deleted file mode 100644
index 7e9d60d55..000000000
--- a/Lib/zlib/contrib/asm386/zlibvc.def
+++ /dev/null
@@ -1,74 +0,0 @@
-LIBRARY		"zlib"
-
-DESCRIPTION	'"""zlib data compression library"""'
-
-
-VERSION		1.11
-
-
-HEAPSIZE	1048576,8192
-
-EXPORTS
-    adler32                        @1
-    compress                       @2
-    crc32                          @3
-    deflate                        @4
-    deflateCopy                    @5
-    deflateEnd                     @6
-    deflateInit2_                  @7
-    deflateInit_                   @8
-    deflateParams                  @9
-    deflateReset                   @10
-    deflateSetDictionary           @11
-    gzclose                        @12
-    gzdopen                        @13
-    gzerror                        @14
-    gzflush                        @15
-    gzopen                         @16
-    gzread                         @17
-    gzwrite                        @18
-    inflate                        @19
-    inflateEnd                     @20
-    inflateInit2_                  @21
-    inflateInit_                   @22
-    inflateReset                   @23
-    inflateSetDictionary           @24
-    inflateSync                    @25
-    uncompress                     @26
-    zlibVersion                    @27
-    gzprintf                       @28
-    gzputc                         @29
-    gzgetc                         @30
-    gzseek                         @31
-    gzrewind                       @32
-    gztell                         @33
-    gzeof                          @34
-    gzsetparams                    @35
-    zError                         @36
-    inflateSyncPoint               @37
-    get_crc_table                  @38
-    compress2                      @39
-    gzputs                         @40
-    gzgets                         @41
-
-	unzOpen                       @61
-	unzClose                      @62
-	unzGetGlobalInfo              @63
-	unzGetCurrentFileInfo         @64
-	unzGoToFirstFile              @65
-	unzGoToNextFile               @66
-	unzOpenCurrentFile            @67
-	unzReadCurrentFile            @68
-	unztell                       @70
-	unzeof                        @71
-	unzCloseCurrentFile           @72
-	unzGetGlobalComment           @73
-	unzStringFileNameCompare      @74
-	unzLocateFile                 @75
-	unzGetLocalExtrafield         @76
-
-	zipOpen                       @80
-	zipOpenNewFileInZip           @81
-	zipWriteInFileInZip           @82
-	zipCloseFileInZip             @83
-	zipClose                      @84
diff --git a/Lib/zlib/contrib/asm386/zlibvc.dsp b/Lib/zlib/contrib/asm386/zlibvc.dsp
deleted file mode 100644
index a70d4d4a6..000000000
--- a/Lib/zlib/contrib/asm386/zlibvc.dsp
+++ /dev/null
@@ -1,651 +0,0 @@
-# Microsoft Developer Studio Project File - Name="zlibvc" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 5.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-# TARGTYPE "Win32 (ALPHA) Dynamic-Link Library" 0x0602
-
-CFG=zlibvc - Win32 Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "zlibvc.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "zlibvc.mak" CFG="zlibvc - Win32 Release"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "zlibvc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 ReleaseAxp" (based on\
- "Win32 (ALPHA) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 ReleaseWithoutAsm" (based on\
- "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 ReleaseWithoutCrtdll" (based on\
- "Win32 (x86) Dynamic-Link Library")
-!MESSAGE 
-
-# Begin Project
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir ".\Release"
-# PROP BASE Intermediate_Dir ".\Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir ".\Release"
-# PROP Intermediate_Dir ".\Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir ".\Debug"
-# PROP BASE Intermediate_Dir ".\Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir ".\Debug"
-# PROP Intermediate_Dir ".\Debug"
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "_DEBUG" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "_DEBUG"
-# ADD RSC /l 0x40c /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:".\Debug\zlib.dll"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "zlibvc__"
-# PROP BASE Intermediate_Dir "zlibvc__"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "zlibvc__"
-# PROP Intermediate_Dir "zlibvc__"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
-# ADD CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT BASE LINK32 /pdb:none
-# ADD LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:"zlibvc__\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "zlibvc_0"
-# PROP BASE Intermediate_Dir "zlibvc_0"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "zlibvc_0"
-# PROP Intermediate_Dir "zlibvc_0"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT BASE LINK32 /pdb:none
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_0\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "zlibvc_1"
-# PROP BASE Intermediate_Dir "zlibvc_1"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "zlibvc_1"
-# PROP Intermediate_Dir "zlibvc_1"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT BASE LINK32 /pdb:none
-# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_1\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF 
-
-# Begin Target
-
-# Name "zlibvc - Win32 Release"
-# Name "zlibvc - Win32 Debug"
-# Name "zlibvc - Win32 ReleaseAxp"
-# Name "zlibvc - Win32 ReleaseWithoutAsm"
-# Name "zlibvc - Win32 ReleaseWithoutCrtdll"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
-# Begin Source File
-
-SOURCE=.\adler32.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_ADLER=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\compress.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_COMPR=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\crc32.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_CRC32=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\deflate.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_DEFLA=\
-	".\deflate.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\gvmat32c.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\gzio.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_GZIO_=\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\infblock.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFBL=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\infcodes.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFCO=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inffast.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\inffast.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFFA=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inffast.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\inflate.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFLA=\
-	".\infblock.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\inftrees.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFTR=\
-	".\inftrees.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\infutil.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFUT=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\trees.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_TREES=\
-	".\deflate.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uncompr.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_UNCOM=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unzip.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\zip.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\zlib.rc
-# End Source File
-# Begin Source File
-
-SOURCE=.\zlibvc.def
-# End Source File
-# Begin Source File
-
-SOURCE=.\zutil.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_ZUTIL=\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
-# Begin Source File
-
-SOURCE=.\deflate.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\infblock.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\infcodes.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\inffast.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\inftrees.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\infutil.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\zconf.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\zlib.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\zutil.h
-# End Source File
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
-# End Group
-# End Target
-# End Project
diff --git a/Lib/zlib/contrib/asm386/zlibvc.dsw b/Lib/zlib/contrib/asm386/zlibvc.dsw
deleted file mode 100644
index 493cd8703..000000000
--- a/Lib/zlib/contrib/asm386/zlibvc.dsw
+++ /dev/null
@@ -1,41 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 5.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "zlibstat"=.\zlibstat.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "zlibvc"=.\zlibvc.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/Lib/zlib/contrib/asm586/README.586 b/Lib/zlib/contrib/asm586/README.586
deleted file mode 100644
index 6bb78f320..000000000
--- a/Lib/zlib/contrib/asm586/README.586
+++ /dev/null
@@ -1,43 +0,0 @@
-This is a patched version of zlib modified to use
-Pentium-optimized assembly code in the deflation algorithm. The files
-changed/added by this patch are:
-
-README.586
-match.S
-
-The effectiveness of these modifications is a bit marginal, as the the
-program's bottleneck seems to be mostly L1-cache contention, for which
-there is no real way to work around without rewriting the basic
-algorithm. The speedup on average is around 5-10% (which is generally
-less than the amount of variance between subsequent executions).
-However, when used at level 9 compression, the cache contention can
-drop enough for the assembly version to achieve 10-20% speedup (and
-sometimes more, depending on the amount of overall redundancy in the
-files). Even here, though, cache contention can still be the limiting
-factor, depending on the nature of the program using the zlib library.
-This may also mean that better improvements will be seen on a Pentium
-with MMX, which suffers much less from L1-cache contention, but I have
-not yet verified this.
-
-Note that this code has been tailored for the Pentium in particular,
-and will not perform well on the Pentium Pro (due to the use of a
-partial register in the inner loop).
-
-If you are using an assembler other than GNU as, you will have to
-translate match.S to use your assembler's syntax. (Have fun.)
-
-Brian Raiter
-breadbox@muppetlabs.com
-April, 1998
-
-
-Added for zlib 1.1.3:
-
-The patches come from
-http://www.muppetlabs.com/~breadbox/software/assembly.html
-
-To compile zlib with this asm file, copy match.S to the zlib directory
-then do:
-
-CFLAGS="-O3 -DASMV" ./configure
-make OBJA=match.o
diff --git a/Lib/zlib/contrib/asm586/match.S b/Lib/zlib/contrib/asm586/match.S
deleted file mode 100644
index 8f1614078..000000000
--- a/Lib/zlib/contrib/asm586/match.S
+++ /dev/null
@@ -1,354 +0,0 @@
-/* match.s -- Pentium-optimized version of longest_match()
- * Written for zlib 1.1.2
- * Copyright (C) 1998 Brian Raiter 
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License.
- */
-
-#ifndef NO_UNDERLINE
-#define	match_init	_match_init
-#define	longest_match	_longest_match
-#endif
-
-#define	MAX_MATCH	(258)
-#define	MIN_MATCH	(3)
-#define	MIN_LOOKAHEAD	(MAX_MATCH + MIN_MATCH + 1)
-#define	MAX_MATCH_8	((MAX_MATCH + 7) & ~7)
-
-/* stack frame offsets */
-
-#define	wmask			0	/* local copy of s->wmask	*/
-#define	window			4	/* local copy of s->window	*/
-#define	windowbestlen		8	/* s->window + bestlen		*/
-#define	chainlenscanend		12	/* high word: current chain len	*/
-					/* low word: last bytes sought	*/
-#define	scanstart		16	/* first two bytes of string	*/
-#define	scanalign		20	/* dword-misalignment of string	*/
-#define	nicematch		24	/* a good enough match size	*/
-#define	bestlen			28	/* size of best match so far	*/
-#define	scan			32	/* ptr to string wanting match	*/
-
-#define	LocalVarsSize		(36)
-/*	saved ebx		36 */
-/*	saved edi		40 */
-/*	saved esi		44 */
-/*	saved ebp		48 */
-/*	return address		52 */
-#define	deflatestate		56	/* the function arguments	*/
-#define	curmatch		60
-
-/* Offsets for fields in the deflate_state structure. These numbers
- * are calculated from the definition of deflate_state, with the
- * assumption that the compiler will dword-align the fields. (Thus,
- * changing the definition of deflate_state could easily cause this
- * program to crash horribly, without so much as a warning at
- * compile time. Sigh.)
- */
-#define	dsWSize			36
-#define	dsWMask			44
-#define	dsWindow		48
-#define	dsPrev			56
-#define	dsMatchLen		88
-#define	dsPrevMatch		92
-#define	dsStrStart		100
-#define	dsMatchStart		104
-#define	dsLookahead		108
-#define	dsPrevLen		112
-#define	dsMaxChainLen		116
-#define	dsGoodMatch		132
-#define	dsNiceMatch		136
-
-
-.file "match.S"
-
-.globl	match_init, longest_match
-
-.text
-
-/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
-
-longest_match:
-
-/* Save registers that the compiler may be using, and adjust %esp to	*/
-/* make room for our stack frame.					*/
-
-		pushl	%ebp
-		pushl	%edi
-		pushl	%esi
-		pushl	%ebx
-		subl	$LocalVarsSize, %esp
-
-/* Retrieve the function arguments. %ecx will hold cur_match		*/
-/* throughout the entire function. %edx will hold the pointer to the	*/
-/* deflate_state structure during the function's setup (before		*/
-/* entering the main loop).						*/
-
-		movl	deflatestate(%esp), %edx
-		movl	curmatch(%esp), %ecx
-
-/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;	*/
-
-		movl	dsNiceMatch(%edx), %eax
-		movl	dsLookahead(%edx), %ebx
-		cmpl	%eax, %ebx
-		jl	LookaheadLess
-		movl	%eax, %ebx
-LookaheadLess:	movl	%ebx, nicematch(%esp)
-
-/* register Bytef *scan = s->window + s->strstart;			*/
-
-		movl	dsWindow(%edx), %esi
-		movl	%esi, window(%esp)
-		movl	dsStrStart(%edx), %ebp
-		lea	(%esi,%ebp), %edi
-		movl	%edi, scan(%esp)
-
-/* Determine how many bytes the scan ptr is off from being		*/
-/* dword-aligned.							*/
-
-		movl	%edi, %eax
-		negl	%eax
-		andl	$3, %eax
-		movl	%eax, scanalign(%esp)
-
-/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ?			*/
-/*     s->strstart - (IPos)MAX_DIST(s) : NIL;				*/
-
-		movl	dsWSize(%edx), %eax
-		subl	$MIN_LOOKAHEAD, %eax
-		subl	%eax, %ebp
-		jg	LimitPositive
-		xorl	%ebp, %ebp
-LimitPositive:
-
-/* unsigned chain_length = s->max_chain_length;				*/
-/* if (s->prev_length >= s->good_match) {				*/
-/*     chain_length >>= 2;						*/
-/* }									*/
-
-		movl	dsPrevLen(%edx), %eax
-		movl	dsGoodMatch(%edx), %ebx
-		cmpl	%ebx, %eax
-		movl	dsMaxChainLen(%edx), %ebx
-		jl	LastMatchGood
-		shrl	$2, %ebx
-LastMatchGood:
-
-/* chainlen is decremented once beforehand so that the function can	*/
-/* use the sign flag instead of the zero flag for the exit test.	*/
-/* It is then shifted into the high word, to make room for the scanend	*/
-/* scanend value, which it will always accompany.			*/
-
-		decl	%ebx
-		shll	$16, %ebx
-
-/* int best_len = s->prev_length;					*/
-
-		movl	dsPrevLen(%edx), %eax
-		movl	%eax, bestlen(%esp)
-
-/* Store the sum of s->window + best_len in %esi locally, and in %esi.	*/
-
-		addl	%eax, %esi
-		movl	%esi, windowbestlen(%esp)
-
-/* register ush scan_start = *(ushf*)scan;				*/
-/* register ush scan_end   = *(ushf*)(scan+best_len-1);			*/
-
-		movw	(%edi), %bx
-		movw	%bx, scanstart(%esp)
-		movw	-1(%edi,%eax), %bx
-		movl	%ebx, chainlenscanend(%esp)
-
-/* Posf *prev = s->prev;						*/
-/* uInt wmask = s->w_mask;						*/
-
-		movl	dsPrev(%edx), %edi
-		movl	dsWMask(%edx), %edx
-		mov	%edx, wmask(%esp)
-
-/* Jump into the main loop.						*/
-
-		jmp	LoopEntry
-
-.balign 16
-
-/* do {
- *     match = s->window + cur_match;
- *     if (*(ushf*)(match+best_len-1) != scan_end ||
- *         *(ushf*)match != scan_start) continue;
- *     [...]
- * } while ((cur_match = prev[cur_match & wmask]) > limit
- *          && --chain_length != 0);
- *
- * Here is the inner loop of the function. The function will spend the
- * majority of its time in this loop, and majority of that time will
- * be spent in the first ten instructions.
- *
- * Within this loop:
- * %ebx = chainlenscanend - i.e., ((chainlen << 16) | scanend)
- * %ecx = curmatch
- * %edx = curmatch & wmask
- * %esi = windowbestlen - i.e., (window + bestlen)
- * %edi = prev
- * %ebp = limit
- *
- * Two optimization notes on the choice of instructions:
- *
- * The first instruction uses a 16-bit address, which costs an extra,
- * unpairable cycle. This is cheaper than doing a 32-bit access and
- * zeroing the high word, due to the 3-cycle misalignment penalty which
- * would occur half the time. This also turns out to be cheaper than
- * doing two separate 8-bit accesses, as the memory is so rarely in the
- * L1 cache.
- *
- * The window buffer, however, apparently spends a lot of time in the
- * cache, and so it is faster to retrieve the word at the end of the
- * match string with two 8-bit loads. The instructions that test the
- * word at the beginning of the match string, however, are executed
- * much less frequently, and there it was cheaper to use 16-bit
- * instructions, which avoided the necessity of saving off and
- * subsequently reloading one of the other registers.
- */
-LookupLoop:
-							/* 1 U & V  */
-		movw	(%edi,%edx,2), %cx		/* 2 U pipe */
-		movl	wmask(%esp), %edx		/* 2 V pipe */
-		cmpl	%ebp, %ecx			/* 3 U pipe */
-		jbe	LeaveNow			/* 3 V pipe */
-		subl	$0x00010000, %ebx		/* 4 U pipe */
-		js	LeaveNow			/* 4 V pipe */
-LoopEntry:	movb	-1(%esi,%ecx), %al		/* 5 U pipe */
-		andl	%ecx, %edx			/* 5 V pipe */
-		cmpb	%bl, %al			/* 6 U pipe */
-		jnz	LookupLoop			/* 6 V pipe */
-		movb	(%esi,%ecx), %ah
-		cmpb	%bh, %ah
-		jnz	LookupLoop
-		movl	window(%esp), %eax
-		movw	(%eax,%ecx), %ax
-		cmpw	scanstart(%esp), %ax
-		jnz	LookupLoop
-
-/* Store the current value of chainlen.					*/
-
-		movl	%ebx, chainlenscanend(%esp)
-
-/* Point %edi to the string under scrutiny, and %esi to the string we	*/
-/* are hoping to match it up with. In actuality, %esi and %edi are	*/
-/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is	*/
-/* initialized to -(MAX_MATCH_8 - scanalign).				*/
-
-		movl	window(%esp), %esi
-		movl	scan(%esp), %edi
-		addl	%ecx, %esi
-		movl	scanalign(%esp), %eax
-		movl	$(-MAX_MATCH_8), %edx
-		lea	MAX_MATCH_8(%edi,%eax), %edi
-		lea	MAX_MATCH_8(%esi,%eax), %esi
-
-/* Test the strings for equality, 8 bytes at a time. At the end,
- * adjust %edx so that it is offset to the exact byte that mismatched.
- *
- * We already know at this point that the first three bytes of the
- * strings match each other, and they can be safely passed over before
- * starting the compare loop. So what this code does is skip over 0-3
- * bytes, as much as necessary in order to dword-align the %edi
- * pointer. (%esi will still be misaligned three times out of four.)
- *
- * It should be confessed that this loop usually does not represent
- * much of the total running time. Replacing it with a more
- * straightforward "rep cmpsb" would not drastically degrade
- * performance.
- */
-LoopCmps:
-		movl	(%esi,%edx), %eax
-		movl	(%edi,%edx), %ebx
-		xorl	%ebx, %eax
-		jnz	LeaveLoopCmps
-		movl	4(%esi,%edx), %eax
-		movl	4(%edi,%edx), %ebx
-		xorl	%ebx, %eax
-		jnz	LeaveLoopCmps4
-		addl	$8, %edx
-		jnz	LoopCmps
-		jmp	LenMaximum
-LeaveLoopCmps4:	addl	$4, %edx
-LeaveLoopCmps:	testl	$0x0000FFFF, %eax
-		jnz	LenLower
-		addl	$2, %edx
-		shrl	$16, %eax
-LenLower:	subb	$1, %al
-		adcl	$0, %edx
-
-/* Calculate the length of the match. If it is longer than MAX_MATCH,	*/
-/* then automatically accept it as the best possible match and leave.	*/
-
-		lea	(%edi,%edx), %eax
-		movl	scan(%esp), %edi
-		subl	%edi, %eax
-		cmpl	$MAX_MATCH, %eax
-		jge	LenMaximum
-
-/* If the length of the match is not longer than the best match we	*/
-/* have so far, then forget it and return to the lookup loop.		*/
-
-		movl	deflatestate(%esp), %edx
-		movl	bestlen(%esp), %ebx
-		cmpl	%ebx, %eax
-		jg	LongerMatch
-		movl	chainlenscanend(%esp), %ebx
-		movl	windowbestlen(%esp), %esi
-		movl	dsPrev(%edx), %edi
-		movl	wmask(%esp), %edx
-		andl	%ecx, %edx
-		jmp	LookupLoop
-
-/*         s->match_start = cur_match;					*/
-/*         best_len = len;						*/
-/*         if (len >= nice_match) break;				*/
-/*         scan_end = *(ushf*)(scan+best_len-1);			*/
-
-LongerMatch:	movl	nicematch(%esp), %ebx
-		movl	%eax, bestlen(%esp)
-		movl	%ecx, dsMatchStart(%edx)
-		cmpl	%ebx, %eax
-		jge	LeaveNow
-		movl	window(%esp), %esi
-		addl	%eax, %esi
-		movl	%esi, windowbestlen(%esp)
-		movl	chainlenscanend(%esp), %ebx
-		movw	-1(%edi,%eax), %bx
-		movl	dsPrev(%edx), %edi
-		movl	%ebx, chainlenscanend(%esp)
-		movl	wmask(%esp), %edx
-		andl	%ecx, %edx
-		jmp	LookupLoop
-
-/* Accept the current string, with the maximum possible length.		*/
-
-LenMaximum:	movl	deflatestate(%esp), %edx
-		movl	$MAX_MATCH, bestlen(%esp)
-		movl	%ecx, dsMatchStart(%edx)
-
-/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len;		*/
-/* return s->lookahead;							*/
-
-LeaveNow:
-		movl	deflatestate(%esp), %edx
-		movl	bestlen(%esp), %ebx
-		movl	dsLookahead(%edx), %eax
-		cmpl	%eax, %ebx
-		jg	LookaheadRet
-		movl	%ebx, %eax
-LookaheadRet:
-
-/* Restore the stack and return from whence we came.			*/
-
-		addl	$LocalVarsSize, %esp
-		popl	%ebx
-		popl	%esi
-		popl	%edi
-		popl	%ebp
-match_init:	ret
diff --git a/Lib/zlib/contrib/asm686/README.686 b/Lib/zlib/contrib/asm686/README.686
deleted file mode 100644
index a593f23af..000000000
--- a/Lib/zlib/contrib/asm686/README.686
+++ /dev/null
@@ -1,34 +0,0 @@
-This is a patched version of zlib, modified to use
-Pentium-Pro-optimized assembly code in the deflation algorithm. The
-files changed/added by this patch are:
-
-README.686
-match.S
-
-The speedup that this patch provides varies, depending on whether the
-compiler used to build the original version of zlib falls afoul of the
-PPro's speed traps. My own tests show a speedup of around 10-20% at
-the default compression level, and 20-30% using -9, against a version
-compiled using gcc 2.7.2.3. Your mileage may vary.
-
-Note that this code has been tailored for the PPro/PII in particular,
-and will not perform particuarly well on a Pentium.
-
-If you are using an assembler other than GNU as, you will have to
-translate match.S to use your assembler's syntax. (Have fun.)
-
-Brian Raiter
-breadbox@muppetlabs.com
-April, 1998
-
-
-Added for zlib 1.1.3:
-
-The patches come from
-http://www.muppetlabs.com/~breadbox/software/assembly.html
-
-To compile zlib with this asm file, copy match.S to the zlib directory
-then do:
-
-CFLAGS="-O3 -DASMV" ./configure
-make OBJA=match.o
diff --git a/Lib/zlib/contrib/asm686/match.S b/Lib/zlib/contrib/asm686/match.S
deleted file mode 100644
index 8e86c33c2..000000000
--- a/Lib/zlib/contrib/asm686/match.S
+++ /dev/null
@@ -1,327 +0,0 @@
-/* match.s -- Pentium-Pro-optimized version of longest_match()
- * Written for zlib 1.1.2
- * Copyright (C) 1998 Brian Raiter 
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License.
- */
-
-#ifndef NO_UNDERLINE
-#define	match_init	_match_init
-#define	longest_match	_longest_match
-#endif
-
-#define	MAX_MATCH	(258)
-#define	MIN_MATCH	(3)
-#define	MIN_LOOKAHEAD	(MAX_MATCH + MIN_MATCH + 1)
-#define	MAX_MATCH_8	((MAX_MATCH + 7) & ~7)
-
-/* stack frame offsets */
-
-#define	chainlenwmask		0	/* high word: current chain len	*/
-					/* low word: s->wmask		*/
-#define	window			4	/* local copy of s->window	*/
-#define	windowbestlen		8	/* s->window + bestlen		*/
-#define	scanstart		16	/* first two bytes of string	*/
-#define	scanend			12	/* last two bytes of string	*/
-#define	scanalign		20	/* dword-misalignment of string	*/
-#define	nicematch		24	/* a good enough match size	*/
-#define	bestlen			28	/* size of best match so far	*/
-#define	scan			32	/* ptr to string wanting match	*/
-
-#define	LocalVarsSize		(36)
-/*	saved ebx		36 */
-/*	saved edi		40 */
-/*	saved esi		44 */
-/*	saved ebp		48 */
-/*	return address		52 */
-#define	deflatestate		56	/* the function arguments	*/
-#define	curmatch		60
-
-/* Offsets for fields in the deflate_state structure. These numbers
- * are calculated from the definition of deflate_state, with the
- * assumption that the compiler will dword-align the fields. (Thus,
- * changing the definition of deflate_state could easily cause this
- * program to crash horribly, without so much as a warning at
- * compile time. Sigh.)
- */
-#define	dsWSize			36
-#define	dsWMask			44
-#define	dsWindow		48
-#define	dsPrev			56
-#define	dsMatchLen		88
-#define	dsPrevMatch		92
-#define	dsStrStart		100
-#define	dsMatchStart		104
-#define	dsLookahead		108
-#define	dsPrevLen		112
-#define	dsMaxChainLen		116
-#define	dsGoodMatch		132
-#define	dsNiceMatch		136
-
-
-.file "match.S"
-
-.globl	match_init, longest_match
-
-.text
-
-/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
-
-longest_match:
-
-/* Save registers that the compiler may be using, and adjust %esp to	*/
-/* make room for our stack frame.					*/
-
-		pushl	%ebp
-		pushl	%edi
-		pushl	%esi
-		pushl	%ebx
-		subl	$LocalVarsSize, %esp
-
-/* Retrieve the function arguments. %ecx will hold cur_match		*/
-/* throughout the entire function. %edx will hold the pointer to the	*/
-/* deflate_state structure during the function's setup (before		*/
-/* entering the main loop).						*/
-
-		movl	deflatestate(%esp), %edx
-		movl	curmatch(%esp), %ecx
-
-/* uInt wmask = s->w_mask;						*/
-/* unsigned chain_length = s->max_chain_length;				*/
-/* if (s->prev_length >= s->good_match) {				*/
-/*     chain_length >>= 2;						*/
-/* }									*/
-
-		movl	dsPrevLen(%edx), %eax
-		movl	dsGoodMatch(%edx), %ebx
-		cmpl	%ebx, %eax
-		movl	dsWMask(%edx), %eax
-		movl	dsMaxChainLen(%edx), %ebx
-		jl	LastMatchGood
-		shrl	$2, %ebx
-LastMatchGood:
-
-/* chainlen is decremented once beforehand so that the function can	*/
-/* use the sign flag instead of the zero flag for the exit test.	*/
-/* It is then shifted into the high word, to make room for the wmask	*/
-/* value, which it will always accompany.				*/
-
-		decl	%ebx
-		shll	$16, %ebx
-		orl	%eax, %ebx
-		movl	%ebx, chainlenwmask(%esp)
-
-/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;	*/
-
-		movl	dsNiceMatch(%edx), %eax
-		movl	dsLookahead(%edx), %ebx
-		cmpl	%eax, %ebx
-		jl	LookaheadLess
-		movl	%eax, %ebx
-LookaheadLess:	movl	%ebx, nicematch(%esp)
-
-/* register Bytef *scan = s->window + s->strstart;			*/
-
-		movl	dsWindow(%edx), %esi
-		movl	%esi, window(%esp)
-		movl	dsStrStart(%edx), %ebp
-		lea	(%esi,%ebp), %edi
-		movl	%edi, scan(%esp)
-
-/* Determine how many bytes the scan ptr is off from being		*/
-/* dword-aligned.							*/
-
-		movl	%edi, %eax
-		negl	%eax
-		andl	$3, %eax
-		movl	%eax, scanalign(%esp)
-
-/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ?			*/
-/*     s->strstart - (IPos)MAX_DIST(s) : NIL;				*/
-
-		movl	dsWSize(%edx), %eax
-		subl	$MIN_LOOKAHEAD, %eax
-		subl	%eax, %ebp
-		jg	LimitPositive
-		xorl	%ebp, %ebp
-LimitPositive:
-
-/* int best_len = s->prev_length;					*/
-
-		movl	dsPrevLen(%edx), %eax
-		movl	%eax, bestlen(%esp)
-
-/* Store the sum of s->window + best_len in %esi locally, and in %esi.	*/
-
-		addl	%eax, %esi
-		movl	%esi, windowbestlen(%esp)
-
-/* register ush scan_start = *(ushf*)scan;				*/
-/* register ush scan_end   = *(ushf*)(scan+best_len-1);			*/
-/* Posf *prev = s->prev;						*/
-
-		movzwl	(%edi), %ebx
-		movl	%ebx, scanstart(%esp)
-		movzwl	-1(%edi,%eax), %ebx
-		movl	%ebx, scanend(%esp)
-		movl	dsPrev(%edx), %edi
-
-/* Jump into the main loop.						*/
-
-		movl	chainlenwmask(%esp), %edx
-		jmp	LoopEntry
-
-.balign 16
-
-/* do {
- *     match = s->window + cur_match;
- *     if (*(ushf*)(match+best_len-1) != scan_end ||
- *         *(ushf*)match != scan_start) continue;
- *     [...]
- * } while ((cur_match = prev[cur_match & wmask]) > limit
- *          && --chain_length != 0);
- *
- * Here is the inner loop of the function. The function will spend the
- * majority of its time in this loop, and majority of that time will
- * be spent in the first ten instructions.
- *
- * Within this loop:
- * %ebx = scanend
- * %ecx = curmatch
- * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
- * %esi = windowbestlen - i.e., (window + bestlen)
- * %edi = prev
- * %ebp = limit
- */
-LookupLoop:
-		andl	%edx, %ecx
-		movzwl	(%edi,%ecx,2), %ecx
-		cmpl	%ebp, %ecx
-		jbe	LeaveNow
-		subl	$0x00010000, %edx
-		js	LeaveNow
-LoopEntry:	movzwl	-1(%esi,%ecx), %eax
-		cmpl	%ebx, %eax
-		jnz	LookupLoop
-		movl	window(%esp), %eax
-		movzwl	(%eax,%ecx), %eax
-		cmpl	scanstart(%esp), %eax
-		jnz	LookupLoop
-
-/* Store the current value of chainlen.					*/
-
-		movl	%edx, chainlenwmask(%esp)
-
-/* Point %edi to the string under scrutiny, and %esi to the string we	*/
-/* are hoping to match it up with. In actuality, %esi and %edi are	*/
-/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is	*/
-/* initialized to -(MAX_MATCH_8 - scanalign).				*/
-
-		movl	window(%esp), %esi
-		movl	scan(%esp), %edi
-		addl	%ecx, %esi
-		movl	scanalign(%esp), %eax
-		movl	$(-MAX_MATCH_8), %edx
-		lea	MAX_MATCH_8(%edi,%eax), %edi
-		lea	MAX_MATCH_8(%esi,%eax), %esi
-
-/* Test the strings for equality, 8 bytes at a time. At the end,
- * adjust %edx so that it is offset to the exact byte that mismatched.
- *
- * We already know at this point that the first three bytes of the
- * strings match each other, and they can be safely passed over before
- * starting the compare loop. So what this code does is skip over 0-3
- * bytes, as much as necessary in order to dword-align the %edi
- * pointer. (%esi will still be misaligned three times out of four.)
- *
- * It should be confessed that this loop usually does not represent
- * much of the total running time. Replacing it with a more
- * straightforward "rep cmpsb" would not drastically degrade
- * performance.
- */
-LoopCmps:
-		movl	(%esi,%edx), %eax
-		xorl	(%edi,%edx), %eax
-		jnz	LeaveLoopCmps
-		movl	4(%esi,%edx), %eax
-		xorl	4(%edi,%edx), %eax
-		jnz	LeaveLoopCmps4
-		addl	$8, %edx
-		jnz	LoopCmps
-		jmp	LenMaximum
-LeaveLoopCmps4:	addl	$4, %edx
-LeaveLoopCmps:	testl	$0x0000FFFF, %eax
-		jnz	LenLower
-		addl	$2, %edx
-		shrl	$16, %eax
-LenLower:	subb	$1, %al
-		adcl	$0, %edx
-
-/* Calculate the length of the match. If it is longer than MAX_MATCH,	*/
-/* then automatically accept it as the best possible match and leave.	*/
-
-		lea	(%edi,%edx), %eax
-		movl	scan(%esp), %edi
-		subl	%edi, %eax
-		cmpl	$MAX_MATCH, %eax
-		jge	LenMaximum
-
-/* If the length of the match is not longer than the best match we	*/
-/* have so far, then forget it and return to the lookup loop.		*/
-
-		movl	deflatestate(%esp), %edx
-		movl	bestlen(%esp), %ebx
-		cmpl	%ebx, %eax
-		jg	LongerMatch
-		movl	windowbestlen(%esp), %esi
-		movl	dsPrev(%edx), %edi
-		movl	scanend(%esp), %ebx
-		movl	chainlenwmask(%esp), %edx
-		jmp	LookupLoop
-
-/*         s->match_start = cur_match;					*/
-/*         best_len = len;						*/
-/*         if (len >= nice_match) break;				*/
-/*         scan_end = *(ushf*)(scan+best_len-1);			*/
-
-LongerMatch:	movl	nicematch(%esp), %ebx
-		movl	%eax, bestlen(%esp)
-		movl	%ecx, dsMatchStart(%edx)
-		cmpl	%ebx, %eax
-		jge	LeaveNow
-		movl	window(%esp), %esi
-		addl	%eax, %esi
-		movl	%esi, windowbestlen(%esp)
-		movzwl	-1(%edi,%eax), %ebx
-		movl	dsPrev(%edx), %edi
-		movl	%ebx, scanend(%esp)
-		movl	chainlenwmask(%esp), %edx
-		jmp	LookupLoop
-
-/* Accept the current string, with the maximum possible length.		*/
-
-LenMaximum:	movl	deflatestate(%esp), %edx
-		movl	$MAX_MATCH, bestlen(%esp)
-		movl	%ecx, dsMatchStart(%edx)
-
-/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len;		*/
-/* return s->lookahead;							*/
-
-LeaveNow:
-		movl	deflatestate(%esp), %edx
-		movl	bestlen(%esp), %ebx
-		movl	dsLookahead(%edx), %eax
-		cmpl	%eax, %ebx
-		jg	LookaheadRet
-		movl	%ebx, %eax
-LookaheadRet:
-
-/* Restore the stack and return from whence we came.			*/
-
-		addl	$LocalVarsSize, %esp
-		popl	%ebx
-		popl	%esi
-		popl	%edi
-		popl	%ebp
-match_init:	ret
diff --git a/Lib/zlib/contrib/delphi/zlib.mak b/Lib/zlib/contrib/delphi/zlib.mak
deleted file mode 100644
index ba557e2b9..000000000
--- a/Lib/zlib/contrib/delphi/zlib.mak
+++ /dev/null
@@ -1,36 +0,0 @@
-# Makefile for zlib32bd.lib
-# ------------- Borland C++ 4.5 -------------
-
-# The (32-bit) zlib32bd.lib made with this makefile is intended for use 
-# in making the (32-bit) DLL, png32bd.dll. It uses the "stdcall" calling 
-# convention.
-
-CFLAGS= -ps -O2 -C -K -N- -k- -d -3 -r- -w-par -w-aus -WDE
-CC=f:\bc45\bin\bcc32
-LIBFLAGS= /C
-LIB=f:\bc45\bin\tlib
-ZLIB=zlib32bd.lib
-
-.autodepend
-.c.obj:
-        $(CC) -c $(CFLAGS) $<
-
-OBJ1=adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj 
-OBJ2=infcodes.obj inflate.obj inftrees.obj infutil.obj inffast.obj 
-OBJ3=trees.obj uncompr.obj zutil.obj
-pOBJ1=+adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infblock.obj 
-pOBJ2=+infcodes.obj+inflate.obj+inftrees.obj+infutil.obj+inffast.obj 
-pOBJ3=+trees.obj+uncompr.obj+zutil.obj
-
-all: $(ZLIB)
-
-$(ZLIB): $(OBJ1) $(OBJ2) $(OBJ3)
-        @if exist $@ del $@
-        $(LIB) @&&|
-$@ $(LIBFLAGS) &
-$(pOBJ1) &
-$(pOBJ2) &
-$(pOBJ3)
-|
-
-# End of makefile for zlib32bd.lib
diff --git a/Lib/zlib/contrib/delphi/zlibdef.pas b/Lib/zlib/contrib/delphi/zlibdef.pas
deleted file mode 100644
index 4f96b7d2c..000000000
--- a/Lib/zlib/contrib/delphi/zlibdef.pas
+++ /dev/null
@@ -1,169 +0,0 @@
-unit zlibdef;
-
-interface
-
-uses
-  Windows;
-
-const
-  ZLIB_VERSION = '1.1.3';
-
-type
-  voidpf = Pointer;
-  int    = Integer;
-  uInt   = Cardinal;
-  pBytef = PChar;
-  uLong  = Cardinal;
-
-  alloc_func = function(opaque: voidpf; items, size: uInt): voidpf;
-                    stdcall;
-  free_func  = procedure(opaque, address: voidpf);
-                    stdcall;
-
-  internal_state = Pointer;
-
-  z_streamp = ^z_stream;
-  z_stream = packed record
-    next_in: pBytef;          // next input byte
-    avail_in: uInt;           // number of bytes available at next_in
-    total_in: uLong;          // total nb of input bytes read so far
-
-    next_out: pBytef;         // next output byte should be put there
-    avail_out: uInt;          // remaining free space at next_out
-    total_out: uLong;         // total nb of bytes output so far
-
-    msg: PChar;               // last error message, NULL if no error
-    state: internal_state;    // not visible by applications
-
-    zalloc: alloc_func;       // used to allocate the internal state
-    zfree: free_func;         // used to free the internal state
-    opaque: voidpf;           // private data object passed to zalloc and zfree
-
-    data_type: int;           // best guess about the data type: ascii or binary
-    adler: uLong;             // adler32 value of the uncompressed data
-    reserved: uLong;          // reserved for future use
-    end;
-
-const
-  Z_NO_FLUSH      = 0;
-  Z_SYNC_FLUSH    = 2;
-  Z_FULL_FLUSH    = 3;
-  Z_FINISH        = 4;
-
-  Z_OK            = 0;
-  Z_STREAM_END    = 1;
-
-  Z_NO_COMPRESSION         =  0;
-  Z_BEST_SPEED             =  1;
-  Z_BEST_COMPRESSION       =  9;
-  Z_DEFAULT_COMPRESSION    = -1;
-
-  Z_FILTERED            = 1;
-  Z_HUFFMAN_ONLY        = 2;
-  Z_DEFAULT_STRATEGY    = 0;
-
-  Z_BINARY   = 0;
-  Z_ASCII    = 1;
-  Z_UNKNOWN  = 2;
-
-  Z_DEFLATED    = 8;
-
-  MAX_MEM_LEVEL = 9;
-
-function adler32(adler: uLong; const buf: pBytef; len: uInt): uLong;
-             stdcall;
-function crc32(crc: uLong; const buf: pBytef; len: uInt): uLong;
-             stdcall;
-function deflate(strm: z_streamp; flush: int): int;
-             stdcall;
-function deflateCopy(dest, source: z_streamp): int;
-             stdcall;
-function deflateEnd(strm: z_streamp): int;
-             stdcall;
-function deflateInit2_(strm: z_streamp; level, method,
-                       windowBits, memLevel, strategy: int;
-                       const version: PChar; stream_size: int): int;
-             stdcall;
-function deflateInit_(strm: z_streamp; level: int;
-                      const version: PChar; stream_size: int): int;
-             stdcall;
-function deflateParams(strm: z_streamp; level, strategy: int): int;
-             stdcall;
-function deflateReset(strm: z_streamp): int;
-             stdcall;
-function deflateSetDictionary(strm: z_streamp;
-                              const dictionary: pBytef;
-                              dictLength: uInt): int;
-             stdcall;
-function inflate(strm: z_streamp; flush: int): int;
-             stdcall;
-function inflateEnd(strm: z_streamp): int;
-             stdcall;
-function inflateInit2_(strm: z_streamp; windowBits: int;
-                       const version: PChar; stream_size: int): int;
-             stdcall;
-function inflateInit_(strm: z_streamp; const version: PChar;
-                      stream_size: int): int;
-             stdcall;
-function inflateReset(strm: z_streamp): int;
-             stdcall;
-function inflateSetDictionary(strm: z_streamp;
-                              const dictionary: pBytef;
-                              dictLength: uInt): int;
-             stdcall;
-function inflateSync(strm: z_streamp): int;
-             stdcall;
-
-function deflateInit(strm: z_streamp; level: int): int;
-function deflateInit2(strm: z_streamp; level, method, windowBits,
-                      memLevel, strategy: int): int;
-function inflateInit(strm: z_streamp): int;
-function inflateInit2(strm: z_streamp; windowBits: int): int;
-
-implementation
-
-function deflateInit(strm: z_streamp; level: int): int;
-begin
-  Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream));
-end;
-
-function deflateInit2(strm: z_streamp; level, method, windowBits,
-                      memLevel, strategy: int): int;
-begin
-  Result := deflateInit2_(strm, level, method, windowBits, memLevel,
-                          strategy, ZLIB_VERSION, sizeof(z_stream));
-end;
-
-function inflateInit(strm: z_streamp): int;
-begin
-  Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream));
-end;
-
-function inflateInit2(strm: z_streamp; windowBits: int): int;
-begin
-  Result := inflateInit2_(strm, windowBits, ZLIB_VERSION,
-                          sizeof(z_stream));
-end;
-
-const
-  zlibDLL = 'png32bd.dll';
-
-function adler32; external zlibDLL;
-function crc32; external zlibDLL;
-function deflate; external zlibDLL;
-function deflateCopy; external zlibDLL;
-function deflateEnd; external zlibDLL;
-function deflateInit2_; external zlibDLL;
-function deflateInit_; external zlibDLL;
-function deflateParams; external zlibDLL;
-function deflateReset; external zlibDLL;
-function deflateSetDictionary; external zlibDLL;
-function inflate; external zlibDLL;
-function inflateEnd; external zlibDLL;
-function inflateInit2_; external zlibDLL;
-function inflateInit_; external zlibDLL;
-function inflateReset; external zlibDLL;
-function inflateSetDictionary; external zlibDLL;
-function inflateSync; external zlibDLL;
-
-end.
diff --git a/Lib/zlib/contrib/delphi2/d_zlib.bpr b/Lib/zlib/contrib/delphi2/d_zlib.bpr
deleted file mode 100644
index 78bb25408..000000000
--- a/Lib/zlib/contrib/delphi2/d_zlib.bpr
+++ /dev/null
@@ -1,224 +0,0 @@
-# ---------------------------------------------------------------------------
-!if !$d(BCB)
-BCB = $(MAKEDIR)\..
-!endif
-
-# ---------------------------------------------------------------------------
-# IDE SECTION
-# ---------------------------------------------------------------------------
-# The following section of the project makefile is managed by the BCB IDE.
-# It is recommended to use the IDE to change any of the values in this
-# section.
-# ---------------------------------------------------------------------------
-
-VERSION = BCB.03
-# ---------------------------------------------------------------------------
-PROJECT = d_zlib.lib
-OBJFILES = d_zlib.obj adler32.obj deflate.obj infblock.obj infcodes.obj inffast.obj \
-  inflate.obj inftrees.obj infutil.obj trees.obj
-RESFILES =
-RESDEPEN = $(RESFILES)
-LIBFILES =
-LIBRARIES = VCL35.lib
-SPARELIBS = VCL35.lib
-DEFFILE =
-PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
-  dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
-  NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
-# ---------------------------------------------------------------------------
-PATHCPP = .;
-PATHASM = .;
-PATHPAS = .;
-PATHRC = .;
-DEBUGLIBPATH = $(BCB)\lib\debug
-RELEASELIBPATH = $(BCB)\lib\release
-# ---------------------------------------------------------------------------
-CFLAG1 = -O2 -Ve -d -k- -vi
-CFLAG2 = -I$(BCB)\include;$(BCB)\include\vcl -H=$(BCB)\lib\vcl35.csm
-CFLAG3 = -ff -pr -5
-PFLAGS = -U;$(DEBUGLIBPATH) -I$(BCB)\include;$(BCB)\include\vcl -H -W -$I- -v -JPHN -M
-RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl 
-AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zn
-LFLAGS =
-IFLAGS = -g -Gn
-# ---------------------------------------------------------------------------
-ALLOBJ = c0w32.obj $(OBJFILES)
-ALLRES = $(RESFILES)
-ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib
-# ---------------------------------------------------------------------------
-!!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1040
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[HistoryLists\hlIncludePath]
-Count=2
-Item0=$(BCB)\include
-Item1=$(BCB)\include;$(BCB)\include\vcl
-
-[HistoryLists\hlLibraryPath]
-Count=1
-Item0=$(BCB)\lib\obj;$(BCB)\lib
-
-[HistoryLists\hlDebugSourcePath]
-Count=1
-Item0=$(BCB)\source\vcl
-
-[Debugging]
-DebugSourceDirs=
-
-[Parameters]
-RunParams=
-HostApplication=
-
-!endif
-
- ---------------------------------------------------------------------------
-# MAKE SECTION
-# ---------------------------------------------------------------------------
-# This section of the project file is not used by the BCB IDE.  It is for
-# the benefit of building from the command-line using the MAKE utility.
-# ---------------------------------------------------------------------------
-
-.autodepend
-# ---------------------------------------------------------------------------
-!if !$d(BCC32)
-BCC32 = bcc32
-!endif
-
-!if !$d(DCC32)
-DCC32 = dcc32
-!endif
-
-!if !$d(TASM32)
-TASM32 = tasm32
-!endif
-
-!if !$d(LINKER)
-LINKER = TLib
-!endif
-
-!if !$d(BRCC32)
-BRCC32 = brcc32
-!endif
-# ---------------------------------------------------------------------------
-!if $d(PATHCPP)
-.PATH.CPP = $(PATHCPP)
-.PATH.C   = $(PATHCPP)
-!endif
-
-!if $d(PATHPAS)
-.PATH.PAS = $(PATHPAS)
-!endif
-
-!if $d(PATHASM)
-.PATH.ASM = $(PATHASM)
-!endif
-
-!if $d(PATHRC)
-.PATH.RC  = $(PATHRC)
-!endif
-# ---------------------------------------------------------------------------
-!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1040
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[HistoryLists\hlIncludePath]
-Count=2
-Item0=$(BCB)\include;$(BCB)\include\vcl
-Item1=$(BCB)\include
-
-[HistoryLists\hlLibraryPath]
-Count=1
-Item0=$(BCB)\lib\obj;$(BCB)\lib
-
-[HistoryLists\hlDebugSourcePath]
-Count=1
-Item0=$(BCB)\source\vcl
-
-[Debugging]
-DebugSourceDirs=
-
-[Parameters]
-RunParams=
-HostApplication=
-
-!endif
-
-$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
-    $(BCB)\BIN\$(LINKER) @&&!
-    $(LFLAGS) $(IFLAGS) +
-    $(ALLOBJ), +
-    $(PROJECT),, +
-    $(ALLLIB), +
-    $(DEFFILE), +
-    $(ALLRES)
-!
-# ---------------------------------------------------------------------------
-.pas.hpp:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.pas.obj:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.cpp.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.c.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.asm.obj:
-    $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
-
-.rc.res:
-    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
-# ---------------------------------------------------------------------------
diff --git a/Lib/zlib/contrib/delphi2/d_zlib.cpp b/Lib/zlib/contrib/delphi2/d_zlib.cpp
deleted file mode 100644
index f5dea59b7..000000000
--- a/Lib/zlib/contrib/delphi2/d_zlib.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#include 
-#pragma hdrstop
-//---------------------------------------------------------------------------
-USEUNIT("adler32.c");
-USEUNIT("deflate.c");
-USEUNIT("infblock.c");
-USEUNIT("infcodes.c");
-USEUNIT("inffast.c");
-USEUNIT("inflate.c");
-USEUNIT("inftrees.c");
-USEUNIT("infutil.c");
-USEUNIT("trees.c");
-//---------------------------------------------------------------------------
-#define Library
-
-// To add a file to the library use the Project menu 'Add to Project'.
-
diff --git a/Lib/zlib/contrib/delphi2/readme.txt b/Lib/zlib/contrib/delphi2/readme.txt
deleted file mode 100644
index cbd31620d..000000000
--- a/Lib/zlib/contrib/delphi2/readme.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-These are files used to compile zlib under Borland C++ Builder 3.
-
-zlib.bpg is the main project group that can be loaded in the BCB IDE and
-loads all other *.bpr projects
-
-zlib.bpr is a project used to create a static zlib.lib library with C calling
-convention for functions.
-
-zlib32.bpr creates a zlib32.dll dynamic link library with Windows standard
-calling convention.
-
-d_zlib.bpr creates a set of .obj files with register calling convention.
-These files are used by zlib.pas to create a Delphi unit containing zlib.
-The d_zlib.lib file generated isn't useful and can be deleted.
-
-zlib.cpp, zlib32.cpp and d_zlib.cpp are used by the above projects.
-
diff --git a/Lib/zlib/contrib/delphi2/zlib.bpg b/Lib/zlib/contrib/delphi2/zlib.bpg
deleted file mode 100644
index b6c9acdf8..000000000
--- a/Lib/zlib/contrib/delphi2/zlib.bpg
+++ /dev/null
@@ -1,26 +0,0 @@
-#------------------------------------------------------------------------------
-VERSION = BWS.01
-#------------------------------------------------------------------------------
-!ifndef ROOT
-ROOT = $(MAKEDIR)\..
-!endif
-#------------------------------------------------------------------------------
-MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
-DCC = $(ROOT)\bin\dcc32.exe $**
-BRCC = $(ROOT)\bin\brcc32.exe $**
-#------------------------------------------------------------------------------
-PROJECTS = zlib zlib32 d_zlib
-#------------------------------------------------------------------------------
-default: $(PROJECTS)
-#------------------------------------------------------------------------------
-
-zlib: zlib.bpr
-  $(MAKE)
-
-zlib32: zlib32.bpr
-  $(MAKE)
-
-d_zlib: d_zlib.bpr
-  $(MAKE)
-
-
diff --git a/Lib/zlib/contrib/delphi2/zlib.bpr b/Lib/zlib/contrib/delphi2/zlib.bpr
deleted file mode 100644
index cf3945b25..000000000
--- a/Lib/zlib/contrib/delphi2/zlib.bpr
+++ /dev/null
@@ -1,225 +0,0 @@
-# ---------------------------------------------------------------------------
-!if !$d(BCB)
-BCB = $(MAKEDIR)\..
-!endif
-
-# ---------------------------------------------------------------------------
-# IDE SECTION
-# ---------------------------------------------------------------------------
-# The following section of the project makefile is managed by the BCB IDE.
-# It is recommended to use the IDE to change any of the values in this
-# section.
-# ---------------------------------------------------------------------------
-
-VERSION = BCB.03
-# ---------------------------------------------------------------------------
-PROJECT = zlib.lib
-OBJFILES = zlib.obj adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj \
-  infcodes.obj inffast.obj inflate.obj inftrees.obj infutil.obj trees.obj \
-  uncompr.obj zutil.obj
-RESFILES =
-RESDEPEN = $(RESFILES)
-LIBFILES =
-LIBRARIES = VCL35.lib
-SPARELIBS = VCL35.lib
-DEFFILE =
-PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
-  dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
-  NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
-# ---------------------------------------------------------------------------
-PATHCPP = .;
-PATHASM = .;
-PATHPAS = .;
-PATHRC = .;
-DEBUGLIBPATH = $(BCB)\lib\debug
-RELEASELIBPATH = $(BCB)\lib\release
-# ---------------------------------------------------------------------------
-CFLAG1 = -O2 -Ve -d -k- -vi
-CFLAG2 = -I$(BCB)\include;$(BCB)\include\vcl -H=$(BCB)\lib\vcl35.csm
-CFLAG3 = -ff -5
-PFLAGS = -U;$(DEBUGLIBPATH) -I$(BCB)\include;$(BCB)\include\vcl -H -W -$I- -v -JPHN -M
-RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl 
-AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zn
-LFLAGS =
-IFLAGS = -g -Gn
-# ---------------------------------------------------------------------------
-ALLOBJ = c0w32.obj $(OBJFILES)
-ALLRES = $(RESFILES)
-ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib
-# ---------------------------------------------------------------------------
-!!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1040
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[HistoryLists\hlIncludePath]
-Count=2
-Item0=$(BCB)\include
-Item1=$(BCB)\include;$(BCB)\include\vcl
-
-[HistoryLists\hlLibraryPath]
-Count=1
-Item0=$(BCB)\lib\obj;$(BCB)\lib
-
-[HistoryLists\hlDebugSourcePath]
-Count=1
-Item0=$(BCB)\source\vcl
-
-[Debugging]
-DebugSourceDirs=
-
-[Parameters]
-RunParams=
-HostApplication=
-
-!endif
-
- ---------------------------------------------------------------------------
-# MAKE SECTION
-# ---------------------------------------------------------------------------
-# This section of the project file is not used by the BCB IDE.  It is for
-# the benefit of building from the command-line using the MAKE utility.
-# ---------------------------------------------------------------------------
-
-.autodepend
-# ---------------------------------------------------------------------------
-!if !$d(BCC32)
-BCC32 = bcc32
-!endif
-
-!if !$d(DCC32)
-DCC32 = dcc32
-!endif
-
-!if !$d(TASM32)
-TASM32 = tasm32
-!endif
-
-!if !$d(LINKER)
-LINKER = TLib
-!endif
-
-!if !$d(BRCC32)
-BRCC32 = brcc32
-!endif
-# ---------------------------------------------------------------------------
-!if $d(PATHCPP)
-.PATH.CPP = $(PATHCPP)
-.PATH.C   = $(PATHCPP)
-!endif
-
-!if $d(PATHPAS)
-.PATH.PAS = $(PATHPAS)
-!endif
-
-!if $d(PATHASM)
-.PATH.ASM = $(PATHASM)
-!endif
-
-!if $d(PATHRC)
-.PATH.RC  = $(PATHRC)
-!endif
-# ---------------------------------------------------------------------------
-!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1040
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[HistoryLists\hlIncludePath]
-Count=2
-Item0=$(BCB)\include;$(BCB)\include\vcl
-Item1=$(BCB)\include
-
-[HistoryLists\hlLibraryPath]
-Count=1
-Item0=$(BCB)\lib\obj;$(BCB)\lib
-
-[HistoryLists\hlDebugSourcePath]
-Count=1
-Item0=$(BCB)\source\vcl
-
-[Debugging]
-DebugSourceDirs=
-
-[Parameters]
-RunParams=
-HostApplication=
-
-!endif
-
-$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
-    $(BCB)\BIN\$(LINKER) @&&!
-    $(LFLAGS) $(IFLAGS) +
-    $(ALLOBJ), +
-    $(PROJECT),, +
-    $(ALLLIB), +
-    $(DEFFILE), +
-    $(ALLRES)
-!
-# ---------------------------------------------------------------------------
-.pas.hpp:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.pas.obj:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.cpp.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.c.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.asm.obj:
-    $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
-
-.rc.res:
-    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
-# ---------------------------------------------------------------------------
diff --git a/Lib/zlib/contrib/delphi2/zlib.cpp b/Lib/zlib/contrib/delphi2/zlib.cpp
deleted file mode 100644
index bf6953ba1..000000000
--- a/Lib/zlib/contrib/delphi2/zlib.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#include 
-#pragma hdrstop
-//---------------------------------------------------------------------------
-USEUNIT("adler32.c");
-USEUNIT("compress.c");
-USEUNIT("crc32.c");
-USEUNIT("deflate.c");
-USEUNIT("gzio.c");
-USEUNIT("infblock.c");
-USEUNIT("infcodes.c");
-USEUNIT("inffast.c");
-USEUNIT("inflate.c");
-USEUNIT("inftrees.c");
-USEUNIT("infutil.c");
-USEUNIT("trees.c");
-USEUNIT("uncompr.c");
-USEUNIT("zutil.c");
-//---------------------------------------------------------------------------
-#define Library
-
-// To add a file to the library use the Project menu 'Add to Project'.
-
diff --git a/Lib/zlib/contrib/delphi2/zlib.pas b/Lib/zlib/contrib/delphi2/zlib.pas
deleted file mode 100644
index 10ae4cae2..000000000
--- a/Lib/zlib/contrib/delphi2/zlib.pas
+++ /dev/null
@@ -1,534 +0,0 @@
-{*******************************************************}
-{                                                       }
-{       Delphi Supplemental Components                  }
-{       ZLIB Data Compression Interface Unit            }
-{                                                       }
-{       Copyright (c) 1997 Borland International        }
-{                                                       }
-{*******************************************************}
-
-{ Modified for zlib 1.1.3 by Davide Moretti  Z_STREAM_END do
-      begin
-        P := OutBuf;
-        Inc(OutBytes, 256);
-        ReallocMem(OutBuf, OutBytes);
-        strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
-        strm.avail_out := 256;
-      end;
-    finally
-      CCheck(deflateEnd(strm));
-    end;
-    ReallocMem(OutBuf, strm.total_out);
-    OutBytes := strm.total_out;
-  except
-    FreeMem(OutBuf);
-    raise
-  end;
-end;
-
-
-procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
-  OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
-var
-  strm: TZStreamRec;
-  P: Pointer;
-  BufInc: Integer;
-begin
-  FillChar(strm, sizeof(strm), 0);
-  BufInc := (InBytes + 255) and not 255;
-  if OutEstimate = 0 then
-    OutBytes := BufInc
-  else
-    OutBytes := OutEstimate;
-  GetMem(OutBuf, OutBytes);
-  try
-    strm.next_in := InBuf;
-    strm.avail_in := InBytes;
-    strm.next_out := OutBuf;
-    strm.avail_out := OutBytes;
-    DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
-    try
-      while DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END do
-      begin
-        P := OutBuf;
-        Inc(OutBytes, BufInc);
-        ReallocMem(OutBuf, OutBytes);
-        strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
-        strm.avail_out := BufInc;
-      end;
-    finally
-      DCheck(inflateEnd(strm));
-    end;
-    ReallocMem(OutBuf, strm.total_out);
-    OutBytes := strm.total_out;
-  except
-    FreeMem(OutBuf);
-    raise
-  end;
-end;
-
-
-// TCustomZlibStream
-
-constructor TCustomZLibStream.Create(Strm: TStream);
-begin
-  inherited Create;
-  FStrm := Strm;
-  FStrmPos := Strm.Position;
-end;
-
-procedure TCustomZLibStream.Progress(Sender: TObject);
-begin
-  if Assigned(FOnProgress) then FOnProgress(Sender);
-end;
-
-
-// TCompressionStream
-
-constructor TCompressionStream.Create(CompressionLevel: TCompressionLevel;
-  Dest: TStream);
-const
-  Levels: array [TCompressionLevel] of ShortInt =
-    (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION);
-begin
-  inherited Create(Dest);
-  FZRec.next_out := FBuffer;
-  FZRec.avail_out := sizeof(FBuffer);
-  CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec)));
-end;
-
-destructor TCompressionStream.Destroy;
-begin
-  FZRec.next_in := nil;
-  FZRec.avail_in := 0;
-  try
-    if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
-    while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END)
-      and (FZRec.avail_out = 0) do
-    begin
-      FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
-      FZRec.next_out := FBuffer;
-      FZRec.avail_out := sizeof(FBuffer);
-    end;
-    if FZRec.avail_out < sizeof(FBuffer) then
-      FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out);
-  finally
-    deflateEnd(FZRec);
-  end;
-  inherited Destroy;
-end;
-
-function TCompressionStream.Read(var Buffer; Count: Longint): Longint;
-begin
-  raise ECompressionError.Create('Invalid stream operation');
-end;
-
-function TCompressionStream.Write(const Buffer; Count: Longint): Longint;
-begin
-  FZRec.next_in := @Buffer;
-  FZRec.avail_in := Count;
-  if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
-  while (FZRec.avail_in > 0) do
-  begin
-    CCheck(deflate(FZRec, 0));
-    if FZRec.avail_out = 0 then
-    begin
-      FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
-      FZRec.next_out := FBuffer;
-      FZRec.avail_out := sizeof(FBuffer);
-      FStrmPos := FStrm.Position;
-      Progress(Self);
-    end;
-  end;
-  Result := Count;
-end;
-
-function TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
-begin
-  if (Offset = 0) and (Origin = soFromCurrent) then
-    Result := FZRec.total_in
-  else
-    raise ECompressionError.Create('Invalid stream operation');
-end;
-
-function TCompressionStream.GetCompressionRate: Single;
-begin
-  if FZRec.total_in = 0 then
-    Result := 0
-  else
-    Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0;
-end;
-
-
-// TDecompressionStream
-
-constructor TDecompressionStream.Create(Source: TStream);
-begin
-  inherited Create(Source);
-  FZRec.next_in := FBuffer;
-  FZRec.avail_in := 0;
-  DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec)));
-end;
-
-destructor TDecompressionStream.Destroy;
-begin
-  inflateEnd(FZRec);
-  inherited Destroy;
-end;
-
-function TDecompressionStream.Read(var Buffer; Count: Longint): Longint;
-begin
-  FZRec.next_out := @Buffer;
-  FZRec.avail_out := Count;
-  if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
-  while (FZRec.avail_out > 0) do
-  begin
-    if FZRec.avail_in = 0 then
-    begin
-      FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
-      if FZRec.avail_in = 0 then
-        begin
-          Result := Count - FZRec.avail_out;
-          Exit;
-        end;
-      FZRec.next_in := FBuffer;
-      FStrmPos := FStrm.Position;
-      Progress(Self);
-    end;
-    DCheck(inflate(FZRec, 0));
-  end;
-  Result := Count;
-end;
-
-function TDecompressionStream.Write(const Buffer; Count: Longint): Longint;
-begin
-  raise EDecompressionError.Create('Invalid stream operation');
-end;
-
-function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
-var
-  I: Integer;
-  Buf: array [0..4095] of Char;
-begin
-  if (Offset = 0) and (Origin = soFromBeginning) then
-  begin
-    DCheck(inflateReset(FZRec));
-    FZRec.next_in := FBuffer;
-    FZRec.avail_in := 0;
-    FStrm.Position := 0;
-    FStrmPos := 0;
-  end
-  else if ( (Offset >= 0) and (Origin = soFromCurrent)) or
-          ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then
-  begin
-    if Origin = soFromBeginning then Dec(Offset, FZRec.total_out);
-    if Offset > 0 then
-    begin
-      for I := 1 to Offset div sizeof(Buf) do
-        ReadBuffer(Buf, sizeof(Buf));
-      ReadBuffer(Buf, Offset mod sizeof(Buf));
-    end;
-  end
-  else
-    raise EDecompressionError.Create('Invalid stream operation');
-  Result := FZRec.total_out;
-end;
-
-end.
diff --git a/Lib/zlib/contrib/delphi2/zlib32.bpr b/Lib/zlib/contrib/delphi2/zlib32.bpr
deleted file mode 100644
index cabcec449..000000000
--- a/Lib/zlib/contrib/delphi2/zlib32.bpr
+++ /dev/null
@@ -1,174 +0,0 @@
-# ---------------------------------------------------------------------------
-!if !$d(BCB)
-BCB = $(MAKEDIR)\..
-!endif
-
-# ---------------------------------------------------------------------------
-# IDE SECTION
-# ---------------------------------------------------------------------------
-# The following section of the project makefile is managed by the BCB IDE.
-# It is recommended to use the IDE to change any of the values in this
-# section.
-# ---------------------------------------------------------------------------
-
-VERSION = BCB.03
-# ---------------------------------------------------------------------------
-PROJECT = zlib32.dll
-OBJFILES = zlib32.obj adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj \
-  infcodes.obj inffast.obj inflate.obj inftrees.obj infutil.obj trees.obj \
-  uncompr.obj zutil.obj
-RESFILES =
-RESDEPEN = $(RESFILES)
-LIBFILES =
-LIBRARIES = 
-SPARELIBS = 
-DEFFILE =
-PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
-  dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
-  NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
-# ---------------------------------------------------------------------------
-PATHCPP = .;
-PATHASM = .;
-PATHPAS = .;
-PATHRC = .;
-DEBUGLIBPATH = $(BCB)\lib\debug
-RELEASELIBPATH = $(BCB)\lib\release
-# ---------------------------------------------------------------------------
-CFLAG1 = -WD -O2 -Ve -d -k- -vi -c -tWD
-CFLAG2 = -D_NO_VCL;ZLIB_DLL -I$(BCB)\include
-CFLAG3 = -ff -5
-PFLAGS = -D_NO_VCL;ZLIB_DLL -U$(BCB)\lib;$(RELEASELIBPATH) -I$(BCB)\include -$I- -v \
-  -JPHN -M
-RFLAGS = -D_NO_VCL;ZLIB_DLL -i$(BCB)\include
-AFLAGS = /i$(BCB)\include /d_NO_VCL /dZLIB_DLL /mx /w2 /zn
-LFLAGS = -L$(BCB)\lib;$(RELEASELIBPATH) -aa -Tpd -x -Gi
-IFLAGS = -Gn -g
-# ---------------------------------------------------------------------------
-ALLOBJ = c0d32.obj $(OBJFILES)
-ALLRES = $(RESFILES)
-ALLLIB = $(LIBFILES)  import32.lib cw32mt.lib
-# ---------------------------------------------------------------------------
-!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=1
-Locale=1040
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=DLL (GUI)
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[HistoryLists\hlIncludePath]
-Count=1
-Item0=$(BCB)\include
-
-[HistoryLists\hlLibraryPath]
-Count=1
-Item0=$(BCB)\lib
-
-[HistoryLists\hlConditionals]
-Count=1
-Item0=_NO_VCL;ZLIB_DLL
-
-[Debugging]
-DebugSourceDirs=
-
-[Parameters]
-RunParams=
-HostApplication=
-
-!endif
-
-# ---------------------------------------------------------------------------
-# MAKE SECTION
-# ---------------------------------------------------------------------------
-# This section of the project file is not used by the BCB IDE.  It is for
-# the benefit of building from the command-line using the MAKE utility.
-# ---------------------------------------------------------------------------
-
-.autodepend
-# ---------------------------------------------------------------------------
-!if !$d(BCC32)
-BCC32 = bcc32
-!endif
-
-!if !$d(DCC32)
-DCC32 = dcc32
-!endif
-
-!if !$d(TASM32)
-TASM32 = tasm32
-!endif
-
-!if !$d(LINKER)
-LINKER = ilink32
-!endif
-
-!if !$d(BRCC32)
-BRCC32 = brcc32
-!endif
-# ---------------------------------------------------------------------------
-!if $d(PATHCPP)
-.PATH.CPP = $(PATHCPP)
-.PATH.C   = $(PATHCPP)
-!endif
-
-!if $d(PATHPAS)
-.PATH.PAS = $(PATHPAS)
-!endif
-
-!if $d(PATHASM)
-.PATH.ASM = $(PATHASM)
-!endif
-
-!if $d(PATHRC)
-.PATH.RC  = $(PATHRC)
-!endif
-# ---------------------------------------------------------------------------
-$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
-    $(BCB)\BIN\$(LINKER) @&&!
-    $(LFLAGS) $(IFLAGS) +
-    $(ALLOBJ), +
-    $(PROJECT),, +
-    $(ALLLIB), +
-    $(DEFFILE), +
-    $(ALLRES)
-!
-# ---------------------------------------------------------------------------
-.pas.hpp:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.pas.obj:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.cpp.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.c.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.asm.obj:
-    $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
-
-.rc.res:
-    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
-# ---------------------------------------------------------------------------
diff --git a/Lib/zlib/contrib/delphi2/zlib32.cpp b/Lib/zlib/contrib/delphi2/zlib32.cpp
deleted file mode 100644
index 7372f6b98..000000000
--- a/Lib/zlib/contrib/delphi2/zlib32.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-
-#include 
-#pragma hdrstop
-#include 
-
-
-//---------------------------------------------------------------------------
-//   Important note about DLL memory management in a VCL DLL:
-//
-//
-//
-// If your DLL uses VCL and exports any functions that pass VCL String objects
-// (or structs/classes containing nested Strings) as parameter or function
-// results, you will need to build both your DLL project and any EXE projects
-// that use your DLL with the dynamic RTL (the RTL DLL).  This will change your
-// DLL and its calling EXE's to use BORLNDMM.DLL as their memory manager. In
-// these cases, the file BORLNDMM.DLL should be deployed along with your DLL
-// and the RTL DLL (CP3240MT.DLL). To avoid the requiring BORLNDMM.DLL in
-// these situations, pass string information using "char *" or ShortString
-// parameters and then link with the static RTL.
-//
-//---------------------------------------------------------------------------
-USEUNIT("adler32.c");
-USEUNIT("compress.c");
-USEUNIT("crc32.c");
-USEUNIT("deflate.c");
-USEUNIT("gzio.c");
-USEUNIT("infblock.c");
-USEUNIT("infcodes.c");
-USEUNIT("inffast.c");
-USEUNIT("inflate.c");
-USEUNIT("inftrees.c");
-USEUNIT("infutil.c");
-USEUNIT("trees.c");
-USEUNIT("uncompr.c");
-USEUNIT("zutil.c");
-//---------------------------------------------------------------------------
-#pragma argsused
-int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
-{
-        return 1;
-}
diff --git a/Lib/zlib/contrib/iostream/test.cpp b/Lib/zlib/contrib/iostream/test.cpp
deleted file mode 100644
index 7d265b3b5..000000000
--- a/Lib/zlib/contrib/iostream/test.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-
-#include "zfstream.h"
-
-int main() {
-
-  // Construct a stream object with this filebuffer.  Anything sent
-  // to this stream will go to standard out.
-  gzofstream os( 1, ios::out );
-
-  // This text is getting compressed and sent to stdout.
-  // To prove this, run 'test | zcat'.
-  os << "Hello, Mommy" << endl;
-
-  os << setcompressionlevel( Z_NO_COMPRESSION );
-  os << "hello, hello, hi, ho!" << endl;
-
-  setcompressionlevel( os, Z_DEFAULT_COMPRESSION )
-    << "I'm compressing again" << endl;
-
-  os.close();
-
-  return 0;
-
-}
diff --git a/Lib/zlib/contrib/iostream/zfstream.cpp b/Lib/zlib/contrib/iostream/zfstream.cpp
deleted file mode 100644
index a690bbefc..000000000
--- a/Lib/zlib/contrib/iostream/zfstream.cpp
+++ /dev/null
@@ -1,329 +0,0 @@
-
-#include 
-#include "zfstream.h"
-
-gzfilebuf::gzfilebuf() :
-  file(NULL),
-  mode(0),
-  own_file_descriptor(0)
-{ }
-
-gzfilebuf::~gzfilebuf() {
-
-  sync();
-  if ( own_file_descriptor )
-    close();
-
-}
-
-gzfilebuf *gzfilebuf::open( const char *name,
-			    int io_mode ) {
-
-  if ( is_open() )
-    return NULL;
-
-  char char_mode[10];
-  char *p;
-  memset(char_mode,'\0',10);
-  p = char_mode;
-
-  if ( io_mode & ios::in ) {
-    mode = ios::in;
-    *p++ = 'r';
-  } else if ( io_mode & ios::app ) {
-    mode = ios::app;
-    *p++ = 'a';
-  } else {
-    mode = ios::out;
-    *p++ = 'w';
-  }
-
-  if ( io_mode & ios::binary ) {
-    mode |= ios::binary;
-    *p++ = 'b';
-  }
-
-  // Hard code the compression level
-  if ( io_mode & (ios::out|ios::app )) {
-    *p++ = '9';
-  }
-
-  if ( (file = gzopen(name, char_mode)) == NULL )
-    return NULL;
-
-  own_file_descriptor = 1;
-
-  return this;
-
-}
-
-gzfilebuf *gzfilebuf::attach( int file_descriptor,
-			      int io_mode ) {
-
-  if ( is_open() )
-    return NULL;
-
-  char char_mode[10];
-  char *p;
-  memset(char_mode,'\0',10);
-  p = char_mode;
-
-  if ( io_mode & ios::in ) {
-    mode = ios::in;
-    *p++ = 'r';
-  } else if ( io_mode & ios::app ) {
-    mode = ios::app;
-    *p++ = 'a';
-  } else {
-    mode = ios::out;
-    *p++ = 'w';
-  }
-
-  if ( io_mode & ios::binary ) {
-    mode |= ios::binary;
-    *p++ = 'b';
-  }
-
-  // Hard code the compression level
-  if ( io_mode & (ios::out|ios::app )) {
-    *p++ = '9';
-  }
-
-  if ( (file = gzdopen(file_descriptor, char_mode)) == NULL )
-    return NULL;
-
-  own_file_descriptor = 0;
-
-  return this;
-
-}
-
-gzfilebuf *gzfilebuf::close() {
-
-  if ( is_open() ) {
-
-    sync();
-    gzclose( file );
-    file = NULL;
-
-  }
-
-  return this;
-
-}
-
-int gzfilebuf::setcompressionlevel( short comp_level ) {
-
-  return gzsetparams(file, comp_level, -2);
-
-}
-
-int gzfilebuf::setcompressionstrategy( short comp_strategy ) {
-
-  return gzsetparams(file, -2, comp_strategy);
-
-}
-
-
-streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) {
-
-  return streampos(EOF);
-
-}
-
-int gzfilebuf::underflow() {
-
-  // If the file hasn't been opened for reading, error.
-  if ( !is_open() || !(mode & ios::in) )
-    return EOF;
-
-  // if a buffer doesn't exists, allocate one.
-  if ( !base() ) {
-
-    if ( (allocate()) == EOF )
-      return EOF;
-    setp(0,0);
-
-  } else {
-
-    if ( in_avail() )
-      return (unsigned char) *gptr();
-
-    if ( out_waiting() ) {
-      if ( flushbuf() == EOF )
-	return EOF;
-    }
-
-  }
-
-  // Attempt to fill the buffer.
-
-  int result = fillbuf();
-  if ( result == EOF ) {
-    // disable get area
-    setg(0,0,0);
-    return EOF;
-  }
-
-  return (unsigned char) *gptr();
-
-}
-
-int gzfilebuf::overflow( int c ) {
-
-  if ( !is_open() || !(mode & ios::out) )
-    return EOF;
-
-  if ( !base() ) {
-    if ( allocate() == EOF )
-      return EOF;
-    setg(0,0,0);
-  } else {
-    if (in_avail()) {
-	return EOF;
-    }
-    if (out_waiting()) {
-      if (flushbuf() == EOF)
-	return EOF;
-    }
-  }
-
-  int bl = blen();
-  setp( base(), base() + bl);
-
-  if ( c != EOF ) {
-
-    *pptr() = c;
-    pbump(1);
-
-  }
-
-  return 0;
-
-}
-
-int gzfilebuf::sync() {
-
-  if ( !is_open() )
-    return EOF;
-
-  if ( out_waiting() )
-    return flushbuf();
-
-  return 0;
-
-}
-
-int gzfilebuf::flushbuf() {
-
-  int n;
-  char *q;
-
-  q = pbase();
-  n = pptr() - q;
-
-  if ( gzwrite( file, q, n) < n )
-    return EOF;
-
-  setp(0,0);
-
-  return 0;
-
-}
-
-int gzfilebuf::fillbuf() {
-
-  int required;
-  char *p;
-
-  p = base();
-
-  required = blen();
-
-  int t = gzread( file, p, required );
-
-  if ( t <= 0) return EOF;
-
-  setg( base(), base(), base()+t);
-
-  return t;
-
-}
-
-gzfilestream_common::gzfilestream_common() :
-  ios( gzfilestream_common::rdbuf() )
-{ }
-
-gzfilestream_common::~gzfilestream_common()
-{ }
-
-void gzfilestream_common::attach( int fd, int io_mode ) {
-
-  if ( !buffer.attach( fd, io_mode) )
-    clear( ios::failbit | ios::badbit );
-  else
-    clear();
-
-}
-
-void gzfilestream_common::open( const char *name, int io_mode ) {
-
-  if ( !buffer.open( name, io_mode ) )
-    clear( ios::failbit | ios::badbit );
-  else
-    clear();
-
-}
-
-void gzfilestream_common::close() {
-
-  if ( !buffer.close() )
-    clear( ios::failbit | ios::badbit );
-
-}
-
-gzfilebuf *gzfilestream_common::rdbuf() {
-
-  return &buffer;
-
-}
-     
-gzifstream::gzifstream() :
-  ios( gzfilestream_common::rdbuf() )
-{
-  clear( ios::badbit );
-}
-
-gzifstream::gzifstream( const char *name, int io_mode ) :
-  ios( gzfilestream_common::rdbuf() )
-{
-  gzfilestream_common::open( name, io_mode );
-}
-
-gzifstream::gzifstream( int fd, int io_mode ) :
-  ios( gzfilestream_common::rdbuf() )
-{
-  gzfilestream_common::attach( fd, io_mode );
-}
-
-gzifstream::~gzifstream() { }
-
-gzofstream::gzofstream() :
-  ios( gzfilestream_common::rdbuf() )
-{
-  clear( ios::badbit );
-}
-
-gzofstream::gzofstream( const char *name, int io_mode ) :
-  ios( gzfilestream_common::rdbuf() )
-{
-  gzfilestream_common::open( name, io_mode );
-}
-
-gzofstream::gzofstream( int fd, int io_mode ) :
-  ios( gzfilestream_common::rdbuf() )
-{
-  gzfilestream_common::attach( fd, io_mode );
-}
-
-gzofstream::~gzofstream() { }
diff --git a/Lib/zlib/contrib/iostream/zfstream.h b/Lib/zlib/contrib/iostream/zfstream.h
deleted file mode 100644
index c87fa08e9..000000000
--- a/Lib/zlib/contrib/iostream/zfstream.h
+++ /dev/null
@@ -1,142 +0,0 @@
-
-#ifndef _zfstream_h
-#define _zfstream_h
-
-#include 
-#include "zlib.h"
-
-class gzfilebuf : public streambuf {
-
-public:
-
-  gzfilebuf( );
-  virtual ~gzfilebuf();
-
-  gzfilebuf *open( const char *name, int io_mode );
-  gzfilebuf *attach( int file_descriptor, int io_mode );
-  gzfilebuf *close();
-
-  int setcompressionlevel( short comp_level );
-  int setcompressionstrategy( short comp_strategy );
-
-  inline int is_open() const { return (file !=NULL); }
-
-  virtual streampos seekoff( streamoff, ios::seek_dir, int );
-
-  virtual int sync();
-
-protected:
-
-  virtual int underflow();
-  virtual int overflow( int = EOF );
-
-private:
-
-  gzFile file;
-  short mode;
-  short own_file_descriptor;
-
-  int flushbuf();
-  int fillbuf();
-
-};
-
-class gzfilestream_common : virtual public ios {
-
-  friend class gzifstream;
-  friend class gzofstream;
-  friend gzofstream &setcompressionlevel( gzofstream &, int );
-  friend gzofstream &setcompressionstrategy( gzofstream &, int );
-
-public:
-  virtual ~gzfilestream_common();
-
-  void attach( int fd, int io_mode );
-  void open( const char *name, int io_mode );
-  void close();
-
-protected:
-  gzfilestream_common();
-
-private:
-  gzfilebuf *rdbuf();
-
-  gzfilebuf buffer;
-
-};
-
-class gzifstream : public gzfilestream_common, public istream {
-
-public:
-
-  gzifstream();
-  gzifstream( const char *name, int io_mode = ios::in );
-  gzifstream( int fd, int io_mode = ios::in );
-
-  virtual ~gzifstream();
-
-};
-
-class gzofstream : public gzfilestream_common, public ostream {
-
-public:
-
-  gzofstream();
-  gzofstream( const char *name, int io_mode = ios::out );
-  gzofstream( int fd, int io_mode = ios::out );
-
-  virtual ~gzofstream();
-
-};
-
-template class gzomanip {
-  friend gzofstream &operator<<(gzofstream &, const gzomanip &);
-public:
-  gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { }
-private:
-  gzofstream &(*func)(gzofstream &, T);
-  T val;
-};
-
-template gzofstream &operator<<(gzofstream &s,
-					 const gzomanip &m) {
-  return (*m.func)(s, m.val);
-  
-}
-
-inline gzofstream &setcompressionlevel( gzofstream &s, int l ) {
-  (s.rdbuf())->setcompressionlevel(l);
-  return s;
-}
-
-inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) {
-  (s.rdbuf())->setcompressionstrategy(l);
-  return s;
-}
-
-inline gzomanip setcompressionlevel(int l)
-{
-  return gzomanip(&setcompressionlevel,l);
-}
-
-inline gzomanip setcompressionstrategy(int l)
-{
-  return gzomanip(&setcompressionstrategy,l);
-}
-
-#endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Lib/zlib/contrib/iostream2/zstream.h b/Lib/zlib/contrib/iostream2/zstream.h
deleted file mode 100644
index 861ef2bad..000000000
--- a/Lib/zlib/contrib/iostream2/zstream.h
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- *
- * Copyright (c) 1997
- * Christian Michelsen Research AS
- * Advanced Computing
- * Fantoftvegen 38, 5036 BERGEN, Norway
- * http://www.cmr.no
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Christian Michelsen Research AS makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- */
-
-#ifndef ZSTREAM__H
-#define ZSTREAM__H
-
-/*
- * zstream.h - C++ interface to the 'zlib' general purpose compression library
- * $Id$
- */
-
-#include 
-#include 
-#include 
-#include "zlib.h"
-
-#if defined(_WIN32)
-#   include 
-#   include 
-#   define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
-#else
-#   define SET_BINARY_MODE(file)
-#endif
-
-class zstringlen {
-public:
-    zstringlen(class izstream&);
-    zstringlen(class ozstream&, const char*);
-    size_t value() const { return val.word; }
-private:
-    struct Val { unsigned char byte; size_t word; } val;
-};
-
-//  ----------------------------- izstream -----------------------------
-
-class izstream
-{
-    public:
-        izstream() : m_fp(0) {}
-        izstream(FILE* fp) : m_fp(0) { open(fp); }
-        izstream(const char* name) : m_fp(0) { open(name); }
-        ~izstream() { close(); }
-
-        /* Opens a gzip (.gz) file for reading.
-         * open() can be used to read a file which is not in gzip format;
-         * in this case read() will directly read from the file without
-         * decompression. errno can be checked to distinguish two error
-         * cases (if errno is zero, the zlib error is Z_MEM_ERROR).
-         */
-        void open(const char* name) {
-            if (m_fp) close();
-            m_fp = ::gzopen(name, "rb");
-        }
-
-        void open(FILE* fp) {
-            SET_BINARY_MODE(fp);
-            if (m_fp) close();
-            m_fp = ::gzdopen(fileno(fp), "rb");
-        }
-
-        /* Flushes all pending input if necessary, closes the compressed file
-         * and deallocates all the (de)compression state. The return value is
-         * the zlib error number (see function error() below).
-         */
-        int close() {
-            int r = ::gzclose(m_fp);
-            m_fp = 0; return r;
-        }
-
-        /* Binary read the given number of bytes from the compressed file.
-         */
-        int read(void* buf, size_t len) {
-            return ::gzread(m_fp, buf, len);
-        }
-
-        /* Returns the error message for the last error which occurred on the
-         * given compressed file. errnum is set to zlib error number. If an
-         * error occurred in the file system and not in the compression library,
-         * errnum is set to Z_ERRNO and the application may consult errno
-         * to get the exact error code.
-         */
-        const char* error(int* errnum) {
-            return ::gzerror(m_fp, errnum);
-        }
-
-        gzFile fp() { return m_fp; }
-
-    private:
-        gzFile m_fp;
-};
-
-/*
- * Binary read the given (array of) object(s) from the compressed file.
- * If the input file was not in gzip format, read() copies the objects number
- * of bytes into the buffer.
- * returns the number of uncompressed bytes actually read
- * (0 for end of file, -1 for error).
- */
-template 
-inline int read(izstream& zs, T* x, Items items) {
-    return ::gzread(zs.fp(), x, items*sizeof(T));
-}
-
-/*
- * Binary input with the '>' operator.
- */
-template 
-inline izstream& operator>(izstream& zs, T& x) {
-    ::gzread(zs.fp(), &x, sizeof(T));
-    return zs;
-}
-
-
-inline zstringlen::zstringlen(izstream& zs) {
-    zs > val.byte;
-    if (val.byte == 255) zs > val.word;
-    else val.word = val.byte;
-}
-
-/*
- * Read length of string + the string with the '>' operator.
- */
-inline izstream& operator>(izstream& zs, char* x) {
-    zstringlen len(zs);
-    ::gzread(zs.fp(), x, len.value());
-    x[len.value()] = '\0';
-    return zs;
-}
-
-inline char* read_string(izstream& zs) {
-    zstringlen len(zs);
-    char* x = new char[len.value()+1];
-    ::gzread(zs.fp(), x, len.value());
-    x[len.value()] = '\0';
-    return x;
-}
-
-// ----------------------------- ozstream -----------------------------
-
-class ozstream
-{
-    public:
-        ozstream() : m_fp(0), m_os(0) {
-        }
-        ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION)
-            : m_fp(0), m_os(0) {
-            open(fp, level);
-        }
-        ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION)
-            : m_fp(0), m_os(0) {
-            open(name, level);
-        }
-        ~ozstream() {
-            close();
-        }
-
-        /* Opens a gzip (.gz) file for writing.
-         * The compression level parameter should be in 0..9
-         * errno can be checked to distinguish two error cases
-         * (if errno is zero, the zlib error is Z_MEM_ERROR).
-         */
-        void open(const char* name, int level = Z_DEFAULT_COMPRESSION) {
-            char mode[4] = "wb\0";
-            if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level;
-            if (m_fp) close();
-            m_fp = ::gzopen(name, mode);
-        }
-
-        /* open from a FILE pointer.
-         */
-        void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) {
-            SET_BINARY_MODE(fp);
-            char mode[4] = "wb\0";
-            if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level;
-            if (m_fp) close();
-            m_fp = ::gzdopen(fileno(fp), mode);
-        }
-
-        /* Flushes all pending output if necessary, closes the compressed file
-         * and deallocates all the (de)compression state. The return value is
-         * the zlib error number (see function error() below).
-         */
-        int close() {
-            if (m_os) {
-                ::gzwrite(m_fp, m_os->str(), m_os->pcount());
-                delete[] m_os->str(); delete m_os; m_os = 0;
-            }
-            int r = ::gzclose(m_fp); m_fp = 0; return r;
-        }
-
-        /* Binary write the given number of bytes into the compressed file.
-         */
-        int write(const void* buf, size_t len) {
-            return ::gzwrite(m_fp, (voidp) buf, len);
-        }
-
-        /* Flushes all pending output into the compressed file. The parameter
-         * _flush is as in the deflate() function. The return value is the zlib
-         * error number (see function gzerror below). flush() returns Z_OK if
-         * the flush_ parameter is Z_FINISH and all output could be flushed.
-         * flush() should be called only when strictly necessary because it can
-         * degrade compression.
-         */
-        int flush(int _flush) {
-            os_flush();
-            return ::gzflush(m_fp, _flush);
-        }
-
-        /* Returns the error message for the last error which occurred on the
-         * given compressed file. errnum is set to zlib error number. If an
-         * error occurred in the file system and not in the compression library,
-         * errnum is set to Z_ERRNO and the application may consult errno
-         * to get the exact error code.
-         */
-        const char* error(int* errnum) {
-            return ::gzerror(m_fp, errnum);
-        }
-
-        gzFile fp() { return m_fp; }
-
-        ostream& os() {
-            if (m_os == 0) m_os = new ostrstream;
-            return *m_os;
-        }
-
-        void os_flush() {
-            if (m_os && m_os->pcount()>0) {
-                ostrstream* oss = new ostrstream;
-                oss->fill(m_os->fill());
-                oss->flags(m_os->flags());
-                oss->precision(m_os->precision());
-                oss->width(m_os->width());
-                ::gzwrite(m_fp, m_os->str(), m_os->pcount());
-                delete[] m_os->str(); delete m_os; m_os = oss;
-            }
-        }
-
-    private:
-        gzFile m_fp;
-        ostrstream* m_os;
-};
-
-/*
- * Binary write the given (array of) object(s) into the compressed file.
- * returns the number of uncompressed bytes actually written
- * (0 in case of error).
- */
-template 
-inline int write(ozstream& zs, const T* x, Items items) {
-    return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T));
-}
-
-/*
- * Binary output with the '<' operator.
- */
-template 
-inline ozstream& operator<(ozstream& zs, const T& x) {
-    ::gzwrite(zs.fp(), (voidp) &x, sizeof(T));
-    return zs;
-}
-
-inline zstringlen::zstringlen(ozstream& zs, const char* x) {
-    val.byte = 255;  val.word = ::strlen(x);
-    if (val.word < 255) zs < (val.byte = val.word);
-    else zs < val;
-}
-
-/*
- * Write length of string + the string with the '<' operator.
- */
-inline ozstream& operator<(ozstream& zs, const char* x) {
-    zstringlen len(zs, x);
-    ::gzwrite(zs.fp(), (voidp) x, len.value());
-    return zs;
-}
-
-#ifdef _MSC_VER
-inline ozstream& operator<(ozstream& zs, char* const& x) {
-    return zs < (const char*) x;
-}
-#endif
-
-/*
- * Ascii write with the << operator;
- */
-template 
-inline ostream& operator<<(ozstream& zs, const T& x) {
-    zs.os_flush();
-    return zs.os() << x;
-}
-
-#endif
diff --git a/Lib/zlib/contrib/iostream2/zstream_test.cpp b/Lib/zlib/contrib/iostream2/zstream_test.cpp
deleted file mode 100644
index 5bbd56c3a..000000000
--- a/Lib/zlib/contrib/iostream2/zstream_test.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#include "zstream.h"
-#include 
-#include 
-#include 
-
-void main() {
-	char h[256] = "Hello";
-	char* g = "Goodbye";
-	ozstream out("temp.gz");
-    out < "This works well" < h < g;
-    out.close();
-
-    izstream in("temp.gz"); // read it back
-    char *x = read_string(in), *y = new char[256], z[256];
-    in > y > z;
-    in.close();
-    cout << x << endl << y << endl << z << endl;
-
-    out.open("temp.gz"); // try ascii output; zcat temp.gz to see the results
-    out << setw(50) << setfill('#') << setprecision(20) << x << endl << y << endl << z << endl;
-    out << z << endl << y << endl << x << endl;
-    out << 1.1234567890123456789 << endl;
-
-    delete[] x; delete[] y;
-}
diff --git a/Lib/zlib/contrib/minizip/ChangeLogUnzip b/Lib/zlib/contrib/minizip/ChangeLogUnzip
deleted file mode 100644
index 9987c543c..000000000
--- a/Lib/zlib/contrib/minizip/ChangeLogUnzip
+++ /dev/null
@@ -1,38 +0,0 @@
-Change in 0.15: (19 Mar 98)
-- fix memory leak in minizip.c
-
-Change in 0.14: (10 Mar 98)
-- fix bugs in minizip.c sample for zipping big file
-- fix problem in month in date handling
-- fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for 
-    comment handling
-
-Change in 0.13: (6 Mar 98)
-- fix bugs in zip.c
-- add real minizip sample
-
-Change in 0.12: (4 Mar 98)
-- add zip.c and zip.h for creates .zip file
-- fix change_file_date in miniunz.c for Unix (Jean-loup Gailly)
-- fix miniunz.c for file without specific record for directory
-
-Change in 0.11: (3 Mar 98)
-- fix bug in unzGetCurrentFileInfo for get extra field and comment
-- enhance miniunz sample, remove the bad unztst.c sample
-
-Change in 0.10: (2 Mar 98)
-- fix bug in unzReadCurrentFile
-- rename unzip* to unz* function and structure
-- remove Windows-like hungary notation variable name
-- modify some structure in unzip.h
-- add somes comment in source
-- remove unzipGetcCurrentFile function
-- replace ZUNZEXPORT by ZEXPORT
-- add unzGetLocalExtrafield for get the local extrafield info
-- add a new sample, miniunz.c
-
-Change in 0.4: (25 Feb 98)
-- suppress the type unzipFileInZip. 
-  Only on file in the zipfile can be open at the same time
-- fix somes typo in code
-- added tm_unz structure in unzip_file_info (date/time in readable format)
diff --git a/Lib/zlib/contrib/minizip/Makefile b/Lib/zlib/contrib/minizip/Makefile
deleted file mode 100644
index a1dfc1614..000000000
--- a/Lib/zlib/contrib/minizip/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-CC=cc
-CFLAGS=-O -I../..
-
-UNZ_OBJS = miniunz.o unzip.o ../../libz.a
-ZIP_OBJS = minizip.o zip.o   ../../libz.a
-
-.c.o:
-	$(CC) -c $(CFLAGS) $*.c
-
-all: miniunz minizip
-
-miniunz:  $(UNZ_OBJS)
-	$(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
-
-minizip:  $(ZIP_OBJS)
-	$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
-
-test:	miniunz minizip
-	./minizip test readme.txt
-	./miniunz -l test.zip
-	mv readme.txt readme.old
-	./miniunz test.zip
-
-clean:
-	/bin/rm -f *.o *~ minizip miniunz
diff --git a/Lib/zlib/contrib/minizip/miniunz.c b/Lib/zlib/contrib/minizip/miniunz.c
deleted file mode 100644
index f3b783287..000000000
--- a/Lib/zlib/contrib/minizip/miniunz.c
+++ /dev/null
@@ -1,508 +0,0 @@
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#ifdef unix
-# include 
-# include 
-#else
-# include 
-# include 
-#endif
-
-#include "unzip.h"
-
-#define CASESENSITIVITY (0)
-#define WRITEBUFFERSIZE (8192)
-
-/*
-  mini unzip, demo of unzip package
-
-  usage :
-  Usage : miniunz [-exvlo] file.zip [file_to_extract]
-
-  list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT
-    if it exists
-*/
-
-
-/* change_file_date : change the date/time of a file
-    filename : the filename of the file where date/time must be modified
-    dosdate : the new date at the MSDos format (4 bytes)
-    tmu_date : the SAME new date at the tm_unz format */
-void change_file_date(filename,dosdate,tmu_date)
-	const char *filename;
-	uLong dosdate;
-	tm_unz tmu_date;
-{
-#ifdef WIN32
-  HANDLE hFile;
-  FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
-
-  hFile = CreateFile(filename,GENERIC_READ | GENERIC_WRITE,
-                      0,NULL,OPEN_EXISTING,0,NULL);
-  GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);
-  DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);
-  LocalFileTimeToFileTime(&ftLocal,&ftm);
-  SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
-  CloseHandle(hFile);
-#else
-#ifdef unix
-  struct utimbuf ut;
-  struct tm newdate;
-  newdate.tm_sec = tmu_date.tm_sec;
-  newdate.tm_min=tmu_date.tm_min;
-  newdate.tm_hour=tmu_date.tm_hour;
-  newdate.tm_mday=tmu_date.tm_mday;
-  newdate.tm_mon=tmu_date.tm_mon;
-  if (tmu_date.tm_year > 1900)
-      newdate.tm_year=tmu_date.tm_year - 1900;
-  else
-      newdate.tm_year=tmu_date.tm_year ;
-  newdate.tm_isdst=-1;
-
-  ut.actime=ut.modtime=mktime(&newdate);
-  utime(filename,&ut);
-#endif
-#endif
-}
-
-
-/* mymkdir and change_file_date are not 100 % portable
-   As I don't know well Unix, I wait feedback for the unix portion */
-
-int mymkdir(dirname)
-	const char* dirname;
-{
-    int ret=0;
-#ifdef WIN32
-	ret = mkdir(dirname);
-#else
-#ifdef unix
-	ret = mkdir (dirname,0775);
-#endif
-#endif
-	return ret;
-}
-
-int makedir (newdir)
-    char *newdir;
-{
-  char *buffer ;
-  char *p;
-  int  len = strlen(newdir);  
-
-  if (len <= 0) 
-    return 0;
-
-  buffer = (char*)malloc(len+1);
-  strcpy(buffer,newdir);
-  
-  if (buffer[len-1] == '/') {
-    buffer[len-1] = '\0';
-  }
-  if (mymkdir(buffer) == 0)
-    {
-      free(buffer);
-      return 1;
-    }
-
-  p = buffer+1;
-  while (1)
-    {
-      char hold;
-
-      while(*p && *p != '\\' && *p != '/')
-        p++;
-      hold = *p;
-      *p = 0;
-      if ((mymkdir(buffer) == -1) && (errno == ENOENT))
-        {
-          printf("couldn't create directory %s\n",buffer);
-          free(buffer);
-          return 0;
-        }
-      if (hold == 0)
-        break;
-      *p++ = hold;
-    }
-  free(buffer);
-  return 1;
-}
-
-void do_banner()
-{
-	printf("MiniUnz 0.15, demo of zLib + Unz package written by Gilles Vollant\n");
-	printf("more info at http://wwww.winimage/zLibDll/unzip.htm\n\n");
-}
-
-void do_help()
-{	
-	printf("Usage : miniunz [-exvlo] file.zip [file_to_extract]\n\n") ;
-}
-
-
-int do_list(uf)
-	unzFile uf;
-{
-	uLong i;
-	unz_global_info gi;
-	int err;
-
-	err = unzGetGlobalInfo (uf,&gi);
-	if (err!=UNZ_OK)
-		printf("error %d with zipfile in unzGetGlobalInfo \n",err);
-    printf(" Length  Method   Size  Ratio   Date    Time   CRC-32     Name\n");
-    printf(" ------  ------   ----  -----   ----    ----   ------     ----\n");
-	for (i=0;i0)
-			ratio = (file_info.compressed_size*100)/file_info.uncompressed_size;
-
-		if (file_info.compression_method==0)
-			string_method="Stored";
-		else
-		if (file_info.compression_method==Z_DEFLATED)
-		{
-			uInt iLevel=(uInt)((file_info.flag & 0x6)/2);
-			if (iLevel==0)
-			  string_method="Defl:N";
-			else if (iLevel==1)
-			  string_method="Defl:X";
-			else if ((iLevel==2) || (iLevel==3))
-			  string_method="Defl:F"; /* 2:fast , 3 : extra fast*/
-		}
-		else
-			string_method="Unkn. ";
-
-		printf("%7lu  %6s %7lu %3lu%%  %2.2lu-%2.2lu-%2.2lu  %2.2lu:%2.2lu  %8.8lx   %s\n",
-			    file_info.uncompressed_size,string_method,file_info.compressed_size,
-				ratio,
-				(uLong)file_info.tmu_date.tm_mon + 1,
-                (uLong)file_info.tmu_date.tm_mday,
-				(uLong)file_info.tmu_date.tm_year % 100,
-				(uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min,
-				(uLong)file_info.crc,filename_inzip);
-		if ((i+1)='a') && (rep<='z'))
-						rep -= 0x20;
-				}
-				while ((rep!='Y') && (rep!='N') && (rep!='A'));
-			}
-
-			if (rep == 'N')
-				skip = 1;
-
-			if (rep == 'A')
-				*popt_overwrite=1;
-		}
-
-		if ((skip==0) && (err==UNZ_OK))
-		{
-			fout=fopen(write_filename,"wb");
-
-            /* some zipfile don't contain directory alone before file */
-            if ((fout==NULL) && ((*popt_extract_without_path)==0) && 
-                                (filename_withoutpath!=(char*)filename_inzip))
-            {
-                char c=*(filename_withoutpath-1);
-                *(filename_withoutpath-1)='\0';
-                makedir(write_filename);
-                *(filename_withoutpath-1)=c;
-                fout=fopen(write_filename,"wb");
-            }
-
-			if (fout==NULL)
-			{
-				printf("error opening %s\n",write_filename);
-			}
-		}
-
-		if (fout!=NULL)
-		{
-			printf(" extracting: %s\n",write_filename);
-
-			do
-			{
-				err = unzReadCurrentFile(uf,buf,size_buf);
-				if (err<0)	
-				{
-					printf("error %d with zipfile in unzReadCurrentFile\n",err);
-					break;
-				}
-				if (err>0)
-					if (fwrite(buf,err,1,fout)!=1)
-					{
-						printf("error in writing extracted file\n");
-                        err=UNZ_ERRNO;
-						break;
-					}
-			}
-			while (err>0);
-			fclose(fout);
-			if (err==0) 
-				change_file_date(write_filename,file_info.dosDate,
-					             file_info.tmu_date);
-		}
-
-        if (err==UNZ_OK)
-        {
-		    err = unzCloseCurrentFile (uf);
-		    if (err!=UNZ_OK)
-		    {
-			    printf("error %d with zipfile in unzCloseCurrentFile\n",err);
-		    }
-        }
-        else
-            unzCloseCurrentFile(uf); /* don't lose the error */       
-	}
-
-    free(buf);    
-    return err;
-}
-
-
-int do_extract(uf,opt_extract_without_path,opt_overwrite)
-	unzFile uf;
-	int opt_extract_without_path;
-    int opt_overwrite;
-{
-	uLong i;
-	unz_global_info gi;
-	int err;
-	FILE* fout=NULL;	
-
-	err = unzGetGlobalInfo (uf,&gi);
-	if (err!=UNZ_OK)
-		printf("error %d with zipfile in unzGetGlobalInfo \n",err);
-
-	for (i=0;i
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#ifdef unix
-# include 
-# include 
-# include 
-# include 
-#else
-# include 
-# include 
-#endif
-
-#include "zip.h"
-
-
-#define WRITEBUFFERSIZE (16384)
-#define MAXFILENAME (256)
-
-#ifdef WIN32
-uLong filetime(f, tmzip, dt)
-    char *f;                /* name of file to get info on */
-    tm_zip *tmzip;             /* return value: access, modific. and creation times */
-    uLong *dt;             /* dostime */
-{
-  int ret = 0;
-  {
-      FILETIME ftLocal;
-      HANDLE hFind;
-      WIN32_FIND_DATA  ff32;
-
-      hFind = FindFirstFile(f,&ff32);
-      if (hFind != INVALID_HANDLE_VALUE)
-      {
-        FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal);
-        FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0);
-        FindClose(hFind);
-        ret = 1;
-      }
-  }
-  return ret;
-}
-#else
-#ifdef unix
-uLong filetime(f, tmzip, dt)
-    char *f;                /* name of file to get info on */
-    tm_zip *tmzip;             /* return value: access, modific. and creation times */
-    uLong *dt;             /* dostime */
-{
-  int ret=0;
-  struct stat s;        /* results of stat() */
-  struct tm* filedate;
-  time_t tm_t=0;
-  
-  if (strcmp(f,"-")!=0)
-  {
-    char name[MAXFILENAME];
-    int len = strlen(f);
-    strcpy(name, f);
-    if (name[len - 1] == '/')
-      name[len - 1] = '\0';
-    /* not all systems allow stat'ing a file with / appended */
-    if (stat(name,&s)==0)
-    {
-      tm_t = s.st_mtime;
-      ret = 1;
-    }
-  }
-  filedate = localtime(&tm_t);
-
-  tmzip->tm_sec  = filedate->tm_sec;
-  tmzip->tm_min  = filedate->tm_min;
-  tmzip->tm_hour = filedate->tm_hour;
-  tmzip->tm_mday = filedate->tm_mday;
-  tmzip->tm_mon  = filedate->tm_mon ;
-  tmzip->tm_year = filedate->tm_year;
-
-  return ret;
-}
-#else
-uLong filetime(f, tmzip, dt)
-    char *f;                /* name of file to get info on */
-    tm_zip *tmzip;             /* return value: access, modific. and creation times */
-    uLong *dt;             /* dostime */
-{
-    return 0;
-}
-#endif
-#endif
-
-
-
-
-int check_exist_file(filename)
-    const char* filename;
-{
-	FILE* ftestexist;
-    int ret = 1;
-	ftestexist = fopen(filename,"rb");
-	if (ftestexist==NULL)
-        ret = 0;
-    else
-        fclose(ftestexist);
-    return ret;
-}
-
-void do_banner()
-{
-	printf("MiniZip 0.15, demo of zLib + Zip package written by Gilles Vollant\n");
-	printf("more info at http://wwww.winimage/zLibDll/unzip.htm\n\n");
-}
-
-void do_help()
-{	
-	printf("Usage : minizip [-o] file.zip [files_to_add]\n\n") ;
-}
-
-int main(argc,argv)
-	int argc;
-	char *argv[];
-{
-	int i;
-	int opt_overwrite=0;
-    int opt_compress_level=Z_DEFAULT_COMPRESSION;
-    int zipfilenamearg = 0;
-	char filename_try[MAXFILENAME];
-    int zipok;
-    int err=0;
-    int size_buf=0;
-    void* buf=NULL,
-
-
-	do_banner();
-	if (argc==1)
-	{
-		do_help();
-		exit(0);
-        return 0;
-	}
-	else
-	{
-		for (i=1;i='0') && (c<='9'))
-                        opt_compress_level = c-'0';
-				}
-			}
-			else
-				if (zipfilenamearg == 0)
-                    zipfilenamearg = i ;
-		}
-	}
-
-    size_buf = WRITEBUFFERSIZE;
-    buf = (void*)malloc(size_buf);
-    if (buf==NULL)
-    {
-        printf("Error allocating memory\n");
-        return ZIP_INTERNALERROR;
-    }
-
-	if (zipfilenamearg==0)
-        zipok=0;
-    else
-	{
-        int i,len;
-        int dot_found=0;
-
-        zipok = 1 ;
-		strcpy(filename_try,argv[zipfilenamearg]);
-        len=strlen(filename_try);
-        for (i=0;i='a') && (rep<='z'))
-						rep -= 0x20;
-				}
-				while ((rep!='Y') && (rep!='N'));
-                if (rep=='N')
-                    zipok = 0;
-			}
-    }
-
-    if (zipok==1)
-    {
-        zipFile zf;
-        int errclose;
-        zf = zipOpen(filename_try,0);
-        if (zf == NULL)
-        {
-            printf("error opening %s\n",filename_try);
-            err= ZIP_ERRNO;
-        }
-        else 
-            printf("creating %s\n",filename_try);
-
-        for (i=zipfilenamearg+1;(i0)
-                        {
-                            err = zipWriteInFileInZip (zf,buf,size_read);
-                            if (err<0)
-                            {
-                                printf("error in writing %s in the zipfile\n",
-                                                 filenameinzip);
-                            }
-                                
-                        }
-                    } while ((err == ZIP_OK) && (size_read>0));
-
-                fclose(fin);
-                if (err<0)
-                    err=ZIP_ERRNO;
-                else
-                {                    
-                    err = zipCloseFileInZip(zf);
-                    if (err!=ZIP_OK)
-                        printf("error in closing %s in the zipfile\n",
-                                    filenameinzip);
-                }
-            }
-        }
-        errclose = zipClose(zf,NULL);
-        if (errclose != ZIP_OK)
-            printf("error in closing %s\n",filename_try);
-   }
-
-    free(buf);
-    exit(0);
-	return 0;  /* to avoid warning */
-}
diff --git a/Lib/zlib/contrib/minizip/readme.txt b/Lib/zlib/contrib/minizip/readme.txt
deleted file mode 100644
index 1fc023c72..000000000
--- a/Lib/zlib/contrib/minizip/readme.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-
-UnZip 0.15 additionnal library
-
-
-  This unzip package allow extract file from .ZIP file, compatible with 
-PKZip 2.04g, WinZip, InfoZip tools and compatible.
-
-  Multi volume ZipFile (span) are not supported, and old compression used by old 
-PKZip 1.x are not supported.
-
-See probdesc.zip from PKWare for specification of .ZIP format.
-
-What is Unzip
-  The Zlib library support the deflate compression and the creation of gzip (.gz) 
-file. Zlib is free and small.
-  The .Zip format, which can contain several compressed files (.gz can containt
-only one file) is a very popular format. This is why I've written a package for reading file compressed in Zipfile.
-
-Using Unzip package
-
-You need source of Zlib (get zlib111.zip and read zlib.h).
-Get unzlb015.zip and read unzip.h (whith documentation of unzip functions)
-
-The Unzip package is only two file : unzip.h and unzip.c. But it use the Zlib 
-  files.
-unztst.c is a simple sample program, which list file in a zipfile and display
-  README.TXT or FILE_ID.DIZ (if these files are found).
-miniunz.c is a mini unzip program.
-
-I'm also currenlyt writing a zipping portion (zip.h, zip.c and test with minizip.c)
-
-Please email me for feedback.
-I hope my source is compatible with Unix system, but I need your help for be sure
-
-Latest revision : Mar 04th, 1998
-
-Check http://www.winimage.com/zLibDll/unzip.html for up to date info.
diff --git a/Lib/zlib/contrib/minizip/unzip.c b/Lib/zlib/contrib/minizip/unzip.c
deleted file mode 100644
index ff71a474d..000000000
--- a/Lib/zlib/contrib/minizip/unzip.c
+++ /dev/null
@@ -1,1294 +0,0 @@
-/* unzip.c -- IO on .zip files using zlib 
-   Version 0.15 beta, Mar 19th, 1998,
-
-   Read unzip.h for more info
-*/
-
-
-#include 
-#include 
-#include 
-#include "zlib.h"
-#include "unzip.h"
-
-#ifdef STDC
-#  include 
-#  include 
-#  include 
-#endif
-#ifdef NO_ERRNO_H
-    extern int errno;
-#else
-#   include 
-#endif
-
-
-#ifndef local
-#  define local static
-#endif
-/* compile with -Dlocal if your debugger can't find static symbols */
-
-
-
-#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \
-                      !defined(CASESENSITIVITYDEFAULT_NO)
-#define CASESENSITIVITYDEFAULT_NO
-#endif
-
-
-#ifndef UNZ_BUFSIZE
-#define UNZ_BUFSIZE (16384)
-#endif
-
-#ifndef UNZ_MAXFILENAMEINZIP
-#define UNZ_MAXFILENAMEINZIP (256)
-#endif
-
-#ifndef ALLOC
-# define ALLOC(size) (malloc(size))
-#endif
-#ifndef TRYFREE
-# define TRYFREE(p) {if (p) free(p);}
-#endif
-
-#define SIZECENTRALDIRITEM (0x2e)
-#define SIZEZIPLOCALHEADER (0x1e)
-
-
-/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
-
-#ifndef SEEK_CUR
-#define SEEK_CUR    1
-#endif
-
-#ifndef SEEK_END
-#define SEEK_END    2
-#endif
-
-#ifndef SEEK_SET
-#define SEEK_SET    0
-#endif
-
-const char unz_copyright[] =
-   " unzip 0.15 Copyright 1998 Gilles Vollant ";
-
-/* unz_file_info_interntal contain internal info about a file in zipfile*/
-typedef struct unz_file_info_internal_s
-{
-    uLong offset_curfile;/* relative offset of local header 4 bytes */
-} unz_file_info_internal;
-
-
-/* file_in_zip_read_info_s contain internal information about a file in zipfile,
-    when reading and decompress it */
-typedef struct
-{
-	char  *read_buffer;         /* internal buffer for compressed data */
-	z_stream stream;            /* zLib stream structure for inflate */
-
-	uLong pos_in_zipfile;       /* position in byte on the zipfile, for fseek*/
-	uLong stream_initialised;   /* flag set if stream structure is initialised*/
-
-	uLong offset_local_extrafield;/* offset of the local extra field */
-	uInt  size_local_extrafield;/* size of the local extra field */
-	uLong pos_local_extrafield;   /* position in the local extra field in read*/
-
-	uLong crc32;                /* crc32 of all data uncompressed */
-	uLong crc32_wait;           /* crc32 we must obtain after decompress all */
-	uLong rest_read_compressed; /* number of byte to be decompressed */
-	uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
-	FILE* file;                 /* io structore of the zipfile */
-	uLong compression_method;   /* compression method (0==store) */
-	uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
-} file_in_zip_read_info_s;
-
-
-/* unz_s contain internal information about the zipfile
-*/
-typedef struct
-{
-	FILE* file;                 /* io structore of the zipfile */
-	unz_global_info gi;       /* public global information */
-	uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
-	uLong num_file;             /* number of the current file in the zipfile*/
-	uLong pos_in_central_dir;   /* pos of the current file in the central dir*/
-	uLong current_file_ok;      /* flag about the usability of the current file*/
-	uLong central_pos;          /* position of the beginning of the central dir*/
-
-	uLong size_central_dir;     /* size of the central directory  */
-	uLong offset_central_dir;   /* offset of start of central directory with
-								   respect to the starting disk number */
-
-	unz_file_info cur_file_info; /* public info about the current file in zip*/
-	unz_file_info_internal cur_file_info_internal; /* private info about it*/
-    file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
-	                                    file if we are decompressing it */
-} unz_s;
-
-
-/* ===========================================================================
-     Read a byte from a gz_stream; update next_in and avail_in. Return EOF
-   for end of file.
-   IN assertion: the stream s has been sucessfully opened for reading.
-*/
-
-
-local int unzlocal_getByte(fin,pi)
-	FILE *fin;
-	int *pi;
-{
-    unsigned char c;
-	int err = fread(&c, 1, 1, fin);
-    if (err==1)
-    {
-        *pi = (int)c;
-        return UNZ_OK;
-    }
-    else
-    {
-        if (ferror(fin)) 
-            return UNZ_ERRNO;
-        else
-            return UNZ_EOF;
-    }
-}
-
-
-/* ===========================================================================
-   Reads a long in LSB order from the given gz_stream. Sets 
-*/
-local int unzlocal_getShort (fin,pX)
-	FILE* fin;
-    uLong *pX;
-{
-    uLong x ;
-    int i;
-    int err;
-
-    err = unzlocal_getByte(fin,&i);
-    x = (uLong)i;
-    
-    if (err==UNZ_OK)
-        err = unzlocal_getByte(fin,&i);
-    x += ((uLong)i)<<8;
-   
-    if (err==UNZ_OK)
-        *pX = x;
-    else
-        *pX = 0;
-    return err;
-}
-
-local int unzlocal_getLong (fin,pX)
-	FILE* fin;
-    uLong *pX;
-{
-    uLong x ;
-    int i;
-    int err;
-
-    err = unzlocal_getByte(fin,&i);
-    x = (uLong)i;
-    
-    if (err==UNZ_OK)
-        err = unzlocal_getByte(fin,&i);
-    x += ((uLong)i)<<8;
-
-    if (err==UNZ_OK)
-        err = unzlocal_getByte(fin,&i);
-    x += ((uLong)i)<<16;
-
-    if (err==UNZ_OK)
-        err = unzlocal_getByte(fin,&i);
-    x += ((uLong)i)<<24;
-   
-    if (err==UNZ_OK)
-        *pX = x;
-    else
-        *pX = 0;
-    return err;
-}
-
-
-/* My own strcmpi / strcasecmp */
-local int strcmpcasenosensitive_internal (fileName1,fileName2)
-	const char* fileName1;
-	const char* fileName2;
-{
-	for (;;)
-	{
-		char c1=*(fileName1++);
-		char c2=*(fileName2++);
-		if ((c1>='a') && (c1<='z'))
-			c1 -= 0x20;
-		if ((c2>='a') && (c2<='z'))
-			c2 -= 0x20;
-		if (c1=='\0')
-			return ((c2=='\0') ? 0 : -1);
-		if (c2=='\0')
-			return 1;
-		if (c1c2)
-			return 1;
-	}
-}
-
-
-#ifdef  CASESENSITIVITYDEFAULT_NO
-#define CASESENSITIVITYDEFAULTVALUE 2
-#else
-#define CASESENSITIVITYDEFAULTVALUE 1
-#endif
-
-#ifndef STRCMPCASENOSENTIVEFUNCTION
-#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
-#endif
-
-/* 
-   Compare two filename (fileName1,fileName2).
-   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
-   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
-                                                                or strcasecmp)
-   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
-        (like 1 on Unix, 2 on Windows)
-
-*/
-extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity)
-	const char* fileName1;
-	const char* fileName2;
-	int iCaseSensitivity;
-{
-	if (iCaseSensitivity==0)
-		iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
-
-	if (iCaseSensitivity==1)
-		return strcmp(fileName1,fileName2);
-
-	return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
-} 
-
-#define BUFREADCOMMENT (0x400)
-
-/*
-  Locate the Central directory of a zipfile (at the end, just before
-    the global comment)
-*/
-local uLong unzlocal_SearchCentralDir(fin)
-	FILE *fin;
-{
-	unsigned char* buf;
-	uLong uSizeFile;
-	uLong uBackRead;
-	uLong uMaxBack=0xffff; /* maximum size of global comment */
-	uLong uPosFound=0;
-	
-	if (fseek(fin,0,SEEK_END) != 0)
-		return 0;
-
-
-	uSizeFile = ftell( fin );
-	
-	if (uMaxBack>uSizeFile)
-		uMaxBack = uSizeFile;
-
-	buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
-	if (buf==NULL)
-		return 0;
-
-	uBackRead = 4;
-	while (uBackReaduMaxBack) 
-			uBackRead = uMaxBack;
-		else
-			uBackRead+=BUFREADCOMMENT;
-		uReadPos = uSizeFile-uBackRead ;
-		
-		uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? 
-                     (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
-		if (fseek(fin,uReadPos,SEEK_SET)!=0)
-			break;
-
-		if (fread(buf,(uInt)uReadSize,1,fin)!=1)
-			break;
-
-                for (i=(int)uReadSize-3; (i--)>0;)
-			if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && 
-				((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
-			{
-				uPosFound = uReadPos+i;
-				break;
-			}
-
-		if (uPosFound!=0)
-			break;
-	}
-	TRYFREE(buf);
-	return uPosFound;
-}
-
-/*
-  Open a Zip file. path contain the full pathname (by example,
-     on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer
-	 "zlib/zlib109.zip".
-	 If the zipfile cannot be opened (file don't exist or in not valid), the
-	   return value is NULL.
-     Else, the return value is a unzFile Handle, usable with other function
-	   of this unzip package.
-*/
-extern unzFile ZEXPORT unzOpen (path)
-	const char *path;
-{
-	unz_s us;
-	unz_s *s;
-	uLong central_pos,uL;
-	FILE * fin ;
-
-	uLong number_disk;          /* number of the current dist, used for 
-								   spaning ZIP, unsupported, always 0*/
-	uLong number_disk_with_CD;  /* number the the disk with central dir, used
-								   for spaning ZIP, unsupported, always 0*/
-	uLong number_entry_CD;      /* total number of entries in
-	                               the central dir 
-	                               (same than number_entry on nospan) */
-
-	int err=UNZ_OK;
-
-    if (unz_copyright[0]!=' ')
-        return NULL;
-
-    fin=fopen(path,"rb");
-	if (fin==NULL)
-		return NULL;
-
-	central_pos = unzlocal_SearchCentralDir(fin);
-	if (central_pos==0)
-		err=UNZ_ERRNO;
-
-	if (fseek(fin,central_pos,SEEK_SET)!=0)
-		err=UNZ_ERRNO;
-
-	/* the signature, already checked */
-	if (unzlocal_getLong(fin,&uL)!=UNZ_OK)
-		err=UNZ_ERRNO;
-
-	/* number of this disk */
-	if (unzlocal_getShort(fin,&number_disk)!=UNZ_OK)
-		err=UNZ_ERRNO;
-
-	/* number of the disk with the start of the central directory */
-	if (unzlocal_getShort(fin,&number_disk_with_CD)!=UNZ_OK)
-		err=UNZ_ERRNO;
-
-	/* total number of entries in the central dir on this disk */
-	if (unzlocal_getShort(fin,&us.gi.number_entry)!=UNZ_OK)
-		err=UNZ_ERRNO;
-
-	/* total number of entries in the central dir */
-	if (unzlocal_getShort(fin,&number_entry_CD)!=UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if ((number_entry_CD!=us.gi.number_entry) ||
-		(number_disk_with_CD!=0) ||
-		(number_disk!=0))
-		err=UNZ_BADZIPFILE;
-
-	/* size of the central directory */
-	if (unzlocal_getLong(fin,&us.size_central_dir)!=UNZ_OK)
-		err=UNZ_ERRNO;
-
-	/* offset of start of central directory with respect to the 
-	      starting disk number */
-	if (unzlocal_getLong(fin,&us.offset_central_dir)!=UNZ_OK)
-		err=UNZ_ERRNO;
-
-	/* zipfile comment length */
-	if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if ((central_pospfile_in_zip_read!=NULL)
-        unzCloseCurrentFile(file);
-
-	fclose(s->file);
-	TRYFREE(s);
-	return UNZ_OK;
-}
-
-
-/*
-  Write info about the ZipFile in the *pglobal_info structure.
-  No preparation of the structure is needed
-  return UNZ_OK if there is no problem. */
-extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)
-	unzFile file;
-	unz_global_info *pglobal_info;
-{
-	unz_s* s;
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-	*pglobal_info=s->gi;
-	return UNZ_OK;
-}
-
-
-/*
-   Translate date/time from Dos format to tm_unz (readable more easilty)
-*/
-local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)
-    uLong ulDosDate;
-    tm_unz* ptm;
-{
-    uLong uDate;
-    uDate = (uLong)(ulDosDate>>16);
-    ptm->tm_mday = (uInt)(uDate&0x1f) ;
-    ptm->tm_mon =  (uInt)((((uDate)&0x1E0)/0x20)-1) ;
-    ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
-
-    ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
-    ptm->tm_min =  (uInt) ((ulDosDate&0x7E0)/0x20) ;
-    ptm->tm_sec =  (uInt) (2*(ulDosDate&0x1f)) ;
-}
-
-/*
-  Get Info about the current file in the zipfile, with internal only info
-*/
-local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
-                                                  unz_file_info *pfile_info,
-                                                  unz_file_info_internal 
-                                                  *pfile_info_internal,
-                                                  char *szFileName,
-												  uLong fileNameBufferSize,
-                                                  void *extraField,
-												  uLong extraFieldBufferSize,
-                                                  char *szComment,
-												  uLong commentBufferSize));
-
-local int unzlocal_GetCurrentFileInfoInternal (file,
-                                              pfile_info,
-                                              pfile_info_internal,
-                                              szFileName, fileNameBufferSize,
-                                              extraField, extraFieldBufferSize,
-                                              szComment,  commentBufferSize)
-	unzFile file;
-	unz_file_info *pfile_info;
-	unz_file_info_internal *pfile_info_internal;
-	char *szFileName;
-	uLong fileNameBufferSize;
-	void *extraField;
-	uLong extraFieldBufferSize;
-	char *szComment;
-	uLong commentBufferSize;
-{
-	unz_s* s;
-	unz_file_info file_info;
-	unz_file_info_internal file_info_internal;
-	int err=UNZ_OK;
-	uLong uMagic;
-	long lSeek=0;
-
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-	if (fseek(s->file,s->pos_in_central_dir+s->byte_before_the_zipfile,SEEK_SET)!=0)
-		err=UNZ_ERRNO;
-
-
-	/* we check the magic */
-	if (err==UNZ_OK)
-		if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK)
-			err=UNZ_ERRNO;
-		else if (uMagic!=0x02014b50)
-			err=UNZ_BADZIPFILE;
-
-	if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getShort(s->file,&file_info.version_needed) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getShort(s->file,&file_info.flag) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getShort(s->file,&file_info.compression_method) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getLong(s->file,&file_info.dosDate) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-    unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
-
-	if (unzlocal_getLong(s->file,&file_info.crc) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getLong(s->file,&file_info.compressed_size) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getLong(s->file,&file_info.uncompressed_size) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getShort(s->file,&file_info.size_filename) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getShort(s->file,&file_info.size_file_extra) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getShort(s->file,&file_info.size_file_comment) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getShort(s->file,&file_info.disk_num_start) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getShort(s->file,&file_info.internal_fa) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getLong(s->file,&file_info.external_fa) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getLong(s->file,&file_info_internal.offset_curfile) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	lSeek+=file_info.size_filename;
-	if ((err==UNZ_OK) && (szFileName!=NULL))
-	{
-		uLong uSizeRead ;
-		if (file_info.size_filename0) && (fileNameBufferSize>0))
-			if (fread(szFileName,(uInt)uSizeRead,1,s->file)!=1)
-				err=UNZ_ERRNO;
-		lSeek -= uSizeRead;
-	}
-
-	
-	if ((err==UNZ_OK) && (extraField!=NULL))
-	{
-		uLong uSizeRead ;
-		if (file_info.size_file_extrafile,lSeek,SEEK_CUR)==0)
-				lSeek=0;
-			else
-				err=UNZ_ERRNO;
-		if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
-			if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1)
-				err=UNZ_ERRNO;
-		lSeek += file_info.size_file_extra - uSizeRead;
-	}
-	else
-		lSeek+=file_info.size_file_extra; 
-
-	
-	if ((err==UNZ_OK) && (szComment!=NULL))
-	{
-		uLong uSizeRead ;
-		if (file_info.size_file_commentfile,lSeek,SEEK_CUR)==0)
-				lSeek=0;
-			else
-				err=UNZ_ERRNO;
-		if ((file_info.size_file_comment>0) && (commentBufferSize>0))
-			if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1)
-				err=UNZ_ERRNO;
-		lSeek+=file_info.size_file_comment - uSizeRead;
-	}
-	else
-		lSeek+=file_info.size_file_comment;
-
-	if ((err==UNZ_OK) && (pfile_info!=NULL))
-		*pfile_info=file_info;
-
-	if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
-		*pfile_info_internal=file_info_internal;
-
-	return err;
-}
-
-
-
-/*
-  Write info about the ZipFile in the *pglobal_info structure.
-  No preparation of the structure is needed
-  return UNZ_OK if there is no problem.
-*/
-extern int ZEXPORT unzGetCurrentFileInfo (file,
-                                                  pfile_info,
-                                                  szFileName, fileNameBufferSize,
-                                                  extraField, extraFieldBufferSize,
-                                                  szComment,  commentBufferSize)
-	unzFile file;
-	unz_file_info *pfile_info;
-	char *szFileName;
-	uLong fileNameBufferSize;
-	void *extraField;
-	uLong extraFieldBufferSize;
-	char *szComment;
-	uLong commentBufferSize;
-{
-	return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
-												szFileName,fileNameBufferSize,
-												extraField,extraFieldBufferSize,
-												szComment,commentBufferSize);
-}
-
-/*
-  Set the current file of the zipfile to the first file.
-  return UNZ_OK if there is no problem
-*/
-extern int ZEXPORT unzGoToFirstFile (file)
-	unzFile file;
-{
-	int err=UNZ_OK;
-	unz_s* s;
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-	s->pos_in_central_dir=s->offset_central_dir;
-	s->num_file=0;
-	err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
-											 &s->cur_file_info_internal,
-											 NULL,0,NULL,0,NULL,0);
-	s->current_file_ok = (err == UNZ_OK);
-	return err;
-}
-
-
-/*
-  Set the current file of the zipfile to the next file.
-  return UNZ_OK if there is no problem
-  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
-*/
-extern int ZEXPORT unzGoToNextFile (file)
-	unzFile file;
-{
-	unz_s* s;	
-	int err;
-
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-	if (!s->current_file_ok)
-		return UNZ_END_OF_LIST_OF_FILE;
-	if (s->num_file+1==s->gi.number_entry)
-		return UNZ_END_OF_LIST_OF_FILE;
-
-	s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
-			s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
-	s->num_file++;
-	err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
-											   &s->cur_file_info_internal,
-											   NULL,0,NULL,0,NULL,0);
-	s->current_file_ok = (err == UNZ_OK);
-	return err;
-}
-
-
-/*
-  Try locate the file szFileName in the zipfile.
-  For the iCaseSensitivity signification, see unzipStringFileNameCompare
-
-  return value :
-  UNZ_OK if the file is found. It becomes the current file.
-  UNZ_END_OF_LIST_OF_FILE if the file is not found
-*/
-extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity)
-	unzFile file;
-	const char *szFileName;
-	int iCaseSensitivity;
-{
-	unz_s* s;	
-	int err;
-
-	
-	uLong num_fileSaved;
-	uLong pos_in_central_dirSaved;
-
-
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-
-    if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
-        return UNZ_PARAMERROR;
-
-	s=(unz_s*)file;
-	if (!s->current_file_ok)
-		return UNZ_END_OF_LIST_OF_FILE;
-
-	num_fileSaved = s->num_file;
-	pos_in_central_dirSaved = s->pos_in_central_dir;
-
-	err = unzGoToFirstFile(file);
-
-	while (err == UNZ_OK)
-	{
-		char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
-		unzGetCurrentFileInfo(file,NULL,
-								szCurrentFileName,sizeof(szCurrentFileName)-1,
-								NULL,0,NULL,0);
-		if (unzStringFileNameCompare(szCurrentFileName,
-										szFileName,iCaseSensitivity)==0)
-			return UNZ_OK;
-		err = unzGoToNextFile(file);
-	}
-
-	s->num_file = num_fileSaved ;
-	s->pos_in_central_dir = pos_in_central_dirSaved ;
-	return err;
-}
-
-
-/*
-  Read the local header of the current zipfile
-  Check the coherency of the local header and info in the end of central
-        directory about this file
-  store in *piSizeVar the size of extra info in local header
-        (filename and size of extra field data)
-*/
-local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar,
-													poffset_local_extrafield,
-													psize_local_extrafield)
-	unz_s* s;
-	uInt* piSizeVar;
-	uLong *poffset_local_extrafield;
-	uInt  *psize_local_extrafield;
-{
-	uLong uMagic,uData,uFlags;
-	uLong size_filename;
-	uLong size_extra_field;
-	int err=UNZ_OK;
-
-	*piSizeVar = 0;
-	*poffset_local_extrafield = 0;
-	*psize_local_extrafield = 0;
-
-	if (fseek(s->file,s->cur_file_info_internal.offset_curfile +
-								s->byte_before_the_zipfile,SEEK_SET)!=0)
-		return UNZ_ERRNO;
-
-
-	if (err==UNZ_OK)
-		if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK)
-			err=UNZ_ERRNO;
-		else if (uMagic!=0x04034b50)
-			err=UNZ_BADZIPFILE;
-
-	if (unzlocal_getShort(s->file,&uData) != UNZ_OK)
-		err=UNZ_ERRNO;
-/*
-	else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
-		err=UNZ_BADZIPFILE;
-*/
-	if (unzlocal_getShort(s->file,&uFlags) != UNZ_OK)
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getShort(s->file,&uData) != UNZ_OK)
-		err=UNZ_ERRNO;
-	else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
-		err=UNZ_BADZIPFILE;
-
-    if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
-                         (s->cur_file_info.compression_method!=Z_DEFLATED))
-        err=UNZ_BADZIPFILE;
-
-	if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* date/time */
-		err=UNZ_ERRNO;
-
-	if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* crc */
-		err=UNZ_ERRNO;
-	else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&
-		                      ((uFlags & 8)==0))
-		err=UNZ_BADZIPFILE;
-
-	if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size compr */
-		err=UNZ_ERRNO;
-	else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&
-							  ((uFlags & 8)==0))
-		err=UNZ_BADZIPFILE;
-
-	if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */
-		err=UNZ_ERRNO;
-	else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && 
-							  ((uFlags & 8)==0))
-		err=UNZ_BADZIPFILE;
-
-
-	if (unzlocal_getShort(s->file,&size_filename) != UNZ_OK)
-		err=UNZ_ERRNO;
-	else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
-		err=UNZ_BADZIPFILE;
-
-	*piSizeVar += (uInt)size_filename;
-
-	if (unzlocal_getShort(s->file,&size_extra_field) != UNZ_OK)
-		err=UNZ_ERRNO;
-	*poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
-									SIZEZIPLOCALHEADER + size_filename;
-	*psize_local_extrafield = (uInt)size_extra_field;
-
-	*piSizeVar += (uInt)size_extra_field;
-
-	return err;
-}
-												
-/*
-  Open for reading data the current file in the zipfile.
-  If there is no error and the file is opened, the return value is UNZ_OK.
-*/
-extern int ZEXPORT unzOpenCurrentFile (file)
-	unzFile file;
-{
-	int err=UNZ_OK;
-	int Store;
-	uInt iSizeVar;
-	unz_s* s;
-	file_in_zip_read_info_s* pfile_in_zip_read_info;
-	uLong offset_local_extrafield;  /* offset of the local extra field */
-	uInt  size_local_extrafield;    /* size of the local extra field */
-
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-	if (!s->current_file_ok)
-		return UNZ_PARAMERROR;
-
-    if (s->pfile_in_zip_read != NULL)
-        unzCloseCurrentFile(file);
-
-	if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,
-				&offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
-		return UNZ_BADZIPFILE;
-
-	pfile_in_zip_read_info = (file_in_zip_read_info_s*)
-									    ALLOC(sizeof(file_in_zip_read_info_s));
-	if (pfile_in_zip_read_info==NULL)
-		return UNZ_INTERNALERROR;
-
-	pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
-	pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
-	pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
-	pfile_in_zip_read_info->pos_local_extrafield=0;
-
-	if (pfile_in_zip_read_info->read_buffer==NULL)
-	{
-		TRYFREE(pfile_in_zip_read_info);
-		return UNZ_INTERNALERROR;
-	}
-
-	pfile_in_zip_read_info->stream_initialised=0;
-	
-	if ((s->cur_file_info.compression_method!=0) &&
-        (s->cur_file_info.compression_method!=Z_DEFLATED))
-		err=UNZ_BADZIPFILE;
-	Store = s->cur_file_info.compression_method==0;
-
-	pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
-	pfile_in_zip_read_info->crc32=0;
-	pfile_in_zip_read_info->compression_method =
-            s->cur_file_info.compression_method;
-	pfile_in_zip_read_info->file=s->file;
-	pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
-
-    pfile_in_zip_read_info->stream.total_out = 0;
-
-	if (!Store)
-	{
-	  pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
-	  pfile_in_zip_read_info->stream.zfree = (free_func)0;
-	  pfile_in_zip_read_info->stream.opaque = (voidpf)0; 
-      
-	  err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
-	  if (err == Z_OK)
-	    pfile_in_zip_read_info->stream_initialised=1;
-        /* windowBits is passed < 0 to tell that there is no zlib header.
-         * Note that in this case inflate *requires* an extra "dummy" byte
-         * after the compressed stream in order to complete decompression and
-         * return Z_STREAM_END. 
-         * In unzip, i don't wait absolutely Z_STREAM_END because I known the 
-         * size of both compressed and uncompressed data
-         */
-	}
-	pfile_in_zip_read_info->rest_read_compressed = 
-            s->cur_file_info.compressed_size ;
-	pfile_in_zip_read_info->rest_read_uncompressed = 
-            s->cur_file_info.uncompressed_size ;
-
-	
-	pfile_in_zip_read_info->pos_in_zipfile = 
-            s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + 
-			  iSizeVar;
-	
-	pfile_in_zip_read_info->stream.avail_in = (uInt)0;
-
-
-	s->pfile_in_zip_read = pfile_in_zip_read_info;
-    return UNZ_OK;
-}
-
-
-/*
-  Read bytes from the current file.
-  buf contain buffer where data must be copied
-  len the size of buf.
-
-  return the number of byte copied if somes bytes are copied
-  return 0 if the end of file was reached
-  return <0 with error code if there is an error
-    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
-*/
-extern int ZEXPORT unzReadCurrentFile  (file, buf, len)
-	unzFile file;
-	voidp buf;
-	unsigned len;
-{
-	int err=UNZ_OK;
-	uInt iRead = 0;
-	unz_s* s;
-	file_in_zip_read_info_s* pfile_in_zip_read_info;
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-    pfile_in_zip_read_info=s->pfile_in_zip_read;
-
-	if (pfile_in_zip_read_info==NULL)
-		return UNZ_PARAMERROR;
-
-
-	if ((pfile_in_zip_read_info->read_buffer == NULL))
-		return UNZ_END_OF_LIST_OF_FILE;
-	if (len==0)
-		return 0;
-
-	pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
-
-	pfile_in_zip_read_info->stream.avail_out = (uInt)len;
-	
-	if (len>pfile_in_zip_read_info->rest_read_uncompressed)
-		pfile_in_zip_read_info->stream.avail_out = 
-		  (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
-
-	while (pfile_in_zip_read_info->stream.avail_out>0)
-	{
-		if ((pfile_in_zip_read_info->stream.avail_in==0) &&
-            (pfile_in_zip_read_info->rest_read_compressed>0))
-		{
-			uInt uReadThis = UNZ_BUFSIZE;
-			if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed;
-			if (uReadThis == 0)
-				return UNZ_EOF;
-			if (fseek(pfile_in_zip_read_info->file,
-                      pfile_in_zip_read_info->pos_in_zipfile + 
-                         pfile_in_zip_read_info->byte_before_the_zipfile,SEEK_SET)!=0)
-				return UNZ_ERRNO;
-			if (fread(pfile_in_zip_read_info->read_buffer,uReadThis,1,
-                         pfile_in_zip_read_info->file)!=1)
-				return UNZ_ERRNO;
-			pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
-
-			pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
-			
-			pfile_in_zip_read_info->stream.next_in = 
-                (Bytef*)pfile_in_zip_read_info->read_buffer;
-			pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
-		}
-
-		if (pfile_in_zip_read_info->compression_method==0)
-		{
-			uInt uDoCopy,i ;
-			if (pfile_in_zip_read_info->stream.avail_out < 
-                            pfile_in_zip_read_info->stream.avail_in)
-				uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
-			else
-				uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
-				
-			for (i=0;istream.next_out+i) =
-                        *(pfile_in_zip_read_info->stream.next_in+i);
-					
-			pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
-								pfile_in_zip_read_info->stream.next_out,
-								uDoCopy);
-			pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
-			pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
-			pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
-			pfile_in_zip_read_info->stream.next_out += uDoCopy;
-			pfile_in_zip_read_info->stream.next_in += uDoCopy;
-            pfile_in_zip_read_info->stream.total_out += uDoCopy;
-			iRead += uDoCopy;
-		}
-		else
-		{
-			uLong uTotalOutBefore,uTotalOutAfter;
-			const Bytef *bufBefore;
-			uLong uOutThis;
-			int flush=Z_SYNC_FLUSH;
-
-			uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
-			bufBefore = pfile_in_zip_read_info->stream.next_out;
-
-			/*
-			if ((pfile_in_zip_read_info->rest_read_uncompressed ==
-			         pfile_in_zip_read_info->stream.avail_out) &&
-				(pfile_in_zip_read_info->rest_read_compressed == 0))
-				flush = Z_FINISH;
-			*/
-			err=inflate(&pfile_in_zip_read_info->stream,flush);
-
-			uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
-			uOutThis = uTotalOutAfter-uTotalOutBefore;
-			
-			pfile_in_zip_read_info->crc32 = 
-                crc32(pfile_in_zip_read_info->crc32,bufBefore,
-                        (uInt)(uOutThis));
-
-			pfile_in_zip_read_info->rest_read_uncompressed -=
-                uOutThis;
-
-			iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
-            
-			if (err==Z_STREAM_END)
-				return (iRead==0) ? UNZ_EOF : iRead;
-			if (err!=Z_OK) 
-				break;
-		}
-	}
-
-	if (err==Z_OK)
-		return iRead;
-	return err;
-}
-
-
-/*
-  Give the current position in uncompressed data
-*/
-extern z_off_t ZEXPORT unztell (file)
-	unzFile file;
-{
-	unz_s* s;
-	file_in_zip_read_info_s* pfile_in_zip_read_info;
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-    pfile_in_zip_read_info=s->pfile_in_zip_read;
-
-	if (pfile_in_zip_read_info==NULL)
-		return UNZ_PARAMERROR;
-
-	return (z_off_t)pfile_in_zip_read_info->stream.total_out;
-}
-
-
-/*
-  return 1 if the end of file was reached, 0 elsewhere 
-*/
-extern int ZEXPORT unzeof (file)
-	unzFile file;
-{
-	unz_s* s;
-	file_in_zip_read_info_s* pfile_in_zip_read_info;
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-    pfile_in_zip_read_info=s->pfile_in_zip_read;
-
-	if (pfile_in_zip_read_info==NULL)
-		return UNZ_PARAMERROR;
-	
-	if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
-		return 1;
-	else
-		return 0;
-}
-
-
-
-/*
-  Read extra field from the current file (opened by unzOpenCurrentFile)
-  This is the local-header version of the extra field (sometimes, there is
-    more info in the local-header version than in the central-header)
-
-  if buf==NULL, it return the size of the local extra field that can be read
-
-  if buf!=NULL, len is the size of the buffer, the extra header is copied in
-	buf.
-  the return value is the number of bytes copied in buf, or (if <0) 
-	the error code
-*/
-extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)
-	unzFile file;
-	voidp buf;
-	unsigned len;
-{
-	unz_s* s;
-	file_in_zip_read_info_s* pfile_in_zip_read_info;
-	uInt read_now;
-	uLong size_to_read;
-
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-    pfile_in_zip_read_info=s->pfile_in_zip_read;
-
-	if (pfile_in_zip_read_info==NULL)
-		return UNZ_PARAMERROR;
-
-	size_to_read = (pfile_in_zip_read_info->size_local_extrafield - 
-				pfile_in_zip_read_info->pos_local_extrafield);
-
-	if (buf==NULL)
-		return (int)size_to_read;
-	
-	if (len>size_to_read)
-		read_now = (uInt)size_to_read;
-	else
-		read_now = (uInt)len ;
-
-	if (read_now==0)
-		return 0;
-	
-	if (fseek(pfile_in_zip_read_info->file,
-              pfile_in_zip_read_info->offset_local_extrafield + 
-			  pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0)
-		return UNZ_ERRNO;
-
-	if (fread(buf,(uInt)size_to_read,1,pfile_in_zip_read_info->file)!=1)
-		return UNZ_ERRNO;
-
-	return (int)read_now;
-}
-
-/*
-  Close the file in zip opened with unzipOpenCurrentFile
-  Return UNZ_CRCERROR if all the file was read but the CRC is not good
-*/
-extern int ZEXPORT unzCloseCurrentFile (file)
-	unzFile file;
-{
-	int err=UNZ_OK;
-
-	unz_s* s;
-	file_in_zip_read_info_s* pfile_in_zip_read_info;
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-    pfile_in_zip_read_info=s->pfile_in_zip_read;
-
-	if (pfile_in_zip_read_info==NULL)
-		return UNZ_PARAMERROR;
-
-
-	if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
-	{
-		if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
-			err=UNZ_CRCERROR;
-	}
-
-
-	TRYFREE(pfile_in_zip_read_info->read_buffer);
-	pfile_in_zip_read_info->read_buffer = NULL;
-	if (pfile_in_zip_read_info->stream_initialised)
-		inflateEnd(&pfile_in_zip_read_info->stream);
-
-	pfile_in_zip_read_info->stream_initialised = 0;
-	TRYFREE(pfile_in_zip_read_info);
-
-    s->pfile_in_zip_read=NULL;
-
-	return err;
-}
-
-
-/*
-  Get the global comment string of the ZipFile, in the szComment buffer.
-  uSizeBuf is the size of the szComment buffer.
-  return the number of byte copied or an error code <0
-*/
-extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)
-	unzFile file;
-	char *szComment;
-	uLong uSizeBuf;
-{
-	int err=UNZ_OK;
-	unz_s* s;
-	uLong uReadThis ;
-	if (file==NULL)
-		return UNZ_PARAMERROR;
-	s=(unz_s*)file;
-
-	uReadThis = uSizeBuf;
-	if (uReadThis>s->gi.size_comment)
-		uReadThis = s->gi.size_comment;
-
-	if (fseek(s->file,s->central_pos+22,SEEK_SET)!=0)
-		return UNZ_ERRNO;
-
-	if (uReadThis>0)
-    {
-      *szComment='\0';
-	  if (fread(szComment,(uInt)uReadThis,1,s->file)!=1)
-		return UNZ_ERRNO;
-    }
-
-	if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
-		*(szComment+s->gi.size_comment)='\0';
-	return (int)uReadThis;
-}
diff --git a/Lib/zlib/contrib/minizip/unzip.def b/Lib/zlib/contrib/minizip/unzip.def
deleted file mode 100644
index f6ede89bc..000000000
--- a/Lib/zlib/contrib/minizip/unzip.def
+++ /dev/null
@@ -1,15 +0,0 @@
-	unzOpen                       @61
-	unzClose                      @62
-	unzGetGlobalInfo              @63
-	unzGetCurrentFileInfo         @64
-	unzGoToFirstFile              @65
-	unzGoToNextFile               @66
-	unzOpenCurrentFile            @67
-	unzReadCurrentFile            @68
-	unztell                       @70
-	unzeof                        @71
-	unzCloseCurrentFile           @72
-	unzGetGlobalComment           @73
-	unzStringFileNameCompare      @74
-	unzLocateFile                 @75
-	unzGetLocalExtrafield         @76
diff --git a/Lib/zlib/contrib/minizip/unzip.h b/Lib/zlib/contrib/minizip/unzip.h
deleted file mode 100644
index 76692cb70..000000000
--- a/Lib/zlib/contrib/minizip/unzip.h
+++ /dev/null
@@ -1,275 +0,0 @@
-/* unzip.h -- IO for uncompress .zip files using zlib 
-   Version 0.15 beta, Mar 19th, 1998,
-
-   Copyright (C) 1998 Gilles Vollant
-
-   This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
-     WinZip, InfoZip tools and compatible.
-   Encryption and multi volume ZipFile (span) are not supported.
-   Old compressions used by old PKZip 1.x are not supported
-
-   THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE
-   CAN CHANGE IN FUTURE VERSION !!
-   I WAIT FEEDBACK at mail info@winimage.com
-   Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
-
-   Condition of use and distribution are the same than zlib :
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-
-*/
-/* for more info about .ZIP format, see 
-      ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip
-   PkWare has also a specification at :
-      ftp://ftp.pkware.com/probdesc.zip */
-
-#ifndef _unz_H
-#define _unz_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef _ZLIB_H
-#include "zlib.h"
-#endif
-
-#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
-/* like the STRICT of WIN32, we define a pointer that cannot be converted
-    from (void*) without cast */
-typedef struct TagunzFile__ { int unused; } unzFile__; 
-typedef unzFile__ *unzFile;
-#else
-typedef voidp unzFile;
-#endif
-
-
-#define UNZ_OK                                  (0)
-#define UNZ_END_OF_LIST_OF_FILE (-100)
-#define UNZ_ERRNO               (Z_ERRNO)
-#define UNZ_EOF                 (0)
-#define UNZ_PARAMERROR                  (-102)
-#define UNZ_BADZIPFILE                  (-103)
-#define UNZ_INTERNALERROR               (-104)
-#define UNZ_CRCERROR                    (-105)
-
-/* tm_unz contain date/time info */
-typedef struct tm_unz_s 
-{
-	uInt tm_sec;            /* seconds after the minute - [0,59] */
-	uInt tm_min;            /* minutes after the hour - [0,59] */
-	uInt tm_hour;           /* hours since midnight - [0,23] */
-	uInt tm_mday;           /* day of the month - [1,31] */
-	uInt tm_mon;            /* months since January - [0,11] */
-	uInt tm_year;           /* years - [1980..2044] */
-} tm_unz;
-
-/* unz_global_info structure contain global data about the ZIPfile
-   These data comes from the end of central dir */
-typedef struct unz_global_info_s
-{
-	uLong number_entry;         /* total number of entries in
-				       the central dir on this disk */
-	uLong size_comment;         /* size of the global comment of the zipfile */
-} unz_global_info;
-
-
-/* unz_file_info contain information about a file in the zipfile */
-typedef struct unz_file_info_s
-{
-    uLong version;              /* version made by                 2 bytes */
-    uLong version_needed;       /* version needed to extract       2 bytes */
-    uLong flag;                 /* general purpose bit flag        2 bytes */
-    uLong compression_method;   /* compression method              2 bytes */
-    uLong dosDate;              /* last mod file date in Dos fmt   4 bytes */
-    uLong crc;                  /* crc-32                          4 bytes */
-    uLong compressed_size;      /* compressed size                 4 bytes */ 
-    uLong uncompressed_size;    /* uncompressed size               4 bytes */ 
-    uLong size_filename;        /* filename length                 2 bytes */
-    uLong size_file_extra;      /* extra field length              2 bytes */
-    uLong size_file_comment;    /* file comment length             2 bytes */
-
-    uLong disk_num_start;       /* disk number start               2 bytes */
-    uLong internal_fa;          /* internal file attributes        2 bytes */
-    uLong external_fa;          /* external file attributes        4 bytes */
-
-    tm_unz tmu_date;
-} unz_file_info;
-
-extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
-												 const char* fileName2,
-												 int iCaseSensitivity));
-/*
-   Compare two filename (fileName1,fileName2).
-   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
-   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
-								or strcasecmp)
-   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
-	(like 1 on Unix, 2 on Windows)
-*/
-
-
-extern unzFile ZEXPORT unzOpen OF((const char *path));
-/*
-  Open a Zip file. path contain the full pathname (by example,
-     on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer
-	 "zlib/zlib111.zip".
-	 If the zipfile cannot be opened (file don't exist or in not valid), the
-	   return value is NULL.
-     Else, the return value is a unzFile Handle, usable with other function
-	   of this unzip package.
-*/
-
-extern int ZEXPORT unzClose OF((unzFile file));
-/*
-  Close a ZipFile opened with unzipOpen.
-  If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
-    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
-  return UNZ_OK if there is no problem. */
-
-extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
-					unz_global_info *pglobal_info));
-/*
-  Write info about the ZipFile in the *pglobal_info structure.
-  No preparation of the structure is needed
-  return UNZ_OK if there is no problem. */
-
-
-extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
-										   char *szComment,
-					   uLong uSizeBuf));
-/*
-  Get the global comment string of the ZipFile, in the szComment buffer.
-  uSizeBuf is the size of the szComment buffer.
-  return the number of byte copied or an error code <0
-*/
-
-
-/***************************************************************************/
-/* Unzip package allow you browse the directory of the zipfile */
-
-extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
-/*
-  Set the current file of the zipfile to the first file.
-  return UNZ_OK if there is no problem
-*/
-
-extern int ZEXPORT unzGoToNextFile OF((unzFile file));
-/*
-  Set the current file of the zipfile to the next file.
-  return UNZ_OK if there is no problem
-  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
-*/
-
-extern int ZEXPORT unzLocateFile OF((unzFile file, 
-				     const char *szFileName,
-				     int iCaseSensitivity));
-/*
-  Try locate the file szFileName in the zipfile.
-  For the iCaseSensitivity signification, see unzStringFileNameCompare
-
-  return value :
-  UNZ_OK if the file is found. It becomes the current file.
-  UNZ_END_OF_LIST_OF_FILE if the file is not found
-*/
-
-
-extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
-					     unz_file_info *pfile_info,
-					     char *szFileName,
-					     uLong fileNameBufferSize,
-					     void *extraField,
-					     uLong extraFieldBufferSize,
-					     char *szComment,
-					     uLong commentBufferSize));
-/*
-  Get Info about the current file
-  if pfile_info!=NULL, the *pfile_info structure will contain somes info about
-	    the current file
-  if szFileName!=NULL, the filemane string will be copied in szFileName
-			(fileNameBufferSize is the size of the buffer)
-  if extraField!=NULL, the extra field information will be copied in extraField
-			(extraFieldBufferSize is the size of the buffer).
-			This is the Central-header version of the extra field
-  if szComment!=NULL, the comment string of the file will be copied in szComment
-			(commentBufferSize is the size of the buffer)
-*/
-
-/***************************************************************************/
-/* for reading the content of the current zipfile, you can open it, read data
-   from it, and close it (you can close it before reading all the file)
-   */
-
-extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
-/*
-  Open for reading data the current file in the zipfile.
-  If there is no error, the return value is UNZ_OK.
-*/
-
-extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
-/*
-  Close the file in zip opened with unzOpenCurrentFile
-  Return UNZ_CRCERROR if all the file was read but the CRC is not good
-*/
-
-												
-extern int ZEXPORT unzReadCurrentFile OF((unzFile file, 
-					  voidp buf,
-					  unsigned len));
-/*
-  Read bytes from the current file (opened by unzOpenCurrentFile)
-  buf contain buffer where data must be copied
-  len the size of buf.
-
-  return the number of byte copied if somes bytes are copied
-  return 0 if the end of file was reached
-  return <0 with error code if there is an error
-    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
-*/
-
-extern z_off_t ZEXPORT unztell OF((unzFile file));
-/*
-  Give the current position in uncompressed data
-*/
-
-extern int ZEXPORT unzeof OF((unzFile file));
-/*
-  return 1 if the end of file was reached, 0 elsewhere 
-*/
-
-extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
-											 voidp buf,
-											 unsigned len));
-/*
-  Read extra field from the current file (opened by unzOpenCurrentFile)
-  This is the local-header version of the extra field (sometimes, there is
-    more info in the local-header version than in the central-header)
-
-  if buf==NULL, it return the size of the local extra field
-
-  if buf!=NULL, len is the size of the buffer, the extra header is copied in
-	buf.
-  the return value is the number of bytes copied in buf, or (if <0) 
-	the error code
-*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _unz_H */
diff --git a/Lib/zlib/contrib/minizip/zip.c b/Lib/zlib/contrib/minizip/zip.c
deleted file mode 100644
index 0cae64ab7..000000000
--- a/Lib/zlib/contrib/minizip/zip.c
+++ /dev/null
@@ -1,718 +0,0 @@
-/* zip.c -- IO on .zip files using zlib 
-   Version 0.15 beta, Mar 19th, 1998,
-
-   Read zip.h for more info
-*/
-
-
-#include 
-#include 
-#include 
-#include "zlib.h"
-#include "zip.h"
-
-#ifdef STDC
-#  include 
-#  include 
-#  include 
-#endif
-#ifdef NO_ERRNO_H
-    extern int errno;
-#else
-#   include 
-#endif
-
-
-#ifndef local
-#  define local static
-#endif
-/* compile with -Dlocal if your debugger can't find static symbols */
-
-#ifndef VERSIONMADEBY
-# define VERSIONMADEBY   (0x0) /* platform depedent */
-#endif
-
-#ifndef Z_BUFSIZE
-#define Z_BUFSIZE (16384)
-#endif
-
-#ifndef Z_MAXFILENAMEINZIP
-#define Z_MAXFILENAMEINZIP (256)
-#endif
-
-#ifndef ALLOC
-# define ALLOC(size) (malloc(size))
-#endif
-#ifndef TRYFREE
-# define TRYFREE(p) {if (p) free(p);}
-#endif
-
-/*
-#define SIZECENTRALDIRITEM (0x2e)
-#define SIZEZIPLOCALHEADER (0x1e)
-*/
-
-/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
-
-#ifndef SEEK_CUR
-#define SEEK_CUR    1
-#endif
-
-#ifndef SEEK_END
-#define SEEK_END    2
-#endif
-
-#ifndef SEEK_SET
-#define SEEK_SET    0
-#endif
-
-const char zip_copyright[] =
-   " zip 0.15 Copyright 1998 Gilles Vollant ";
-
-
-#define SIZEDATA_INDATABLOCK (4096-(4*4))
-
-#define LOCALHEADERMAGIC    (0x04034b50)
-#define CENTRALHEADERMAGIC  (0x02014b50)
-#define ENDHEADERMAGIC      (0x06054b50)
-
-#define FLAG_LOCALHEADER_OFFSET (0x06)
-#define CRC_LOCALHEADER_OFFSET  (0x0e)
-
-#define SIZECENTRALHEADER (0x2e) /* 46 */
-
-typedef struct linkedlist_datablock_internal_s
-{
-  struct linkedlist_datablock_internal_s* next_datablock;
-  uLong  avail_in_this_block;
-  uLong  filled_in_this_block;
-  uLong  unused; /* for future use and alignement */
-  unsigned char data[SIZEDATA_INDATABLOCK];
-} linkedlist_datablock_internal;
-
-typedef struct linkedlist_data_s
-{
-    linkedlist_datablock_internal* first_block;
-    linkedlist_datablock_internal* last_block;
-} linkedlist_data;
-
-
-typedef struct
-{
-	z_stream stream;            /* zLib stream structure for inflate */
-    int  stream_initialised;    /* 1 is stream is initialised */
-    uInt pos_in_buffered_data;  /* last written byte in buffered_data */
-
-    uLong pos_local_header;     /* offset of the local header of the file 
-                                     currenty writing */
-    char* central_header;       /* central header data for the current file */
-    uLong size_centralheader;   /* size of the central header for cur file */
-    uLong flag;                 /* flag of the file currently writing */
-
-    int  method;                /* compression method of file currenty wr.*/
-    Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
-    uLong dosDate;
-    uLong crc32;
-} curfile_info;
-
-typedef struct
-{
-    FILE * filezip;
-    linkedlist_data central_dir;/* datablock with central dir in construction*/
-    int  in_opened_file_inzip;  /* 1 if a file in the zip is currently writ.*/
-    curfile_info ci;            /* info on the file curretly writing */
-
-    uLong begin_pos;            /* position of the beginning of the zipfile */
-    uLong number_entry;
-} zip_internal;
-
-local linkedlist_datablock_internal* allocate_new_datablock()
-{
-    linkedlist_datablock_internal* ldi;
-    ldi = (linkedlist_datablock_internal*)
-                 ALLOC(sizeof(linkedlist_datablock_internal));
-    if (ldi!=NULL)
-    {
-        ldi->next_datablock = NULL ;
-        ldi->filled_in_this_block = 0 ;
-        ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ;
-    }
-    return ldi;
-}
-
-local void free_datablock(ldi)
-    linkedlist_datablock_internal* ldi;
-{
-    while (ldi!=NULL)
-    {
-        linkedlist_datablock_internal* ldinext = ldi->next_datablock;
-        TRYFREE(ldi);
-        ldi = ldinext;
-    }
-}
-
-local void init_linkedlist(ll)
-    linkedlist_data* ll;
-{
-    ll->first_block = ll->last_block = NULL;
-}
-
-local void free_linkedlist(ll)
-    linkedlist_data* ll;
-{
-    free_datablock(ll->first_block);
-    ll->first_block = ll->last_block = NULL;
-}
-
-
-local int add_data_in_datablock(ll,buf,len)
-    linkedlist_data* ll;    
-    const void* buf;
-    uLong len;
-{
-    linkedlist_datablock_internal* ldi;
-    const unsigned char* from_copy;
-
-    if (ll==NULL)
-        return ZIP_INTERNALERROR;
-
-    if (ll->last_block == NULL)
-    {
-        ll->first_block = ll->last_block = allocate_new_datablock();
-        if (ll->first_block == NULL)
-            return ZIP_INTERNALERROR;
-    }
-
-    ldi = ll->last_block;
-    from_copy = (unsigned char*)buf;
-
-    while (len>0)
-    {
-        uInt copy_this;
-        uInt i;
-        unsigned char* to_copy;
-
-        if (ldi->avail_in_this_block==0)
-        {
-            ldi->next_datablock = allocate_new_datablock();
-            if (ldi->next_datablock == NULL)
-                return ZIP_INTERNALERROR;
-            ldi = ldi->next_datablock ;
-            ll->last_block = ldi;
-        }
-
-        if (ldi->avail_in_this_block < len)
-            copy_this = (uInt)ldi->avail_in_this_block;
-        else
-            copy_this = (uInt)len;
-
-        to_copy = &(ldi->data[ldi->filled_in_this_block]);
-
-        for (i=0;ifilled_in_this_block += copy_this;
-        ldi->avail_in_this_block -= copy_this;
-        from_copy += copy_this ;
-        len -= copy_this;
-    }
-    return ZIP_OK;
-}
-
-
-local int write_datablock(fout,ll)
-    FILE * fout;
-    linkedlist_data* ll;    
-{
-    linkedlist_datablock_internal* ldi;
-    ldi = ll->first_block;
-    while (ldi!=NULL)
-    {
-        if (ldi->filled_in_this_block > 0)
-            if (fwrite(ldi->data,(uInt)ldi->filled_in_this_block,1,fout)!=1)
-                return ZIP_ERRNO;
-        ldi = ldi->next_datablock;
-    }
-    return ZIP_OK;
-}
-
-/****************************************************************************/
-
-/* ===========================================================================
-   Outputs a long in LSB order to the given file
-   nbByte == 1, 2 or 4 (byte, short or long)
-*/
-
-local int ziplocal_putValue OF((FILE *file, uLong x, int nbByte));
-local int ziplocal_putValue (file, x, nbByte)
-    FILE *file;
-    uLong x;
-    int nbByte;
-{
-    unsigned char buf[4];
-    int n;
-    for (n = 0; n < nbByte; n++) {
-        buf[n] = (unsigned char)(x & 0xff);
-        x >>= 8;
-    }
-    if (fwrite(buf,nbByte,1,file)!=1)
-        return ZIP_ERRNO;
-    else
-        return ZIP_OK;
-}
-
-local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte));
-local void ziplocal_putValue_inmemory (dest, x, nbByte)
-    void* dest;
-    uLong x;
-    int nbByte;
-{
-    unsigned char* buf=(unsigned char*)dest;
-    int n;
-    for (n = 0; n < nbByte; n++) {
-        buf[n] = (unsigned char)(x & 0xff);
-        x >>= 8;
-    }
-}
-/****************************************************************************/
-
-
-local uLong ziplocal_TmzDateToDosDate(ptm,dosDate)
-    tm_zip* ptm;
-    uLong dosDate;
-{
-    uLong year = (uLong)ptm->tm_year;
-    if (year>1980)
-        year-=1980;
-    else if (year>80)
-        year-=80;
-    return
-      (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
-        ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
-}
-
-
-/****************************************************************************/
-
-extern zipFile ZEXPORT zipOpen (pathname, append)
-    const char *pathname;
-    int append;
-{
-    zip_internal ziinit;
-    zip_internal* zi;
-
-    ziinit.filezip = fopen(pathname,(append == 0) ? "wb" : "ab");
-    if (ziinit.filezip == NULL)
-        return NULL;
-    ziinit.begin_pos = ftell(ziinit.filezip);
-    ziinit.in_opened_file_inzip = 0;
-    ziinit.ci.stream_initialised = 0;
-    ziinit.number_entry = 0;
-    init_linkedlist(&(ziinit.central_dir));
-
-
-    zi = (zip_internal*)ALLOC(sizeof(zip_internal));
-    if (zi==NULL)
-    {
-        fclose(ziinit.filezip);
-        return NULL;
-    }
-
-    *zi = ziinit;
-    return (zipFile)zi;
-}
-
-extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, 
-                                        extrafield_local, size_extrafield_local,
-                                        extrafield_global, size_extrafield_global,
-                                        comment, method, level)
-    zipFile file;
-    const char* filename;
-    const zip_fileinfo* zipfi;
-    const void* extrafield_local;
-    uInt size_extrafield_local;
-    const void* extrafield_global;
-    uInt size_extrafield_global;
-    const char* comment;
-    int method;
-    int level;
-{
-    zip_internal* zi;
-    uInt size_filename;
-    uInt size_comment;
-    uInt i;
-    int err = ZIP_OK;
-
-    if (file == NULL)
-        return ZIP_PARAMERROR;
-    if ((method!=0) && (method!=Z_DEFLATED))
-        return ZIP_PARAMERROR;
-
-    zi = (zip_internal*)file;
-
-    if (zi->in_opened_file_inzip == 1)
-    {
-        err = zipCloseFileInZip (file);
-        if (err != ZIP_OK)
-            return err;
-    }
-
-
-    if (filename==NULL)
-        filename="-";
-
-    if (comment==NULL)
-        size_comment = 0;
-    else
-        size_comment = strlen(comment);
-
-    size_filename = strlen(filename);
-
-    if (zipfi == NULL)
-        zi->ci.dosDate = 0;
-    else
-    {
-        if (zipfi->dosDate != 0)
-            zi->ci.dosDate = zipfi->dosDate;
-        else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);
-    }
-
-    zi->ci.flag = 0;
-    if ((level==8) || (level==9))
-      zi->ci.flag |= 2;
-    if ((level==2))
-      zi->ci.flag |= 4;
-    if ((level==1))
-      zi->ci.flag |= 6;
-
-    zi->ci.crc32 = 0;
-    zi->ci.method = method;
-    zi->ci.stream_initialised = 0;
-    zi->ci.pos_in_buffered_data = 0;
-    zi->ci.pos_local_header = ftell(zi->filezip);
-    zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + 
-                                      size_extrafield_global + size_comment;
-    zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);
-
-    ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
-    /* version info */
-    ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2);
-    ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);
-    ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);
-    ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);
-    ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);
-    ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
-    ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
-    ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
-    ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
-    ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
-    ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
-    ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/
-
-    if (zipfi==NULL)
-        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); 
-    else
-        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); 
-
-    if (zipfi==NULL)
-        ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); 
-    else
-        ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);
-
-    ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header,4);
-
-    for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i);
-
-    for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) =
-              *(((const char*)extrafield_global)+i);
-
-    for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+
-              size_extrafield_global+i) = *(filename+i);
-    if (zi->ci.central_header == NULL)
-        return ZIP_INTERNALERROR;
-
-    /* write the local header */
-    err = ziplocal_putValue(zi->filezip,(uLong)LOCALHEADERMAGIC,4);
-
-    if (err==ZIP_OK)
-        err = ziplocal_putValue(zi->filezip,(uLong)20,2);/* version needed to extract */
-    if (err==ZIP_OK)
-        err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.flag,2);
-
-    if (err==ZIP_OK)
-        err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.method,2);
-
-    if (err==ZIP_OK)
-        err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.dosDate,4);
-
-    if (err==ZIP_OK)
-        err = ziplocal_putValue(zi->filezip,(uLong)0,4); /* crc 32, unknown */
-    if (err==ZIP_OK)
-        err = ziplocal_putValue(zi->filezip,(uLong)0,4); /* compressed size, unknown */
-    if (err==ZIP_OK)
-        err = ziplocal_putValue(zi->filezip,(uLong)0,4); /* uncompressed size, unknown */
-
-    if (err==ZIP_OK)
-        err = ziplocal_putValue(zi->filezip,(uLong)size_filename,2);
-
-    if (err==ZIP_OK)
-        err = ziplocal_putValue(zi->filezip,(uLong)size_extrafield_local,2);
-
-    if ((err==ZIP_OK) && (size_filename>0))
-        if (fwrite(filename,(uInt)size_filename,1,zi->filezip)!=1)
-                err = ZIP_ERRNO;
-
-    if ((err==ZIP_OK) && (size_extrafield_local>0))
-        if (fwrite(extrafield_local,(uInt)size_extrafield_local,1,zi->filezip)
-                                                                           !=1)
-                err = ZIP_ERRNO;
-
-    zi->ci.stream.avail_in = (uInt)0;
-    zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
-    zi->ci.stream.next_out = zi->ci.buffered_data;
-    zi->ci.stream.total_in = 0;
-    zi->ci.stream.total_out = 0;
-
-    if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED))
-    {
-        zi->ci.stream.zalloc = (alloc_func)0;
-        zi->ci.stream.zfree = (free_func)0;
-        zi->ci.stream.opaque = (voidpf)0;
-
-        err = deflateInit2(&zi->ci.stream, level,
-               Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, 0);
-
-        if (err==Z_OK)
-            zi->ci.stream_initialised = 1;
-    }
-
-
-    if (err==Z_OK)
-        zi->in_opened_file_inzip = 1;
-    return err;
-}
-
-extern int ZEXPORT zipWriteInFileInZip (file, buf, len)
-    zipFile file;
-    const voidp buf;
-    unsigned len;
-{
-    zip_internal* zi;
-    int err=ZIP_OK;
-
-    if (file == NULL)
-        return ZIP_PARAMERROR;
-    zi = (zip_internal*)file;
-
-    if (zi->in_opened_file_inzip == 0)
-        return ZIP_PARAMERROR;
-
-    zi->ci.stream.next_in = buf;
-    zi->ci.stream.avail_in = len;
-    zi->ci.crc32 = crc32(zi->ci.crc32,buf,len);
-
-    while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
-    {
-        if (zi->ci.stream.avail_out == 0)
-        {
-            if (fwrite(zi->ci.buffered_data,(uInt)zi->ci.pos_in_buffered_data,1,zi->filezip)
-                                                                           !=1)
-                err = ZIP_ERRNO;
-            zi->ci.pos_in_buffered_data = 0;
-            zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
-            zi->ci.stream.next_out = zi->ci.buffered_data;
-        }
-
-        if (zi->ci.method == Z_DEFLATED)
-        {
-            uLong uTotalOutBefore = zi->ci.stream.total_out;
-            err=deflate(&zi->ci.stream,  Z_NO_FLUSH);
-            zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
-
-        }
-        else
-        {
-            uInt copy_this,i;
-            if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
-                copy_this = zi->ci.stream.avail_in;
-            else
-                copy_this = zi->ci.stream.avail_out;
-            for (i=0;ici.stream.next_out)+i) =
-                    *(((const char*)zi->ci.stream.next_in)+i);
-            {
-                zi->ci.stream.avail_in -= copy_this;
-                zi->ci.stream.avail_out-= copy_this;
-                zi->ci.stream.next_in+= copy_this;
-                zi->ci.stream.next_out+= copy_this;
-                zi->ci.stream.total_in+= copy_this;
-                zi->ci.stream.total_out+= copy_this;
-                zi->ci.pos_in_buffered_data += copy_this;
-            }
-        }
-    }
-
-    return 0;
-}
-
-extern int ZEXPORT zipCloseFileInZip (file)
-    zipFile file;
-{
-    zip_internal* zi;
-    int err=ZIP_OK;
-
-    if (file == NULL)
-        return ZIP_PARAMERROR;
-    zi = (zip_internal*)file;
-
-    if (zi->in_opened_file_inzip == 0)    
-        return ZIP_PARAMERROR;
-    zi->ci.stream.avail_in = 0;
-    
-    if (zi->ci.method == Z_DEFLATED)
-        while (err==ZIP_OK)
-    {
-        uLong uTotalOutBefore;
-        if (zi->ci.stream.avail_out == 0)
-        {
-            if (fwrite(zi->ci.buffered_data,(uInt)zi->ci.pos_in_buffered_data,1,zi->filezip)
-                                                                           !=1)
-                err = ZIP_ERRNO;
-            zi->ci.pos_in_buffered_data = 0;
-            zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
-            zi->ci.stream.next_out = zi->ci.buffered_data;
-        }
-        uTotalOutBefore = zi->ci.stream.total_out;
-        err=deflate(&zi->ci.stream,  Z_FINISH);
-        zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
-    }
-
-    if (err==Z_STREAM_END)
-        err=ZIP_OK; /* this is normal */
-
-    if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
-        if (fwrite(zi->ci.buffered_data,(uInt)zi->ci.pos_in_buffered_data,1,zi->filezip)
-                                                                       !=1)
-            err = ZIP_ERRNO;
-
-    if ((zi->ci.method == Z_DEFLATED) && (err==ZIP_OK))
-    {
-        err=deflateEnd(&zi->ci.stream);
-        zi->ci.stream_initialised = 0;
-    }
-
-    ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)zi->ci.crc32,4); /*crc*/
-    ziplocal_putValue_inmemory(zi->ci.central_header+20,
-                                (uLong)zi->ci.stream.total_out,4); /*compr size*/
-    ziplocal_putValue_inmemory(zi->ci.central_header+24,
-                                (uLong)zi->ci.stream.total_in,4); /*uncompr size*/
-
-    if (err==ZIP_OK)
-        err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header,
-                                       (uLong)zi->ci.size_centralheader);
-    free(zi->ci.central_header);
-
-    if (err==ZIP_OK)
-    {
-        long cur_pos_inzip = ftell(zi->filezip);
-	    if (fseek(zi->filezip,
-                  zi->ci.pos_local_header + 14,SEEK_SET)!=0)
-		    err = ZIP_ERRNO;
-
-        if (err==ZIP_OK)
-            err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.crc32,4); /* crc 32, unknown */
-
-        if (err==ZIP_OK) /* compressed size, unknown */
-            err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.stream.total_out,4); 
-
-        if (err==ZIP_OK) /* uncompressed size, unknown */
-            err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.stream.total_in,4);
-
-	    if (fseek(zi->filezip,
-                  cur_pos_inzip,SEEK_SET)!=0)
-		    err = ZIP_ERRNO;
-    }
-
-    zi->number_entry ++;
-    zi->in_opened_file_inzip = 0;
-
-    return err;
-}
-
-extern int ZEXPORT zipClose (file, global_comment)
-    zipFile file;
-    const char* global_comment;
-{
-    zip_internal* zi;
-    int err = 0;
-    uLong size_centraldir = 0;
-    uLong centraldir_pos_inzip ;
-    uInt size_global_comment;
-    if (file == NULL)
-        return ZIP_PARAMERROR;
-    zi = (zip_internal*)file;
-
-    if (zi->in_opened_file_inzip == 1)
-    {
-        err = zipCloseFileInZip (file);
-    }
-
-    if (global_comment==NULL)
-        size_global_comment = 0;
-    else
-        size_global_comment = strlen(global_comment);
-
-
-    centraldir_pos_inzip = ftell(zi->filezip);
-    if (err==ZIP_OK)
-    {
-        linkedlist_datablock_internal* ldi = zi->central_dir.first_block ;
-        while (ldi!=NULL)
-        {
-            if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))
-                if (fwrite(ldi->data,(uInt)ldi->filled_in_this_block,
-                                        1,zi->filezip) !=1 )
-                    err = ZIP_ERRNO;
-
-            size_centraldir += ldi->filled_in_this_block;
-            ldi = ldi->next_datablock;
-        }
-    }
-    free_datablock(zi->central_dir.first_block);
-
-    if (err==ZIP_OK) /* Magic End */
-        err = ziplocal_putValue(zi->filezip,(uLong)ENDHEADERMAGIC,4);
-
-    if (err==ZIP_OK) /* number of this disk */
-        err = ziplocal_putValue(zi->filezip,(uLong)0,2);
-
-    if (err==ZIP_OK) /* number of the disk with the start of the central directory */
-        err = ziplocal_putValue(zi->filezip,(uLong)0,2);
-
-    if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
-        err = ziplocal_putValue(zi->filezip,(uLong)zi->number_entry,2);
-
-    if (err==ZIP_OK) /* total number of entries in the central dir */
-        err = ziplocal_putValue(zi->filezip,(uLong)zi->number_entry,2);
-
-    if (err==ZIP_OK) /* size of the central directory */
-        err = ziplocal_putValue(zi->filezip,(uLong)size_centraldir,4);
-
-    if (err==ZIP_OK) /* offset of start of central directory with respect to the 
-	                        starting disk number */
-        err = ziplocal_putValue(zi->filezip,(uLong)centraldir_pos_inzip ,4);
-
-    if (err==ZIP_OK) /* zipfile comment length */
-        err = ziplocal_putValue(zi->filezip,(uLong)size_global_comment,2);
-
-    if ((err==ZIP_OK) && (size_global_comment>0))
-        if (fwrite(global_comment,(uInt)size_global_comment,1,zi->filezip) !=1 )
-                err = ZIP_ERRNO;
-    fclose(zi->filezip);
-    TRYFREE(zi);
-
-    return err;
-}
diff --git a/Lib/zlib/contrib/minizip/zip.def b/Lib/zlib/contrib/minizip/zip.def
deleted file mode 100644
index 5d5079fbc..000000000
--- a/Lib/zlib/contrib/minizip/zip.def
+++ /dev/null
@@ -1,5 +0,0 @@
-	zipOpen                       @80
-	zipOpenNewFileInZip           @81
-	zipWriteInFileInZip           @82
-	zipCloseFileInZip             @83
-	zipClose                      @84
diff --git a/Lib/zlib/contrib/minizip/zip.h b/Lib/zlib/contrib/minizip/zip.h
deleted file mode 100644
index 678260b33..000000000
--- a/Lib/zlib/contrib/minizip/zip.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/* zip.h -- IO for compress .zip files using zlib 
-   Version 0.15 alpha, Mar 19th, 1998,
-
-   Copyright (C) 1998 Gilles Vollant
-
-   This unzip package allow creates .ZIP file, compatible with PKZip 2.04g
-     WinZip, InfoZip tools and compatible.
-   Encryption and multi volume ZipFile (span) are not supported.
-   Old compressions used by old PKZip 1.x are not supported
-
-  For uncompress .zip file, look at unzip.h
-
-   THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE
-   CAN CHANGE IN FUTURE VERSION !!
-   I WAIT FEEDBACK at mail info@winimage.com
-   Visit also http://www.winimage.com/zLibDll/zip.htm for evolution
-
-   Condition of use and distribution are the same than zlib :
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-
-*/
-
-/* for more info about .ZIP format, see 
-      ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip
-   PkWare has also a specification at :
-      ftp://ftp.pkware.com/probdesc.zip
-*/
-
-#ifndef _zip_H
-#define _zip_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef _ZLIB_H
-#include "zlib.h"
-#endif
-
-#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
-/* like the STRICT of WIN32, we define a pointer that cannot be converted
-    from (void*) without cast */
-typedef struct TagzipFile__ { int unused; } zipFile__; 
-typedef zipFile__ *zipFile;
-#else
-typedef voidp zipFile;
-#endif
-
-#define ZIP_OK                                  (0)
-#define ZIP_ERRNO               (Z_ERRNO)
-#define ZIP_PARAMERROR                  (-102)
-#define ZIP_INTERNALERROR               (-104)
-
-/* tm_zip contain date/time info */
-typedef struct tm_zip_s 
-{
-	uInt tm_sec;            /* seconds after the minute - [0,59] */
-	uInt tm_min;            /* minutes after the hour - [0,59] */
-	uInt tm_hour;           /* hours since midnight - [0,23] */
-	uInt tm_mday;           /* day of the month - [1,31] */
-	uInt tm_mon;            /* months since January - [0,11] */
-	uInt tm_year;           /* years - [1980..2044] */
-} tm_zip;
-
-typedef struct
-{
-	tm_zip      tmz_date;       /* date in understandable format           */
-    uLong       dosDate;       /* if dos_date == 0, tmu_date is used      */
-/*    uLong       flag;        */   /* general purpose bit flag        2 bytes */
-
-    uLong       internal_fa;    /* internal file attributes        2 bytes */
-    uLong       external_fa;    /* external file attributes        4 bytes */
-} zip_fileinfo;
-
-extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
-/*
-  Create a zipfile.
-	 pathname contain on Windows NT a filename like "c:\\zlib\\zlib111.zip" or on
-	   an Unix computer "zlib/zlib111.zip".
-	 if the file pathname exist and append=1, the zip will be created at the end
-	   of the file. (useful if the file contain a self extractor code)
-	 If the zipfile cannot be opened, the return value is NULL.
-     Else, the return value is a zipFile Handle, usable with other function
-	   of this zip package.
-
-
-*/
-
-extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
-					   const char* filename,
-					   const zip_fileinfo* zipfi,
-					   const void* extrafield_local,
-					   uInt size_extrafield_local,
-					   const void* extrafield_global,
-					   uInt size_extrafield_global,
-					   const char* comment,
-					   int method,
-					   int level));
-/*
-  Open a file in the ZIP for writing.
-  filename : the filename in zip (if NULL, '-' without quote will be used
-  *zipfi contain supplemental information
-  if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
-    contains the extrafield data the the local header
-  if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
-    contains the extrafield data the the local header
-  if comment != NULL, comment contain the comment string
-  method contain the compression method (0 for store, Z_DEFLATED for deflate)
-  level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
-*/
-
-extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
-					   const voidp buf,
-					   unsigned len));
-/*
-  Write data in the zipfile
-*/
-
-extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
-/*
-  Close the current file in the zipfile
-*/
-
-extern int ZEXPORT zipClose OF((zipFile file,
-				const char* global_comment));
-/*
-  Close the zipfile
-*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _zip_H */
diff --git a/Lib/zlib/contrib/minizip/zlibvc.def b/Lib/zlib/contrib/minizip/zlibvc.def
deleted file mode 100644
index 7e9d60d55..000000000
--- a/Lib/zlib/contrib/minizip/zlibvc.def
+++ /dev/null
@@ -1,74 +0,0 @@
-LIBRARY		"zlib"
-
-DESCRIPTION	'"""zlib data compression library"""'
-
-
-VERSION		1.11
-
-
-HEAPSIZE	1048576,8192
-
-EXPORTS
-    adler32                        @1
-    compress                       @2
-    crc32                          @3
-    deflate                        @4
-    deflateCopy                    @5
-    deflateEnd                     @6
-    deflateInit2_                  @7
-    deflateInit_                   @8
-    deflateParams                  @9
-    deflateReset                   @10
-    deflateSetDictionary           @11
-    gzclose                        @12
-    gzdopen                        @13
-    gzerror                        @14
-    gzflush                        @15
-    gzopen                         @16
-    gzread                         @17
-    gzwrite                        @18
-    inflate                        @19
-    inflateEnd                     @20
-    inflateInit2_                  @21
-    inflateInit_                   @22
-    inflateReset                   @23
-    inflateSetDictionary           @24
-    inflateSync                    @25
-    uncompress                     @26
-    zlibVersion                    @27
-    gzprintf                       @28
-    gzputc                         @29
-    gzgetc                         @30
-    gzseek                         @31
-    gzrewind                       @32
-    gztell                         @33
-    gzeof                          @34
-    gzsetparams                    @35
-    zError                         @36
-    inflateSyncPoint               @37
-    get_crc_table                  @38
-    compress2                      @39
-    gzputs                         @40
-    gzgets                         @41
-
-	unzOpen                       @61
-	unzClose                      @62
-	unzGetGlobalInfo              @63
-	unzGetCurrentFileInfo         @64
-	unzGoToFirstFile              @65
-	unzGoToNextFile               @66
-	unzOpenCurrentFile            @67
-	unzReadCurrentFile            @68
-	unztell                       @70
-	unzeof                        @71
-	unzCloseCurrentFile           @72
-	unzGetGlobalComment           @73
-	unzStringFileNameCompare      @74
-	unzLocateFile                 @75
-	unzGetLocalExtrafield         @76
-
-	zipOpen                       @80
-	zipOpenNewFileInZip           @81
-	zipWriteInFileInZip           @82
-	zipCloseFileInZip             @83
-	zipClose                      @84
diff --git a/Lib/zlib/contrib/minizip/zlibvc.dsp b/Lib/zlib/contrib/minizip/zlibvc.dsp
deleted file mode 100644
index a70d4d4a6..000000000
--- a/Lib/zlib/contrib/minizip/zlibvc.dsp
+++ /dev/null
@@ -1,651 +0,0 @@
-# Microsoft Developer Studio Project File - Name="zlibvc" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 5.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-# TARGTYPE "Win32 (ALPHA) Dynamic-Link Library" 0x0602
-
-CFG=zlibvc - Win32 Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "zlibvc.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "zlibvc.mak" CFG="zlibvc - Win32 Release"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "zlibvc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 ReleaseAxp" (based on\
- "Win32 (ALPHA) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 ReleaseWithoutAsm" (based on\
- "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 ReleaseWithoutCrtdll" (based on\
- "Win32 (x86) Dynamic-Link Library")
-!MESSAGE 
-
-# Begin Project
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir ".\Release"
-# PROP BASE Intermediate_Dir ".\Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir ".\Release"
-# PROP Intermediate_Dir ".\Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir ".\Debug"
-# PROP BASE Intermediate_Dir ".\Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir ".\Debug"
-# PROP Intermediate_Dir ".\Debug"
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "_DEBUG" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "_DEBUG"
-# ADD RSC /l 0x40c /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:".\Debug\zlib.dll"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "zlibvc__"
-# PROP BASE Intermediate_Dir "zlibvc__"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "zlibvc__"
-# PROP Intermediate_Dir "zlibvc__"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
-# ADD CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT BASE LINK32 /pdb:none
-# ADD LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:"zlibvc__\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "zlibvc_0"
-# PROP BASE Intermediate_Dir "zlibvc_0"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "zlibvc_0"
-# PROP Intermediate_Dir "zlibvc_0"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT BASE LINK32 /pdb:none
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_0\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "zlibvc_1"
-# PROP BASE Intermediate_Dir "zlibvc_1"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "zlibvc_1"
-# PROP Intermediate_Dir "zlibvc_1"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT BASE LINK32 /pdb:none
-# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_1\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF 
-
-# Begin Target
-
-# Name "zlibvc - Win32 Release"
-# Name "zlibvc - Win32 Debug"
-# Name "zlibvc - Win32 ReleaseAxp"
-# Name "zlibvc - Win32 ReleaseWithoutAsm"
-# Name "zlibvc - Win32 ReleaseWithoutCrtdll"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
-# Begin Source File
-
-SOURCE=.\adler32.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_ADLER=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\compress.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_COMPR=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\crc32.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_CRC32=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\deflate.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_DEFLA=\
-	".\deflate.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\gvmat32c.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\gzio.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_GZIO_=\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\infblock.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFBL=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\infcodes.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFCO=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inffast.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\inffast.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFFA=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inffast.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\inflate.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFLA=\
-	".\infblock.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\inftrees.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFTR=\
-	".\inftrees.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\infutil.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFUT=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\trees.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_TREES=\
-	".\deflate.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uncompr.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_UNCOM=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unzip.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\zip.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\zlib.rc
-# End Source File
-# Begin Source File
-
-SOURCE=.\zlibvc.def
-# End Source File
-# Begin Source File
-
-SOURCE=.\zutil.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_ZUTIL=\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
-# Begin Source File
-
-SOURCE=.\deflate.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\infblock.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\infcodes.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\inffast.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\inftrees.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\infutil.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\zconf.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\zlib.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\zutil.h
-# End Source File
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
-# End Group
-# End Target
-# End Project
diff --git a/Lib/zlib/contrib/minizip/zlibvc.dsw b/Lib/zlib/contrib/minizip/zlibvc.dsw
deleted file mode 100644
index 493cd8703..000000000
--- a/Lib/zlib/contrib/minizip/zlibvc.dsw
+++ /dev/null
@@ -1,41 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 5.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "zlibstat"=.\zlibstat.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "zlibvc"=.\zlibvc.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/Lib/zlib/contrib/untgz/Makefile b/Lib/zlib/contrib/untgz/Makefile
deleted file mode 100644
index 409b4bdea..000000000
--- a/Lib/zlib/contrib/untgz/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-CC=cc
-CFLAGS=-g
-
-untgz: untgz.o  ../../libz.a
-	$(CC) $(CFLAGS) -o untgz  untgz.o -L../.. -lz
-
-untgz.o: untgz.c ../../zlib.h
-	$(CC) $(CFLAGS) -c -I../.. untgz.c
-
-../../libz.a:
-	cd ../..; make
-
-clean:
-	rm -f untgz untgz.o *~
diff --git a/Lib/zlib/contrib/untgz/makefile.w32 b/Lib/zlib/contrib/untgz/makefile.w32
deleted file mode 100644
index c99dc28cf..000000000
--- a/Lib/zlib/contrib/untgz/makefile.w32
+++ /dev/null
@@ -1,63 +0,0 @@
-# Makefile for zlib.  Modified for mingw32
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile, 
-# 
-#   make -fmakefile.w32
-# 
-
-CC=gcc
-
-# Generate dependencies (see end of the file)
-
-CPPFLAGS=-MMD 
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-             -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is not found, replace with copy /Y .
-CP=cp -f
-
-# The default value of RM is "rm -f."  
-# If "rm.exe" is not found, uncomment:
-# RM=del
-
-LD=gcc
-LDLIBS=-L. -lz
-LDFLAGS=-s
-
-
-INCL=zlib.h zconf.h
-LIBS=libz.a
-
-AR=ar rcs
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o \
-       inffast.o
-
-TEST_OBJS = minigzip.o untgz.o
-
-all: minigzip.exe untgz.exe
-
-rebuild:	clean	all
-
-libz.a: $(OBJS)
-	$(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
-	$(LD) $(LDFLAGS) -o $@ $< $(LDLIBS)
-
-.PHONY : clean
-
-clean:
-	$(RM) *.d *.o *.exe libz.a foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
-
diff --git a/Lib/zlib/contrib/untgz/untgz.c b/Lib/zlib/contrib/untgz/untgz.c
deleted file mode 100644
index 4a431ff31..000000000
--- a/Lib/zlib/contrib/untgz/untgz.c
+++ /dev/null
@@ -1,522 +0,0 @@
-/*
- * untgz.c -- Display contents and/or extract file from
- * a gzip'd TAR file
- * written by "Pedro A. Aranda Guti\irrez" 
- * adaptation to Unix by Jean-loup Gailly 
- */
-
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#ifdef unix
-# include 
-#else
-# include 
-# include 
-#endif
-
-#include "zlib.h"
-
-#ifdef WIN32
-#  ifndef F_OK
-#    define F_OK (0)
-#  endif
-#  ifdef _MSC_VER
-#    define mkdir(dirname,mode) _mkdir(dirname)
-#    define strdup(str)         _strdup(str)
-#    define unlink(fn)          _unlink(fn)
-#    define access(path,mode)   _access(path,mode)
-#  else
-#    define mkdir(dirname,mode) _mkdir(dirname)
-#  endif
-#else
-#  include 
-#endif
-
-
-/* Values used in typeflag field.  */
-
-#define REGTYPE	 '0'		/* regular file */
-#define AREGTYPE '\0'		/* regular file */
-#define LNKTYPE  '1'		/* link */
-#define SYMTYPE  '2'		/* reserved */
-#define CHRTYPE  '3'		/* character special */
-#define BLKTYPE  '4'		/* block special */
-#define DIRTYPE  '5'		/* directory */
-#define FIFOTYPE '6'		/* FIFO special */
-#define CONTTYPE '7'		/* reserved */
-
-#define BLOCKSIZE 512
-
-struct tar_header
-{				/* byte offset */
-  char name[100];		/*   0 */
-  char mode[8];			/* 100 */
-  char uid[8];			/* 108 */
-  char gid[8];			/* 116 */
-  char size[12];		/* 124 */
-  char mtime[12];		/* 136 */
-  char chksum[8];		/* 148 */
-  char typeflag;		/* 156 */
-  char linkname[100];		/* 157 */
-  char magic[6];		/* 257 */
-  char version[2];		/* 263 */
-  char uname[32];		/* 265 */
-  char gname[32];		/* 297 */
-  char devmajor[8];		/* 329 */
-  char devminor[8];		/* 337 */
-  char prefix[155];		/* 345 */
-				/* 500 */
-};
-
-union tar_buffer {
-  char               buffer[BLOCKSIZE];
-  struct tar_header  header;
-};
-
-enum { TGZ_EXTRACT = 0, TGZ_LIST };
-
-static char *TGZfname	OF((const char *));
-void TGZnotfound	OF((const char *));
-
-int getoct		OF((char *, int));
-char *strtime		OF((time_t *));
-int ExprMatch		OF((char *,char *));
-
-int makedir		OF((char *));
-int matchname		OF((int,int,char **,char *));
-
-void error		OF((const char *));
-int  tar		OF((gzFile, int, int, int, char **));
-
-void help		OF((int));
-int main		OF((int, char **));
-
-char *prog;
-
-/* This will give a benign warning */
-
-static char *TGZprefix[] = { "\0", ".tgz", ".tar.gz", ".tar", NULL };
-
-/* Return the real name of the TGZ archive */
-/* or NULL if it does not exist. */
-
-static char *TGZfname OF((const char *fname))
-{
-  static char buffer[1024];
-  int origlen,i;
-  
-  strcpy(buffer,fname);
-  origlen = strlen(buffer);
-
-  for (i=0; TGZprefix[i]; i++)
-    {
-       strcpy(buffer+origlen,TGZprefix[i]);
-       if (access(buffer,F_OK) == 0)
-         return buffer;
-    }
-  return NULL;
-}
-
-/* error message for the filename */
-
-void TGZnotfound OF((const char *fname))
-{
-  int i;
-
-  fprintf(stderr,"%s : couldn't find ",prog);
-  for (i=0;TGZprefix[i];i++)
-    fprintf(stderr,(TGZprefix[i+1]) ? "%s%s, " : "or %s%s\n",
-            fname,
-            TGZprefix[i]);
-  exit(1);
-}
-
-
-/* help functions */
-
-int getoct(char *p,int width)
-{
-  int result = 0;
-  char c;
-  
-  while (width --)
-    {
-      c = *p++;
-      if (c == ' ')
-	continue;
-      if (c == 0)
-	break;
-      result = result * 8 + (c - '0');
-    }
-  return result;
-}
-
-char *strtime (time_t *t)
-{
-  struct tm   *local;
-  static char result[32];
-
-  local = localtime(t);
-  sprintf(result,"%2d/%02d/%4d %02d:%02d:%02d",
-	  local->tm_mday, local->tm_mon+1, local->tm_year+1900,
-	  local->tm_hour, local->tm_min,   local->tm_sec);
-  return result;
-}
-
-
-/* regular expression matching */
-
-#define ISSPECIAL(c) (((c) == '*') || ((c) == '/'))
-
-int ExprMatch(char *string,char *expr)
-{
-  while (1)
-    {
-      if (ISSPECIAL(*expr))
-	{
-	  if (*expr == '/')
-	    {
-	      if (*string != '\\' && *string != '/')
-		return 0;
-	      string ++; expr++;
-	    }
-	  else if (*expr == '*')
-	    {
-	      if (*expr ++ == 0)
-		return 1;
-	      while (*++string != *expr)
-		if (*string == 0)
-		  return 0;
-	    }
-	}
-      else
-	{
-	  if (*string != *expr)
-	    return 0;
-	  if (*expr++ == 0)
-	    return 1;
-	  string++;
-	}
-    }
-}
-
-/* recursive make directory */
-/* abort if you get an ENOENT errno somewhere in the middle */
-/* e.g. ignore error "mkdir on existing directory" */
-/* */
-/* return 1 if OK */
-/*        0 on error */
-
-int makedir (char *newdir)
-{
-  char *buffer = strdup(newdir);
-  char *p;
-  int  len = strlen(buffer);
-  
-  if (len <= 0) {
-    free(buffer);
-    return 0;
-  }
-  if (buffer[len-1] == '/') {
-    buffer[len-1] = '\0';
-  }
-  if (mkdir(buffer, 0775) == 0)
-    {
-      free(buffer);
-      return 1;
-    }
-
-  p = buffer+1;
-  while (1)
-    {
-      char hold;
-      
-      while(*p && *p != '\\' && *p != '/')
-	p++;
-      hold = *p;
-      *p = 0;
-      if ((mkdir(buffer, 0775) == -1) && (errno == ENOENT))
-	{
-	  fprintf(stderr,"%s: couldn't create directory %s\n",prog,buffer);
-	  free(buffer);
-	  return 0;
-	}
-      if (hold == 0)
-	break;
-      *p++ = hold;
-    }
-  free(buffer);
-  return 1;
-}
-
-int matchname (int arg,int argc,char **argv,char *fname)
-{
-  if (arg == argc)		/* no arguments given (untgz tgzarchive) */
-    return 1;
-
-  while (arg < argc)
-    if (ExprMatch(fname,argv[arg++]))
-      return 1;
-
-  return 0; /* ignore this for the moment being */
-}
-
-
-/* Tar file list or extract */
-
-int tar (gzFile in,int action,int arg,int argc,char **argv)
-{
-  union  tar_buffer buffer;
-  int    len;
-  int    err;
-  int    getheader = 1;
-  int    remaining = 0;
-  FILE   *outfile = NULL;
-  char   fname[BLOCKSIZE];
-  time_t tartime;
-  
-  if (action == TGZ_LIST)
-    printf("     day      time     size                       file\n"
-	   " ---------- -------- --------- -------------------------------------\n");
-  while (1)
-    {
-      len = gzread(in, &buffer, BLOCKSIZE);
-      if (len < 0)
-	error (gzerror(in, &err));
-      /*
-       * Always expect complete blocks to process
-       * the tar information.
-       */
-      if (len != BLOCKSIZE)
-	error("gzread: incomplete block read");
-      
-      /*
-       * If we have to get a tar header
-       */
-      if (getheader == 1)
-	{
-	  /*
-	   * if we met the end of the tar
-	   * or the end-of-tar block,
-	   * we are done
-	   */
-	  if ((len == 0)  || (buffer.header.name[0]== 0)) break;
-
-	  tartime = (time_t)getoct(buffer.header.mtime,12);
-	  strcpy(fname,buffer.header.name);
-	  
-	  switch (buffer.header.typeflag)
-	    {
-	    case DIRTYPE:
-	      if (action == TGZ_LIST)
-		printf(" %s      %s\n",strtime(&tartime),fname);
-	      if (action == TGZ_EXTRACT)
-		makedir(fname);
-	      break;
-	    case REGTYPE:
-	    case AREGTYPE:
-	      remaining = getoct(buffer.header.size,12);
-	      if (action == TGZ_LIST)
-		printf(" %s %9d %s\n",strtime(&tartime),remaining,fname);
-	      if (action == TGZ_EXTRACT)
-		{
-		  if ((remaining) && (matchname(arg,argc,argv,fname)))
-		    {
-		      outfile = fopen(fname,"wb");
-		      if (outfile == NULL) {
-			/* try creating directory */
-			char *p = strrchr(fname, '/');
-			if (p != NULL) {
-			  *p = '\0';
-			  makedir(fname);
-			  *p = '/';
-			  outfile = fopen(fname,"wb");
-			}
-		      }
-		      fprintf(stderr,
-			      "%s %s\n",
-			      (outfile) ? "Extracting" : "Couldn't create",
-			      fname);
-		    }
-		  else
-		    outfile = NULL;
-		}
-	      /*
-	       * could have no contents
-	       */
-	      getheader = (remaining) ? 0 : 1;
-	      break;
-	    default:
-	      if (action == TGZ_LIST)
-		printf(" %s     <---> %s\n",strtime(&tartime),fname);
-	      break;
-	    }
-	}
-      else
-	{
-	  unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining;
-
-	  if ((action == TGZ_EXTRACT) && (outfile != NULL))
-	    {
-	      if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes)
-		{
-		  fprintf(stderr,"%s : error writing %s skipping...\n",prog,fname);
-		  fclose(outfile);
-		  unlink(fname);
-		}
-	    }
-	  remaining -= bytes;
-	  if (remaining == 0)
-	    {
-	      getheader = 1;
-	      if ((action == TGZ_EXTRACT) && (outfile != NULL))
-		{
-#ifdef WIN32
-		  HANDLE hFile;
-		  FILETIME ftm,ftLocal;
-		  SYSTEMTIME st;
-		  struct tm localt;
- 
-		  fclose(outfile);
-
-		  localt = *localtime(&tartime);
-
-		  hFile = CreateFile(fname, GENERIC_READ | GENERIC_WRITE,
-				     0, NULL, OPEN_EXISTING, 0, NULL);
-		  
-		  st.wYear = (WORD)localt.tm_year+1900;
-		  st.wMonth = (WORD)localt.tm_mon;
-		  st.wDayOfWeek = (WORD)localt.tm_wday;
-		  st.wDay = (WORD)localt.tm_mday;
-		  st.wHour = (WORD)localt.tm_hour;
-		  st.wMinute = (WORD)localt.tm_min;
-		  st.wSecond = (WORD)localt.tm_sec;
-		  st.wMilliseconds = 0;
-		  SystemTimeToFileTime(&st,&ftLocal);
-		  LocalFileTimeToFileTime(&ftLocal,&ftm);
-		  SetFileTime(hFile,&ftm,NULL,&ftm);
-		  CloseHandle(hFile);
-
-		  outfile = NULL;
-#else
-		  struct utimbuf settime;
-
-		  settime.actime = settime.modtime = tartime;
-
-		  fclose(outfile);
-		  outfile = NULL;
-		  utime(fname,&settime);
-#endif
-		}
-	    }
-	}
-    }
-  
-  if (gzclose(in) != Z_OK)
-    error("failed gzclose");
-
-  return 0;
-}
-
-
-/* =========================================================== */
-
-void help(int exitval)
-{
-  fprintf(stderr,
-	  "untgz v 0.1\n"
-	  " an sample application of zlib 1.0.4\n\n"
-          "Usage : untgz TGZfile            to extract all files\n"
-          "        untgz TGZfile fname ...  to extract selected files\n"
-          "        untgz -l TGZfile         to list archive contents\n"
-          "        untgz -h                 to display this help\n\n");
-  exit(exitval);
-}
-
-void error(const char *msg)
-{
-    fprintf(stderr, "%s: %s\n", prog, msg);
-    exit(1);
-}
-
-
-/* ====================================================================== */
-
-int _CRT_glob = 0;	/* disable globbing of the arguments */
-
-int main(int argc,char **argv)
-{
-    int 	action = TGZ_EXTRACT;
-    int 	arg = 1;
-    char	*TGZfile;
-    gzFile	*f;
-    
-
-    prog = strrchr(argv[0],'\\');
-    if (prog == NULL)
-      {
-	prog = strrchr(argv[0],'/');
-	if (prog == NULL)
-	  {
-	    prog = strrchr(argv[0],':');
-	    if (prog == NULL)
-	      prog = argv[0];
-	    else
-	      prog++;
-	  }
-	else
-	  prog++;
-      }
-    else
-      prog++;
-    
-    if (argc == 1)
-      help(0);
-
-    if (strcmp(argv[arg],"-l") == 0)
-      {
-	action = TGZ_LIST;
-	if (argc == ++arg)
-	  help(0);
-      }
-    else if (strcmp(argv[arg],"-h") == 0)
-      {
-	help(0);
-      }
-
-    if ((TGZfile = TGZfname(argv[arg])) == NULL)
-      TGZnotfound(argv[arg]);            
-
-    ++arg;
-    if ((action == TGZ_LIST) && (arg != argc))
-      help(1);
-
-/*
- *  Process the TGZ file
- */
-    switch(action)
-      {
-      case TGZ_LIST:
-      case TGZ_EXTRACT:
-	f = gzopen(TGZfile,"rb");
-	if (f == NULL)
-	  {
-	    fprintf(stderr,"%s: Couldn't gzopen %s\n",
-		    prog,
-		    TGZfile);
-	    return 1;
-	  }
-	exit(tar(f, action, arg, argc, argv));
-      break;
-	
-      default:
-	error("Unknown option!");
-	exit(1);
-      }
-
-    return 0;
-}
diff --git a/Lib/zlib/contrib/visual-basic.txt b/Lib/zlib/contrib/visual-basic.txt
deleted file mode 100644
index 10fb44bc5..000000000
--- a/Lib/zlib/contrib/visual-basic.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-See below some functions declarations for Visual Basic.
-
-Frequently Asked Question:
-
-Q: Each time I use the compress function I get the -5 error (not enough
-   room in the output buffer).
-
-A: Make sure that the length of the compressed buffer is passed by
-   reference ("as any"), not by value ("as long"). Also check that
-   before the call of compress this length is equal to the total size of
-   the compressed buffer and not zero.
-
-
-From: "Jon Caruana" 
-Subject: Re: How to port zlib declares to vb?
-Date: Mon, 28 Oct 1996 18:33:03 -0600
-
-Got the answer! (I haven't had time to check this but it's what I got, and
-looks correct):
-
-He has the following routines working:
-        compress
-        uncompress
-        gzopen
-        gzwrite
-        gzread
-        gzclose
-
-Declares follow: (Quoted from Carlos Rios , in Vb4 form)
-
-#If Win16 Then   'Use Win16 calls.
-Declare Function compress Lib "ZLIB.DLL" (ByVal compr As
-        String, comprLen As Any, ByVal buf As String, ByVal buflen
-        As Long) As Integer
-Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr
-        As String, uncomprLen As Any, ByVal compr As String, ByVal
-        lcompr As Long) As Integer
-Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As
-        String, ByVal mode As String) As Long
-Declare Function gzread Lib "ZLIB.DLL" (ByVal file As
-        Long, ByVal uncompr As String, ByVal uncomprLen As Integer)
-        As Integer
-Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As
-        Long, ByVal uncompr As String, ByVal uncomprLen As Integer)
-        As Integer
-Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As
-        Long) As Integer
-#Else
-Declare Function compress Lib "ZLIB32.DLL"
-        (ByVal compr As String, comprLen As Any, ByVal buf As
-        String, ByVal buflen As Long) As Integer
-Declare Function uncompress Lib "ZLIB32.DLL"
-        (ByVal uncompr As String, uncomprLen As Any, ByVal compr As
-        String, ByVal lcompr As Long) As Long
-Declare Function gzopen Lib "ZLIB32.DLL"
-        (ByVal file As String, ByVal mode As String) As Long
-Declare Function gzread Lib "ZLIB32.DLL"
-        (ByVal file As Long, ByVal uncompr As String, ByVal
-        uncomprLen As Long) As Long
-Declare Function gzwrite Lib "ZLIB32.DLL"
-        (ByVal file As Long, ByVal uncompr As String, ByVal
-        uncomprLen As Long) As Long
-Declare Function gzclose Lib "ZLIB32.DLL"
-        (ByVal file As Long) As Long
-#End If
-
--Jon Caruana
-jon-net@usa.net
-Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member
diff --git a/Lib/zlib/crc32.c b/Lib/zlib/crc32.c
deleted file mode 100644
index a91101a81..000000000
--- a/Lib/zlib/crc32.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/* crc32.c -- compute the CRC-32 of a data stream
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* @(#) $Id$ */
-
-#include "zlib.h"
-
-#define local static
-
-#ifdef DYNAMIC_CRC_TABLE
-
-local int crc_table_empty = 1;
-local uLongf crc_table[256];
-local void make_crc_table OF((void));
-
-/*
-  Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
-  x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
-
-  Polynomials over GF(2) are represented in binary, one bit per coefficient,
-  with the lowest powers in the most significant bit.  Then adding polynomials
-  is just exclusive-or, and multiplying a polynomial by x is a right shift by
-  one.  If we call the above polynomial p, and represent a byte as the
-  polynomial q, also with the lowest power in the most significant bit (so the
-  byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
-  where a mod b means the remainder after dividing a by b.
-
-  This calculation is done using the shift-register method of multiplying and
-  taking the remainder.  The register is initialized to zero, and for each
-  incoming bit, x^32 is added mod p to the register if the bit is a one (where
-  x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
-  x (which is shifting right by one and adding x^32 mod p if the bit shifted
-  out is a one).  We start with the highest power (least significant bit) of
-  q and repeat for all eight bits of q.
-
-  The table is simply the CRC of all possible eight bit values.  This is all
-  the information needed to generate CRC's on data a byte at a time for all
-  combinations of CRC register values and incoming bytes.
-*/
-local void make_crc_table()
-{
-  uLong c;
-  int n, k;
-  uLong poly;            /* polynomial exclusive-or pattern */
-  /* terms of polynomial defining this crc (except x^32): */
-  static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
-
-  /* make exclusive-or pattern from polynomial (0xedb88320L) */
-  poly = 0L;
-  for (n = 0; n < sizeof(p)/sizeof(Byte); n++)
-    poly |= 1L << (31 - p[n]);
- 
-  for (n = 0; n < 256; n++)
-  {
-    c = (uLong)n;
-    for (k = 0; k < 8; k++)
-      c = c & 1 ? poly ^ (c >> 1) : c >> 1;
-    crc_table[n] = c;
-  }
-  crc_table_empty = 0;
-}
-#else
-/* ========================================================================
- * Table of CRC-32's of all single-byte values (made by make_crc_table)
- */
-local const uLongf crc_table[256] = {
-  0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
-  0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
-  0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
-  0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
-  0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
-  0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
-  0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
-  0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
-  0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
-  0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
-  0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
-  0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
-  0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
-  0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
-  0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
-  0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
-  0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
-  0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
-  0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
-  0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
-  0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
-  0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
-  0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
-  0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
-  0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
-  0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
-  0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
-  0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
-  0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
-  0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
-  0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
-  0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
-  0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
-  0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
-  0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
-  0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
-  0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
-  0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
-  0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
-  0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
-  0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
-  0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
-  0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
-  0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
-  0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
-  0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
-  0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
-  0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
-  0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
-  0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
-  0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
-  0x2d02ef8dL
-};
-#endif
-
-/* =========================================================================
- * This function can be used by asm versions of crc32()
- */
-const uLongf * ZEXPORT get_crc_table()
-{
-#ifdef DYNAMIC_CRC_TABLE
-  if (crc_table_empty) make_crc_table();
-#endif
-  return (const uLongf *)crc_table;
-}
-
-/* ========================================================================= */
-#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
-#define DO2(buf)  DO1(buf); DO1(buf);
-#define DO4(buf)  DO2(buf); DO2(buf);
-#define DO8(buf)  DO4(buf); DO4(buf);
-
-/* ========================================================================= */
-uLong ZEXPORT crc32(crc, buf, len)
-    uLong crc;
-    const Bytef *buf;
-    uInt len;
-{
-    if (buf == Z_NULL) return 0L;
-#ifdef DYNAMIC_CRC_TABLE
-    if (crc_table_empty)
-      make_crc_table();
-#endif
-    crc = crc ^ 0xffffffffL;
-    while (len >= 8)
-    {
-      DO8(buf);
-      len -= 8;
-    }
-    if (len) do {
-      DO1(buf);
-    } while (--len);
-    return crc ^ 0xffffffffL;
-}
diff --git a/Lib/zlib/deflate.c b/Lib/zlib/deflate.c
deleted file mode 100644
index 25d5818e2..000000000
--- a/Lib/zlib/deflate.c
+++ /dev/null
@@ -1,1350 +0,0 @@
-/* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-1998 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/*
- *  ALGORITHM
- *
- *      The "deflation" process depends on being able to identify portions
- *      of the input text which are identical to earlier input (within a
- *      sliding window trailing behind the input currently being processed).
- *
- *      The most straightforward technique turns out to be the fastest for
- *      most input files: try all possible matches and select the longest.
- *      The key feature of this algorithm is that insertions into the string
- *      dictionary are very simple and thus fast, and deletions are avoided
- *      completely. Insertions are performed at each input character, whereas
- *      string matches are performed only when the previous match ends. So it
- *      is preferable to spend more time in matches to allow very fast string
- *      insertions and avoid deletions. The matching algorithm for small
- *      strings is inspired from that of Rabin & Karp. A brute force approach
- *      is used to find longer strings when a small match has been found.
- *      A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
- *      (by Leonid Broukhis).
- *         A previous version of this file used a more sophisticated algorithm
- *      (by Fiala and Greene) which is guaranteed to run in linear amortized
- *      time, but has a larger average cost, uses more memory and is patented.
- *      However the F&G algorithm may be faster for some highly redundant
- *      files if the parameter max_chain_length (described below) is too large.
- *
- *  ACKNOWLEDGEMENTS
- *
- *      The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
- *      I found it in 'freeze' written by Leonid Broukhis.
- *      Thanks to many people for bug reports and testing.
- *
- *  REFERENCES
- *
- *      Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
- *      Available in ftp://ds.internic.net/rfc/rfc1951.txt
- *
- *      A description of the Rabin and Karp algorithm is given in the book
- *         "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
- *
- *      Fiala,E.R., and Greene,D.H.
- *         Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
- *
- */
-
-/* @(#) $Id$ */
-
-#include "deflate.h"
-
-const char deflate_copyright[] =
-   " deflate 1.1.3 Copyright 1995-1998 Jean-loup Gailly ";
-/*
-  If you use the zlib library in a product, an acknowledgment is welcome
-  in the documentation of your product. If for some reason you cannot
-  include such an acknowledgment, I would appreciate that you keep this
-  copyright string in the executable of your product.
- */
-
-/* ===========================================================================
- *  Function prototypes.
- */
-typedef enum {
-    need_more,      /* block not completed, need more input or more output */
-    block_done,     /* block flush performed */
-    finish_started, /* finish started, need only more output at next deflate */
-    finish_done     /* finish done, accept no more input or output */
-} block_state;
-
-typedef block_state (*compress_func) OF((deflate_state *s, int flush));
-/* Compression function. Returns the block state after the call. */
-
-local void fill_window    OF((deflate_state *s));
-local block_state deflate_stored OF((deflate_state *s, int flush));
-local block_state deflate_fast   OF((deflate_state *s, int flush));
-local block_state deflate_slow   OF((deflate_state *s, int flush));
-local void lm_init        OF((deflate_state *s));
-local void putShortMSB    OF((deflate_state *s, uInt b));
-local void flush_pending  OF((z_streamp strm));
-local int read_buf        OF((z_streamp strm, Bytef *buf, unsigned size));
-#ifdef ASMV
-      void match_init OF((void)); /* asm code initialization */
-      uInt longest_match  OF((deflate_state *s, IPos cur_match));
-#else
-local uInt longest_match  OF((deflate_state *s, IPos cur_match));
-#endif
-
-#ifdef DEBUG
-local  void check_match OF((deflate_state *s, IPos start, IPos match,
-                            int length));
-#endif
-
-/* ===========================================================================
- * Local data
- */
-
-#define NIL 0
-/* Tail of hash chains */
-
-#ifndef TOO_FAR
-#  define TOO_FAR 4096
-#endif
-/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
-
-#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
-/* Minimum amount of lookahead, except at the end of the input file.
- * See deflate.c for comments about the MIN_MATCH+1.
- */
-
-/* Values for max_lazy_match, good_match and max_chain_length, depending on
- * the desired pack level (0..9). The values given below have been tuned to
- * exclude worst case performance for pathological files. Better values may be
- * found for specific files.
- */
-typedef struct config_s {
-   ush good_length; /* reduce lazy search above this match length */
-   ush max_lazy;    /* do not perform lazy search above this match length */
-   ush nice_length; /* quit search above this match length */
-   ush max_chain;
-   compress_func func;
-} config;
-
-local const config configuration_table[10] = {
-/*      good lazy nice chain */
-/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */
-/* 1 */ {4,    4,  8,    4, deflate_fast}, /* maximum speed, no lazy matches */
-/* 2 */ {4,    5, 16,    8, deflate_fast},
-/* 3 */ {4,    6, 32,   32, deflate_fast},
-
-/* 4 */ {4,    4, 16,   16, deflate_slow},  /* lazy matches */
-/* 5 */ {8,   16, 32,   32, deflate_slow},
-/* 6 */ {8,   16, 128, 128, deflate_slow},
-/* 7 */ {8,   32, 128, 256, deflate_slow},
-/* 8 */ {32, 128, 258, 1024, deflate_slow},
-/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */
-
-/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
- * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
- * meaning.
- */
-
-#define EQUAL 0
-/* result of memcmp for equal strings */
-
-struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
-
-/* ===========================================================================
- * Update a hash value with the given input byte
- * IN  assertion: all calls to to UPDATE_HASH are made with consecutive
- *    input characters, so that a running hash key can be computed from the
- *    previous key instead of complete recalculation each time.
- */
-#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask)
-
-
-/* ===========================================================================
- * Insert string str in the dictionary and set match_head to the previous head
- * of the hash chain (the most recent string with same hash key). Return
- * the previous length of the hash chain.
- * If this file is compiled with -DFASTEST, the compression level is forced
- * to 1, and no hash chains are maintained.
- * IN  assertion: all calls to to INSERT_STRING are made with consecutive
- *    input characters and the first MIN_MATCH bytes of str are valid
- *    (except for the last MIN_MATCH-1 bytes of the input file).
- */
-#ifdef FASTEST
-#define INSERT_STRING(s, str, match_head) \
-   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
-    match_head = s->head[s->ins_h], \
-    s->head[s->ins_h] = (Pos)(str))
-#else
-#define INSERT_STRING(s, str, match_head) \
-   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
-    s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \
-    s->head[s->ins_h] = (Pos)(str))
-#endif
-
-/* ===========================================================================
- * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
- * prev[] will be initialized on the fly.
- */
-#define CLEAR_HASH(s) \
-    s->head[s->hash_size-1] = NIL; \
-    zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
-
-/* ========================================================================= */
-int ZEXPORT deflateInit_(strm, level, version, stream_size)
-    z_streamp strm;
-    int level;
-    const char *version;
-    int stream_size;
-{
-    return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
-			 Z_DEFAULT_STRATEGY, version, stream_size);
-    /* To do: ignore strm->next_in if we use it as window */
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
-		  version, stream_size)
-    z_streamp strm;
-    int  level;
-    int  method;
-    int  windowBits;
-    int  memLevel;
-    int  strategy;
-    const char *version;
-    int stream_size;
-{
-    deflate_state *s;
-    int noheader = 0;
-    static const char* my_version = ZLIB_VERSION;
-
-    ushf *overlay;
-    /* We overlay pending_buf and d_buf+l_buf. This works since the average
-     * output size for (length,distance) codes is <= 24 bits.
-     */
-
-    if (version == Z_NULL || version[0] != my_version[0] ||
-        stream_size != sizeof(z_stream)) {
-	return Z_VERSION_ERROR;
-    }
-    if (strm == Z_NULL) return Z_STREAM_ERROR;
-
-    strm->msg = Z_NULL;
-    if (strm->zalloc == Z_NULL) {
-	strm->zalloc = zcalloc;
-	strm->opaque = (voidpf)0;
-    }
-    if (strm->zfree == Z_NULL) strm->zfree = zcfree;
-
-    if (level == Z_DEFAULT_COMPRESSION) level = 6;
-#ifdef FASTEST
-    level = 1;
-#endif
-
-    if (windowBits < 0) { /* undocumented feature: suppress zlib header */
-        noheader = 1;
-        windowBits = -windowBits;
-    }
-    if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
-        windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
-	strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
-        return Z_STREAM_ERROR;
-    }
-    s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
-    if (s == Z_NULL) return Z_MEM_ERROR;
-    strm->state = (struct internal_state FAR *)s;
-    s->strm = strm;
-
-    s->noheader = noheader;
-    s->w_bits = windowBits;
-    s->w_size = 1 << s->w_bits;
-    s->w_mask = s->w_size - 1;
-
-    s->hash_bits = memLevel + 7;
-    s->hash_size = 1 << s->hash_bits;
-    s->hash_mask = s->hash_size - 1;
-    s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
-
-    s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
-    s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
-    s->head   = (Posf *)  ZALLOC(strm, s->hash_size, sizeof(Pos));
-
-    s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
-
-    overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
-    s->pending_buf = (uchf *) overlay;
-    s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
-
-    if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
-        s->pending_buf == Z_NULL) {
-        strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
-        deflateEnd (strm);
-        return Z_MEM_ERROR;
-    }
-    s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
-    s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
-
-    s->level = level;
-    s->strategy = strategy;
-    s->method = (Byte)method;
-
-    return deflateReset(strm);
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
-    z_streamp strm;
-    const Bytef *dictionary;
-    uInt  dictLength;
-{
-    deflate_state *s;
-    uInt length = dictLength;
-    uInt n;
-    IPos hash_head = 0;
-
-    if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||
-        strm->state->status != INIT_STATE) return Z_STREAM_ERROR;
-
-    s = strm->state;
-    strm->adler = adler32(strm->adler, dictionary, dictLength);
-
-    if (length < MIN_MATCH) return Z_OK;
-    if (length > MAX_DIST(s)) {
-	length = MAX_DIST(s);
-#ifndef USE_DICT_HEAD
-	dictionary += dictLength - length; /* use the tail of the dictionary */
-#endif
-    }
-    zmemcpy(s->window, dictionary, length);
-    s->strstart = length;
-    s->block_start = (long)length;
-
-    /* Insert all strings in the hash table (except for the last two bytes).
-     * s->lookahead stays null, so s->ins_h will be recomputed at the next
-     * call of fill_window.
-     */
-    s->ins_h = s->window[0];
-    UPDATE_HASH(s, s->ins_h, s->window[1]);
-    for (n = 0; n <= length - MIN_MATCH; n++) {
-	INSERT_STRING(s, n, hash_head);
-    }
-    if (hash_head) hash_head = 0;  /* to make compiler happy */
-    return Z_OK;
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateReset (strm)
-    z_streamp strm;
-{
-    deflate_state *s;
-    
-    if (strm == Z_NULL || strm->state == Z_NULL ||
-        strm->zalloc == Z_NULL || strm->zfree == Z_NULL) return Z_STREAM_ERROR;
-
-    strm->total_in = strm->total_out = 0;
-    strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
-    strm->data_type = Z_UNKNOWN;
-
-    s = (deflate_state *)strm->state;
-    s->pending = 0;
-    s->pending_out = s->pending_buf;
-
-    if (s->noheader < 0) {
-        s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */
-    }
-    s->status = s->noheader ? BUSY_STATE : INIT_STATE;
-    strm->adler = 1;
-    s->last_flush = Z_NO_FLUSH;
-
-    _tr_init(s);
-    lm_init(s);
-
-    return Z_OK;
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateParams(strm, level, strategy)
-    z_streamp strm;
-    int level;
-    int strategy;
-{
-    deflate_state *s;
-    compress_func func;
-    int err = Z_OK;
-
-    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
-    s = strm->state;
-
-    if (level == Z_DEFAULT_COMPRESSION) {
-	level = 6;
-    }
-    if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
-	return Z_STREAM_ERROR;
-    }
-    func = configuration_table[s->level].func;
-
-    if (func != configuration_table[level].func && strm->total_in != 0) {
-	/* Flush the last buffer: */
-	err = deflate(strm, Z_PARTIAL_FLUSH);
-    }
-    if (s->level != level) {
-	s->level = level;
-	s->max_lazy_match   = configuration_table[level].max_lazy;
-	s->good_match       = configuration_table[level].good_length;
-	s->nice_match       = configuration_table[level].nice_length;
-	s->max_chain_length = configuration_table[level].max_chain;
-    }
-    s->strategy = strategy;
-    return err;
-}
-
-/* =========================================================================
- * Put a short in the pending buffer. The 16-bit value is put in MSB order.
- * IN assertion: the stream state is correct and there is enough room in
- * pending_buf.
- */
-local void putShortMSB (s, b)
-    deflate_state *s;
-    uInt b;
-{
-    put_byte(s, (Byte)(b >> 8));
-    put_byte(s, (Byte)(b & 0xff));
-}   
-
-/* =========================================================================
- * Flush as much pending output as possible. All deflate() output goes
- * through this function so some applications may wish to modify it
- * to avoid allocating a large strm->next_out buffer and copying into it.
- * (See also read_buf()).
- */
-local void flush_pending(strm)
-    z_streamp strm;
-{
-    unsigned len = strm->state->pending;
-
-    if (len > strm->avail_out) len = strm->avail_out;
-    if (len == 0) return;
-
-    zmemcpy(strm->next_out, strm->state->pending_out, len);
-    strm->next_out  += len;
-    strm->state->pending_out  += len;
-    strm->total_out += len;
-    strm->avail_out  -= len;
-    strm->state->pending -= len;
-    if (strm->state->pending == 0) {
-        strm->state->pending_out = strm->state->pending_buf;
-    }
-}
-
-/* ========================================================================= */
-int ZEXPORT deflate (strm, flush)
-    z_streamp strm;
-    int flush;
-{
-    int old_flush; /* value of flush param for previous deflate call */
-    deflate_state *s;
-
-    if (strm == Z_NULL || strm->state == Z_NULL ||
-	flush > Z_FINISH || flush < 0) {
-        return Z_STREAM_ERROR;
-    }
-    s = strm->state;
-
-    if (strm->next_out == Z_NULL ||
-        (strm->next_in == Z_NULL && strm->avail_in != 0) ||
-	(s->status == FINISH_STATE && flush != Z_FINISH)) {
-        ERR_RETURN(strm, Z_STREAM_ERROR);
-    }
-    if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
-
-    s->strm = strm; /* just in case */
-    old_flush = s->last_flush;
-    s->last_flush = flush;
-
-    /* Write the zlib header */
-    if (s->status == INIT_STATE) {
-
-        uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
-        uInt level_flags = (s->level-1) >> 1;
-
-        if (level_flags > 3) level_flags = 3;
-        header |= (level_flags << 6);
-	if (s->strstart != 0) header |= PRESET_DICT;
-        header += 31 - (header % 31);
-
-        s->status = BUSY_STATE;
-        putShortMSB(s, header);
-
-	/* Save the adler32 of the preset dictionary: */
-	if (s->strstart != 0) {
-	    putShortMSB(s, (uInt)(strm->adler >> 16));
-	    putShortMSB(s, (uInt)(strm->adler & 0xffff));
-	}
-	strm->adler = 1L;
-    }
-
-    /* Flush as much pending output as possible */
-    if (s->pending != 0) {
-        flush_pending(strm);
-        if (strm->avail_out == 0) {
-	    /* Since avail_out is 0, deflate will be called again with
-	     * more output space, but possibly with both pending and
-	     * avail_in equal to zero. There won't be anything to do,
-	     * but this is not an error situation so make sure we
-	     * return OK instead of BUF_ERROR at next call of deflate:
-             */
-	    s->last_flush = -1;
-	    return Z_OK;
-	}
-
-    /* Make sure there is something to do and avoid duplicate consecutive
-     * flushes. For repeated and useless calls with Z_FINISH, we keep
-     * returning Z_STREAM_END instead of Z_BUFF_ERROR.
-     */
-    } else if (strm->avail_in == 0 && flush <= old_flush &&
-	       flush != Z_FINISH) {
-        ERR_RETURN(strm, Z_BUF_ERROR);
-    }
-
-    /* User must not provide more input after the first FINISH: */
-    if (s->status == FINISH_STATE && strm->avail_in != 0) {
-        ERR_RETURN(strm, Z_BUF_ERROR);
-    }
-
-    /* Start a new block or continue the current one.
-     */
-    if (strm->avail_in != 0 || s->lookahead != 0 ||
-        (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
-        block_state bstate;
-
-	bstate = (*(configuration_table[s->level].func))(s, flush);
-
-        if (bstate == finish_started || bstate == finish_done) {
-            s->status = FINISH_STATE;
-        }
-        if (bstate == need_more || bstate == finish_started) {
-	    if (strm->avail_out == 0) {
-	        s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
-	    }
-	    return Z_OK;
-	    /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
-	     * of deflate should use the same flush parameter to make sure
-	     * that the flush is complete. So we don't have to output an
-	     * empty block here, this will be done at next call. This also
-	     * ensures that for a very small output buffer, we emit at most
-	     * one empty block.
-	     */
-	}
-        if (bstate == block_done) {
-            if (flush == Z_PARTIAL_FLUSH) {
-                _tr_align(s);
-            } else { /* FULL_FLUSH or SYNC_FLUSH */
-                _tr_stored_block(s, (char*)0, 0L, 0);
-                /* For a full flush, this empty block will be recognized
-                 * as a special marker by inflate_sync().
-                 */
-                if (flush == Z_FULL_FLUSH) {
-                    CLEAR_HASH(s);             /* forget history */
-                }
-            }
-            flush_pending(strm);
-	    if (strm->avail_out == 0) {
-	      s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
-	      return Z_OK;
-	    }
-        }
-    }
-    Assert(strm->avail_out > 0, "bug2");
-
-    if (flush != Z_FINISH) return Z_OK;
-    if (s->noheader) return Z_STREAM_END;
-
-    /* Write the zlib trailer (adler32) */
-    putShortMSB(s, (uInt)(strm->adler >> 16));
-    putShortMSB(s, (uInt)(strm->adler & 0xffff));
-    flush_pending(strm);
-    /* If avail_out is zero, the application will call deflate again
-     * to flush the rest.
-     */
-    s->noheader = -1; /* write the trailer only once! */
-    return s->pending != 0 ? Z_OK : Z_STREAM_END;
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateEnd (strm)
-    z_streamp strm;
-{
-    int status;
-
-    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
-
-    status = strm->state->status;
-    if (status != INIT_STATE && status != BUSY_STATE &&
-	status != FINISH_STATE) {
-      return Z_STREAM_ERROR;
-    }
-
-    /* Deallocate in reverse order of allocations: */
-    TRY_FREE(strm, strm->state->pending_buf);
-    TRY_FREE(strm, strm->state->head);
-    TRY_FREE(strm, strm->state->prev);
-    TRY_FREE(strm, strm->state->window);
-
-    ZFREE(strm, strm->state);
-    strm->state = Z_NULL;
-
-    return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
-}
-
-/* =========================================================================
- * Copy the source state to the destination state.
- * To simplify the source, this is not supported for 16-bit MSDOS (which
- * doesn't have enough memory anyway to duplicate compression states).
- */
-int ZEXPORT deflateCopy (dest, source)
-    z_streamp dest;
-    z_streamp source;
-{
-#ifdef MAXSEG_64K
-    return Z_STREAM_ERROR;
-#else
-    deflate_state *ds;
-    deflate_state *ss;
-    ushf *overlay;
-
-
-    if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
-        return Z_STREAM_ERROR;
-    }
-
-    ss = source->state;
-
-    *dest = *source;
-
-    ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
-    if (ds == Z_NULL) return Z_MEM_ERROR;
-    dest->state = (struct internal_state FAR *) ds;
-    *ds = *ss;
-    ds->strm = dest;
-
-    ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
-    ds->prev   = (Posf *)  ZALLOC(dest, ds->w_size, sizeof(Pos));
-    ds->head   = (Posf *)  ZALLOC(dest, ds->hash_size, sizeof(Pos));
-    overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
-    ds->pending_buf = (uchf *) overlay;
-
-    if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
-        ds->pending_buf == Z_NULL) {
-        deflateEnd (dest);
-        return Z_MEM_ERROR;
-    }
-    /* following zmemcpy do not work for 16-bit MSDOS */
-    zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
-    zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
-    zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
-    zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
-
-    ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
-    ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
-    ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
-
-    ds->l_desc.dyn_tree = ds->dyn_ltree;
-    ds->d_desc.dyn_tree = ds->dyn_dtree;
-    ds->bl_desc.dyn_tree = ds->bl_tree;
-
-    return Z_OK;
-#endif
-}
-
-/* ===========================================================================
- * Read a new buffer from the current input stream, update the adler32
- * and total number of bytes read.  All deflate() input goes through
- * this function so some applications may wish to modify it to avoid
- * allocating a large strm->next_in buffer and copying from it.
- * (See also flush_pending()).
- */
-local int read_buf(strm, buf, size)
-    z_streamp strm;
-    Bytef *buf;
-    unsigned size;
-{
-    unsigned len = strm->avail_in;
-
-    if (len > size) len = size;
-    if (len == 0) return 0;
-
-    strm->avail_in  -= len;
-
-    if (!strm->state->noheader) {
-        strm->adler = adler32(strm->adler, strm->next_in, len);
-    }
-    zmemcpy(buf, strm->next_in, len);
-    strm->next_in  += len;
-    strm->total_in += len;
-
-    return (int)len;
-}
-
-/* ===========================================================================
- * Initialize the "longest match" routines for a new zlib stream
- */
-local void lm_init (s)
-    deflate_state *s;
-{
-    s->window_size = (ulg)2L*s->w_size;
-
-    CLEAR_HASH(s);
-
-    /* Set the default configuration parameters:
-     */
-    s->max_lazy_match   = configuration_table[s->level].max_lazy;
-    s->good_match       = configuration_table[s->level].good_length;
-    s->nice_match       = configuration_table[s->level].nice_length;
-    s->max_chain_length = configuration_table[s->level].max_chain;
-
-    s->strstart = 0;
-    s->block_start = 0L;
-    s->lookahead = 0;
-    s->match_length = s->prev_length = MIN_MATCH-1;
-    s->match_available = 0;
-    s->ins_h = 0;
-#ifdef ASMV
-    match_init(); /* initialize the asm code */
-#endif
-}
-
-/* ===========================================================================
- * Set match_start to the longest match starting at the given string and
- * return its length. Matches shorter or equal to prev_length are discarded,
- * in which case the result is equal to prev_length and match_start is
- * garbage.
- * IN assertions: cur_match is the head of the hash chain for the current
- *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
- * OUT assertion: the match length is not greater than s->lookahead.
- */
-#ifndef ASMV
-/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
- * match.S. The code will be functionally equivalent.
- */
-#ifndef FASTEST
-local uInt longest_match(s, cur_match)
-    deflate_state *s;
-    IPos cur_match;                             /* current match */
-{
-    unsigned chain_length = s->max_chain_length;/* max hash chain length */
-    register Bytef *scan = s->window + s->strstart; /* current string */
-    register Bytef *match;                       /* matched string */
-    register int len;                           /* length of current match */
-    int best_len = s->prev_length;              /* best match length so far */
-    int nice_match = s->nice_match;             /* stop if match long enough */
-    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
-        s->strstart - (IPos)MAX_DIST(s) : NIL;
-    /* Stop when cur_match becomes <= limit. To simplify the code,
-     * we prevent matches with the string of window index 0.
-     */
-    Posf *prev = s->prev;
-    uInt wmask = s->w_mask;
-
-#ifdef UNALIGNED_OK
-    /* Compare two bytes at a time. Note: this is not always beneficial.
-     * Try with and without -DUNALIGNED_OK to check.
-     */
-    register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
-    register ush scan_start = *(ushf*)scan;
-    register ush scan_end   = *(ushf*)(scan+best_len-1);
-#else
-    register Bytef *strend = s->window + s->strstart + MAX_MATCH;
-    register Byte scan_end1  = scan[best_len-1];
-    register Byte scan_end   = scan[best_len];
-#endif
-
-    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
-     * It is easy to get rid of this optimization if necessary.
-     */
-    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
-
-    /* Do not waste too much time if we already have a good match: */
-    if (s->prev_length >= s->good_match) {
-        chain_length >>= 2;
-    }
-    /* Do not look for matches beyond the end of the input. This is necessary
-     * to make deflate deterministic.
-     */
-    if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
-
-    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
-
-    do {
-        Assert(cur_match < s->strstart, "no future");
-        match = s->window + cur_match;
-
-        /* Skip to next match if the match length cannot increase
-         * or if the match length is less than 2:
-         */
-#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
-        /* This code assumes sizeof(unsigned short) == 2. Do not use
-         * UNALIGNED_OK if your compiler uses a different size.
-         */
-        if (*(ushf*)(match+best_len-1) != scan_end ||
-            *(ushf*)match != scan_start) continue;
-
-        /* It is not necessary to compare scan[2] and match[2] since they are
-         * always equal when the other bytes match, given that the hash keys
-         * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
-         * strstart+3, +5, ... up to strstart+257. We check for insufficient
-         * lookahead only every 4th comparison; the 128th check will be made
-         * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
-         * necessary to put more guard bytes at the end of the window, or
-         * to check more often for insufficient lookahead.
-         */
-        Assert(scan[2] == match[2], "scan[2]?");
-        scan++, match++;
-        do {
-        } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 scan < strend);
-        /* The funny "do {}" generates better code on most compilers */
-
-        /* Here, scan <= window+strstart+257 */
-        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-        if (*scan == *match) scan++;
-
-        len = (MAX_MATCH - 1) - (int)(strend-scan);
-        scan = strend - (MAX_MATCH-1);
-
-#else /* UNALIGNED_OK */
-
-        if (match[best_len]   != scan_end  ||
-            match[best_len-1] != scan_end1 ||
-            *match            != *scan     ||
-            *++match          != scan[1])      continue;
-
-        /* The check at best_len-1 can be removed because it will be made
-         * again later. (This heuristic is not always a win.)
-         * It is not necessary to compare scan[2] and match[2] since they
-         * are always equal when the other bytes match, given that
-         * the hash keys are equal and that HASH_BITS >= 8.
-         */
-        scan += 2, match++;
-        Assert(*scan == *match, "match[2]?");
-
-        /* We check for insufficient lookahead only every 8th comparison;
-         * the 256th check will be made at strstart+258.
-         */
-        do {
-        } while (*++scan == *++match && *++scan == *++match &&
-                 *++scan == *++match && *++scan == *++match &&
-                 *++scan == *++match && *++scan == *++match &&
-                 *++scan == *++match && *++scan == *++match &&
-                 scan < strend);
-
-        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
-        len = MAX_MATCH - (int)(strend - scan);
-        scan = strend - MAX_MATCH;
-
-#endif /* UNALIGNED_OK */
-
-        if (len > best_len) {
-            s->match_start = cur_match;
-            best_len = len;
-            if (len >= nice_match) break;
-#ifdef UNALIGNED_OK
-            scan_end = *(ushf*)(scan+best_len-1);
-#else
-            scan_end1  = scan[best_len-1];
-            scan_end   = scan[best_len];
-#endif
-        }
-    } while ((cur_match = prev[cur_match & wmask]) > limit
-             && --chain_length != 0);
-
-    if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
-    return s->lookahead;
-}
-
-#else /* FASTEST */
-/* ---------------------------------------------------------------------------
- * Optimized version for level == 1 only
- */
-local uInt longest_match(s, cur_match)
-    deflate_state *s;
-    IPos cur_match;                             /* current match */
-{
-    register Bytef *scan = s->window + s->strstart; /* current string */
-    register Bytef *match;                       /* matched string */
-    register int len;                           /* length of current match */
-    register Bytef *strend = s->window + s->strstart + MAX_MATCH;
-
-    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
-     * It is easy to get rid of this optimization if necessary.
-     */
-    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
-
-    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
-
-    Assert(cur_match < s->strstart, "no future");
-
-    match = s->window + cur_match;
-
-    /* Return failure if the match length is less than 2:
-     */
-    if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
-
-    /* The check at best_len-1 can be removed because it will be made
-     * again later. (This heuristic is not always a win.)
-     * It is not necessary to compare scan[2] and match[2] since they
-     * are always equal when the other bytes match, given that
-     * the hash keys are equal and that HASH_BITS >= 8.
-     */
-    scan += 2, match += 2;
-    Assert(*scan == *match, "match[2]?");
-
-    /* We check for insufficient lookahead only every 8th comparison;
-     * the 256th check will be made at strstart+258.
-     */
-    do {
-    } while (*++scan == *++match && *++scan == *++match &&
-	     *++scan == *++match && *++scan == *++match &&
-	     *++scan == *++match && *++scan == *++match &&
-	     *++scan == *++match && *++scan == *++match &&
-	     scan < strend);
-
-    Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
-    len = MAX_MATCH - (int)(strend - scan);
-
-    if (len < MIN_MATCH) return MIN_MATCH - 1;
-
-    s->match_start = cur_match;
-    return len <= s->lookahead ? len : s->lookahead;
-}
-#endif /* FASTEST */
-#endif /* ASMV */
-
-#ifdef DEBUG
-/* ===========================================================================
- * Check that the match at match_start is indeed a match.
- */
-local void check_match(s, start, match, length)
-    deflate_state *s;
-    IPos start, match;
-    int length;
-{
-    /* check that the match is indeed a match */
-    if (zmemcmp(s->window + match,
-                s->window + start, length) != EQUAL) {
-        fprintf(stderr, " start %u, match %u, length %d\n",
-		start, match, length);
-        do {
-	    fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
-	} while (--length != 0);
-        z_error("invalid match");
-    }
-    if (z_verbose > 1) {
-        fprintf(stderr,"\\[%d,%d]", start-match, length);
-        do { putc(s->window[start++], stderr); } while (--length != 0);
-    }
-}
-#else
-#  define check_match(s, start, match, length)
-#endif
-
-/* ===========================================================================
- * Fill the window when the lookahead becomes insufficient.
- * Updates strstart and lookahead.
- *
- * IN assertion: lookahead < MIN_LOOKAHEAD
- * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
- *    At least one byte has been read, or avail_in == 0; reads are
- *    performed for at least two bytes (required for the zip translate_eol
- *    option -- not supported here).
- */
-local void fill_window(s)
-    deflate_state *s;
-{
-    register unsigned n, m;
-    register Posf *p;
-    unsigned more;    /* Amount of free space at the end of the window. */
-    uInt wsize = s->w_size;
-
-    do {
-        more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
-
-        /* Deal with !@#$% 64K limit: */
-        if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
-            more = wsize;
-
-        } else if (more == (unsigned)(-1)) {
-            /* Very unlikely, but possible on 16 bit machine if strstart == 0
-             * and lookahead == 1 (input done one byte at time)
-             */
-            more--;
-
-        /* If the window is almost full and there is insufficient lookahead,
-         * move the upper half to the lower one to make room in the upper half.
-         */
-        } else if (s->strstart >= wsize+MAX_DIST(s)) {
-
-            zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
-            s->match_start -= wsize;
-            s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
-            s->block_start -= (long) wsize;
-
-            /* Slide the hash table (could be avoided with 32 bit values
-               at the expense of memory usage). We slide even when level == 0
-               to keep the hash table consistent if we switch back to level > 0
-               later. (Using level 0 permanently is not an optimal usage of
-               zlib, so we don't care about this pathological case.)
-             */
-	    n = s->hash_size;
-	    p = &s->head[n];
-	    do {
-		m = *--p;
-		*p = (Pos)(m >= wsize ? m-wsize : NIL);
-	    } while (--n);
-
-	    n = wsize;
-#ifndef FASTEST
-	    p = &s->prev[n];
-	    do {
-		m = *--p;
-		*p = (Pos)(m >= wsize ? m-wsize : NIL);
-		/* If n is not on any hash chain, prev[n] is garbage but
-		 * its value will never be used.
-		 */
-	    } while (--n);
-#endif
-            more += wsize;
-        }
-        if (s->strm->avail_in == 0) return;
-
-        /* If there was no sliding:
-         *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
-         *    more == window_size - lookahead - strstart
-         * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
-         * => more >= window_size - 2*WSIZE + 2
-         * In the BIG_MEM or MMAP case (not yet supported),
-         *   window_size == input_size + MIN_LOOKAHEAD  &&
-         *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
-         * Otherwise, window_size == 2*WSIZE so more >= 2.
-         * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
-         */
-        Assert(more >= 2, "more < 2");
-
-        n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
-        s->lookahead += n;
-
-        /* Initialize the hash value now that we have some input: */
-        if (s->lookahead >= MIN_MATCH) {
-            s->ins_h = s->window[s->strstart];
-            UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
-#if MIN_MATCH != 3
-            Call UPDATE_HASH() MIN_MATCH-3 more times
-#endif
-        }
-        /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
-         * but this is not important since only literal bytes will be emitted.
-         */
-
-    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
-}
-
-/* ===========================================================================
- * Flush the current block, with given end-of-file flag.
- * IN assertion: strstart is set to the end of the current match.
- */
-#define FLUSH_BLOCK_ONLY(s, eof) { \
-   _tr_flush_block(s, (s->block_start >= 0L ? \
-                   (charf *)&s->window[(unsigned)s->block_start] : \
-                   (charf *)Z_NULL), \
-		(ulg)((long)s->strstart - s->block_start), \
-		(eof)); \
-   s->block_start = s->strstart; \
-   flush_pending(s->strm); \
-   Tracev((stderr,"[FLUSH]")); \
-}
-
-/* Same but force premature exit if necessary. */
-#define FLUSH_BLOCK(s, eof) { \
-   FLUSH_BLOCK_ONLY(s, eof); \
-   if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \
-}
-
-/* ===========================================================================
- * Copy without compression as much as possible from the input stream, return
- * the current block state.
- * This function does not insert new strings in the dictionary since
- * uncompressible data is probably not useful. This function is used
- * only for the level=0 compression option.
- * NOTE: this function should be optimized to avoid extra copying from
- * window to pending_buf.
- */
-local block_state deflate_stored(s, flush)
-    deflate_state *s;
-    int flush;
-{
-    /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
-     * to pending_buf_size, and each stored block has a 5 byte header:
-     */
-    ulg max_block_size = 0xffff;
-    ulg max_start;
-
-    if (max_block_size > s->pending_buf_size - 5) {
-        max_block_size = s->pending_buf_size - 5;
-    }
-
-    /* Copy as much as possible from input to output: */
-    for (;;) {
-        /* Fill the window as much as possible: */
-        if (s->lookahead <= 1) {
-
-            Assert(s->strstart < s->w_size+MAX_DIST(s) ||
-		   s->block_start >= (long)s->w_size, "slide too late");
-
-            fill_window(s);
-            if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
-
-            if (s->lookahead == 0) break; /* flush the current block */
-        }
-	Assert(s->block_start >= 0L, "block gone");
-
-	s->strstart += s->lookahead;
-	s->lookahead = 0;
-
-	/* Emit a stored block if pending_buf will be full: */
- 	max_start = s->block_start + max_block_size;
-        if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
-	    /* strstart == 0 is possible when wraparound on 16-bit machine */
-	    s->lookahead = (uInt)(s->strstart - max_start);
-	    s->strstart = (uInt)max_start;
-            FLUSH_BLOCK(s, 0);
-	}
-	/* Flush if we may have to slide, otherwise block_start may become
-         * negative and the data will be gone:
-         */
-        if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
-            FLUSH_BLOCK(s, 0);
-	}
-    }
-    FLUSH_BLOCK(s, flush == Z_FINISH);
-    return flush == Z_FINISH ? finish_done : block_done;
-}
-
-/* ===========================================================================
- * Compress as much as possible from the input stream, return the current
- * block state.
- * This function does not perform lazy evaluation of matches and inserts
- * new strings in the dictionary only for unmatched strings or for short
- * matches. It is used only for the fast compression options.
- */
-local block_state deflate_fast(s, flush)
-    deflate_state *s;
-    int flush;
-{
-    IPos hash_head = NIL; /* head of the hash chain */
-    int bflush;           /* set if current block must be flushed */
-
-    for (;;) {
-        /* Make sure that we always have enough lookahead, except
-         * at the end of the input file. We need MAX_MATCH bytes
-         * for the next match, plus MIN_MATCH bytes to insert the
-         * string following the next match.
-         */
-        if (s->lookahead < MIN_LOOKAHEAD) {
-            fill_window(s);
-            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
-	        return need_more;
-	    }
-            if (s->lookahead == 0) break; /* flush the current block */
-        }
-
-        /* Insert the string window[strstart .. strstart+2] in the
-         * dictionary, and set hash_head to the head of the hash chain:
-         */
-        if (s->lookahead >= MIN_MATCH) {
-            INSERT_STRING(s, s->strstart, hash_head);
-        }
-
-        /* Find the longest match, discarding those <= prev_length.
-         * At this point we have always match_length < MIN_MATCH
-         */
-        if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
-            /* To simplify the code, we prevent matches with the string
-             * of window index 0 (in particular we have to avoid a match
-             * of the string with itself at the start of the input file).
-             */
-            if (s->strategy != Z_HUFFMAN_ONLY) {
-                s->match_length = longest_match (s, hash_head);
-            }
-            /* longest_match() sets match_start */
-        }
-        if (s->match_length >= MIN_MATCH) {
-            check_match(s, s->strstart, s->match_start, s->match_length);
-
-            _tr_tally_dist(s, s->strstart - s->match_start,
-                           s->match_length - MIN_MATCH, bflush);
-
-            s->lookahead -= s->match_length;
-
-            /* Insert new strings in the hash table only if the match length
-             * is not too large. This saves time but degrades compression.
-             */
-#ifndef FASTEST
-            if (s->match_length <= s->max_insert_length &&
-                s->lookahead >= MIN_MATCH) {
-                s->match_length--; /* string at strstart already in hash table */
-                do {
-                    s->strstart++;
-                    INSERT_STRING(s, s->strstart, hash_head);
-                    /* strstart never exceeds WSIZE-MAX_MATCH, so there are
-                     * always MIN_MATCH bytes ahead.
-                     */
-                } while (--s->match_length != 0);
-                s->strstart++; 
-            } else
-#endif
-	    {
-                s->strstart += s->match_length;
-                s->match_length = 0;
-                s->ins_h = s->window[s->strstart];
-                UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
-#if MIN_MATCH != 3
-                Call UPDATE_HASH() MIN_MATCH-3 more times
-#endif
-                /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
-                 * matter since it will be recomputed at next deflate call.
-                 */
-            }
-        } else {
-            /* No match, output a literal byte */
-            Tracevv((stderr,"%c", s->window[s->strstart]));
-            _tr_tally_lit (s, s->window[s->strstart], bflush);
-            s->lookahead--;
-            s->strstart++; 
-        }
-        if (bflush) FLUSH_BLOCK(s, 0);
-    }
-    FLUSH_BLOCK(s, flush == Z_FINISH);
-    return flush == Z_FINISH ? finish_done : block_done;
-}
-
-/* ===========================================================================
- * Same as above, but achieves better compression. We use a lazy
- * evaluation for matches: a match is finally adopted only if there is
- * no better match at the next window position.
- */
-local block_state deflate_slow(s, flush)
-    deflate_state *s;
-    int flush;
-{
-    IPos hash_head = NIL;    /* head of hash chain */
-    int bflush;              /* set if current block must be flushed */
-
-    /* Process the input block. */
-    for (;;) {
-        /* Make sure that we always have enough lookahead, except
-         * at the end of the input file. We need MAX_MATCH bytes
-         * for the next match, plus MIN_MATCH bytes to insert the
-         * string following the next match.
-         */
-        if (s->lookahead < MIN_LOOKAHEAD) {
-            fill_window(s);
-            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
-	        return need_more;
-	    }
-            if (s->lookahead == 0) break; /* flush the current block */
-        }
-
-        /* Insert the string window[strstart .. strstart+2] in the
-         * dictionary, and set hash_head to the head of the hash chain:
-         */
-        if (s->lookahead >= MIN_MATCH) {
-            INSERT_STRING(s, s->strstart, hash_head);
-        }
-
-        /* Find the longest match, discarding those <= prev_length.
-         */
-        s->prev_length = s->match_length, s->prev_match = s->match_start;
-        s->match_length = MIN_MATCH-1;
-
-        if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
-            s->strstart - hash_head <= MAX_DIST(s)) {
-            /* To simplify the code, we prevent matches with the string
-             * of window index 0 (in particular we have to avoid a match
-             * of the string with itself at the start of the input file).
-             */
-            if (s->strategy != Z_HUFFMAN_ONLY) {
-                s->match_length = longest_match (s, hash_head);
-            }
-            /* longest_match() sets match_start */
-
-            if (s->match_length <= 5 && (s->strategy == Z_FILTERED ||
-                 (s->match_length == MIN_MATCH &&
-                  s->strstart - s->match_start > TOO_FAR))) {
-
-                /* If prev_match is also MIN_MATCH, match_start is garbage
-                 * but we will ignore the current match anyway.
-                 */
-                s->match_length = MIN_MATCH-1;
-            }
-        }
-        /* If there was a match at the previous step and the current
-         * match is not better, output the previous match:
-         */
-        if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
-            uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
-            /* Do not insert strings in hash table beyond this. */
-
-            check_match(s, s->strstart-1, s->prev_match, s->prev_length);
-
-            _tr_tally_dist(s, s->strstart -1 - s->prev_match,
-			   s->prev_length - MIN_MATCH, bflush);
-
-            /* Insert in hash table all strings up to the end of the match.
-             * strstart-1 and strstart are already inserted. If there is not
-             * enough lookahead, the last two strings are not inserted in
-             * the hash table.
-             */
-            s->lookahead -= s->prev_length-1;
-            s->prev_length -= 2;
-            do {
-                if (++s->strstart <= max_insert) {
-                    INSERT_STRING(s, s->strstart, hash_head);
-                }
-            } while (--s->prev_length != 0);
-            s->match_available = 0;
-            s->match_length = MIN_MATCH-1;
-            s->strstart++;
-
-            if (bflush) FLUSH_BLOCK(s, 0);
-
-        } else if (s->match_available) {
-            /* If there was no match at the previous position, output a
-             * single literal. If there was a match but the current match
-             * is longer, truncate the previous match to a single literal.
-             */
-            Tracevv((stderr,"%c", s->window[s->strstart-1]));
-	    _tr_tally_lit(s, s->window[s->strstart-1], bflush);
-	    if (bflush) {
-                FLUSH_BLOCK_ONLY(s, 0);
-            }
-            s->strstart++;
-            s->lookahead--;
-            if (s->strm->avail_out == 0) return need_more;
-        } else {
-            /* There is no previous match to compare with, wait for
-             * the next step to decide.
-             */
-            s->match_available = 1;
-            s->strstart++;
-            s->lookahead--;
-        }
-    }
-    Assert (flush != Z_NO_FLUSH, "no flush?");
-    if (s->match_available) {
-        Tracevv((stderr,"%c", s->window[s->strstart-1]));
-        _tr_tally_lit(s, s->window[s->strstart-1], bflush);
-        s->match_available = 0;
-    }
-    FLUSH_BLOCK(s, flush == Z_FINISH);
-    return flush == Z_FINISH ? finish_done : block_done;
-}
diff --git a/Lib/zlib/deflate.h b/Lib/zlib/deflate.h
deleted file mode 100644
index 962676da8..000000000
--- a/Lib/zlib/deflate.h
+++ /dev/null
@@ -1,318 +0,0 @@
-/* deflate.h -- internal compression state
- * Copyright (C) 1995-1998 Jean-loup Gailly
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-/* @(#) $Id$ */
-
-#ifndef _DEFLATE_H
-#define _DEFLATE_H
-
-#include "zutil.h"
-
-/* ===========================================================================
- * Internal compression state.
- */
-
-#define LENGTH_CODES 29
-/* number of length codes, not counting the special END_BLOCK code */
-
-#define LITERALS  256
-/* number of literal bytes 0..255 */
-
-#define L_CODES (LITERALS+1+LENGTH_CODES)
-/* number of Literal or Length codes, including the END_BLOCK code */
-
-#define D_CODES   30
-/* number of distance codes */
-
-#define BL_CODES  19
-/* number of codes used to transfer the bit lengths */
-
-#define HEAP_SIZE (2*L_CODES+1)
-/* maximum heap size */
-
-#define MAX_BITS 15
-/* All codes must not exceed MAX_BITS bits */
-
-#define INIT_STATE    42
-#define BUSY_STATE   113
-#define FINISH_STATE 666
-/* Stream status */
-
-
-/* Data structure describing a single value and its code string. */
-typedef struct ct_data_s {
-    union {
-        ush  freq;       /* frequency count */
-        ush  code;       /* bit string */
-    } fc;
-    union {
-        ush  dad;        /* father node in Huffman tree */
-        ush  len;        /* length of bit string */
-    } dl;
-} FAR ct_data;
-
-#define Freq fc.freq
-#define Code fc.code
-#define Dad  dl.dad
-#define Len  dl.len
-
-typedef struct static_tree_desc_s  static_tree_desc;
-
-typedef struct tree_desc_s {
-    ct_data *dyn_tree;           /* the dynamic tree */
-    int     max_code;            /* largest code with non zero frequency */
-    static_tree_desc *stat_desc; /* the corresponding static tree */
-} FAR tree_desc;
-
-typedef ush Pos;
-typedef Pos FAR Posf;
-typedef unsigned IPos;
-
-/* A Pos is an index in the character window. We use short instead of int to
- * save space in the various tables. IPos is used only for parameter passing.
- */
-
-typedef struct internal_state {
-    z_streamp strm;      /* pointer back to this zlib stream */
-    int   status;        /* as the name implies */
-    Bytef *pending_buf;  /* output still pending */
-    ulg   pending_buf_size; /* size of pending_buf */
-    Bytef *pending_out;  /* next pending byte to output to the stream */
-    int   pending;       /* nb of bytes in the pending buffer */
-    int   noheader;      /* suppress zlib header and adler32 */
-    Byte  data_type;     /* UNKNOWN, BINARY or ASCII */
-    Byte  method;        /* STORED (for zip only) or DEFLATED */
-    int   last_flush;    /* value of flush param for previous deflate call */
-
-                /* used by deflate.c: */
-
-    uInt  w_size;        /* LZ77 window size (32K by default) */
-    uInt  w_bits;        /* log2(w_size)  (8..16) */
-    uInt  w_mask;        /* w_size - 1 */
-
-    Bytef *window;
-    /* Sliding window. Input bytes are read into the second half of the window,
-     * and move to the first half later to keep a dictionary of at least wSize
-     * bytes. With this organization, matches are limited to a distance of
-     * wSize-MAX_MATCH bytes, but this ensures that IO is always
-     * performed with a length multiple of the block size. Also, it limits
-     * the window size to 64K, which is quite useful on MSDOS.
-     * To do: use the user input buffer as sliding window.
-     */
-
-    ulg window_size;
-    /* Actual size of window: 2*wSize, except when the user input buffer
-     * is directly used as sliding window.
-     */
-
-    Posf *prev;
-    /* Link to older string with same hash index. To limit the size of this
-     * array to 64K, this link is maintained only for the last 32K strings.
-     * An index in this array is thus a window index modulo 32K.
-     */
-
-    Posf *head; /* Heads of the hash chains or NIL. */
-
-    uInt  ins_h;          /* hash index of string to be inserted */
-    uInt  hash_size;      /* number of elements in hash table */
-    uInt  hash_bits;      /* log2(hash_size) */
-    uInt  hash_mask;      /* hash_size-1 */
-
-    uInt  hash_shift;
-    /* Number of bits by which ins_h must be shifted at each input
-     * step. It must be such that after MIN_MATCH steps, the oldest
-     * byte no longer takes part in the hash key, that is:
-     *   hash_shift * MIN_MATCH >= hash_bits
-     */
-
-    long block_start;
-    /* Window position at the beginning of the current output block. Gets
-     * negative when the window is moved backwards.
-     */
-
-    uInt match_length;           /* length of best match */
-    IPos prev_match;             /* previous match */
-    int match_available;         /* set if previous match exists */
-    uInt strstart;               /* start of string to insert */
-    uInt match_start;            /* start of matching string */
-    uInt lookahead;              /* number of valid bytes ahead in window */
-
-    uInt prev_length;
-    /* Length of the best match at previous step. Matches not greater than this
-     * are discarded. This is used in the lazy match evaluation.
-     */
-
-    uInt max_chain_length;
-    /* To speed up deflation, hash chains are never searched beyond this
-     * length.  A higher limit improves compression ratio but degrades the
-     * speed.
-     */
-
-    uInt max_lazy_match;
-    /* Attempt to find a better match only when the current match is strictly
-     * smaller than this value. This mechanism is used only for compression
-     * levels >= 4.
-     */
-#   define max_insert_length  max_lazy_match
-    /* Insert new strings in the hash table only if the match length is not
-     * greater than this length. This saves time but degrades compression.
-     * max_insert_length is used only for compression levels <= 3.
-     */
-
-    int level;    /* compression level (1..9) */
-    int strategy; /* favor or force Huffman coding*/
-
-    uInt good_match;
-    /* Use a faster search when the previous match is longer than this */
-
-    int nice_match; /* Stop searching when current match exceeds this */
-
-                /* used by trees.c: */
-    /* Didn't use ct_data typedef below to supress compiler warning */
-    struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
-    struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
-    struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
-
-    struct tree_desc_s l_desc;               /* desc. for literal tree */
-    struct tree_desc_s d_desc;               /* desc. for distance tree */
-    struct tree_desc_s bl_desc;              /* desc. for bit length tree */
-
-    ush bl_count[MAX_BITS+1];
-    /* number of codes at each bit length for an optimal tree */
-
-    int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
-    int heap_len;               /* number of elements in the heap */
-    int heap_max;               /* element of largest frequency */
-    /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
-     * The same heap array is used to build all trees.
-     */
-
-    uch depth[2*L_CODES+1];
-    /* Depth of each subtree used as tie breaker for trees of equal frequency
-     */
-
-    uchf *l_buf;          /* buffer for literals or lengths */
-
-    uInt  lit_bufsize;
-    /* Size of match buffer for literals/lengths.  There are 4 reasons for
-     * limiting lit_bufsize to 64K:
-     *   - frequencies can be kept in 16 bit counters
-     *   - if compression is not successful for the first block, all input
-     *     data is still in the window so we can still emit a stored block even
-     *     when input comes from standard input.  (This can also be done for
-     *     all blocks if lit_bufsize is not greater than 32K.)
-     *   - if compression is not successful for a file smaller than 64K, we can
-     *     even emit a stored file instead of a stored block (saving 5 bytes).
-     *     This is applicable only for zip (not gzip or zlib).
-     *   - creating new Huffman trees less frequently may not provide fast
-     *     adaptation to changes in the input data statistics. (Take for
-     *     example a binary file with poorly compressible code followed by
-     *     a highly compressible string table.) Smaller buffer sizes give
-     *     fast adaptation but have of course the overhead of transmitting
-     *     trees more frequently.
-     *   - I can't count above 4
-     */
-
-    uInt last_lit;      /* running index in l_buf */
-
-    ushf *d_buf;
-    /* Buffer for distances. To simplify the code, d_buf and l_buf have
-     * the same number of elements. To use different lengths, an extra flag
-     * array would be necessary.
-     */
-
-    ulg opt_len;        /* bit length of current block with optimal trees */
-    ulg static_len;     /* bit length of current block with static trees */
-    uInt matches;       /* number of string matches in current block */
-    int last_eob_len;   /* bit length of EOB code for last block */
-
-#ifdef DEBUG
-    ulg compressed_len; /* total bit length of compressed file mod 2^32 */
-    ulg bits_sent;      /* bit length of compressed data sent mod 2^32 */
-#endif
-
-    ush bi_buf;
-    /* Output buffer. bits are inserted starting at the bottom (least
-     * significant bits).
-     */
-    int bi_valid;
-    /* Number of valid bits in bi_buf.  All bits above the last valid bit
-     * are always zero.
-     */
-
-} FAR deflate_state;
-
-/* Output a byte on the stream.
- * IN assertion: there is enough room in pending_buf.
- */
-#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
-
-
-#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
-/* Minimum amount of lookahead, except at the end of the input file.
- * See deflate.c for comments about the MIN_MATCH+1.
- */
-
-#define MAX_DIST(s)  ((s)->w_size-MIN_LOOKAHEAD)
-/* In order to simplify the code, particularly on 16 bit machines, match
- * distances are limited to MAX_DIST instead of WSIZE.
- */
-
-        /* in trees.c */
-void _tr_init         OF((deflate_state *s));
-int  _tr_tally        OF((deflate_state *s, unsigned dist, unsigned lc));
-void _tr_flush_block  OF((deflate_state *s, charf *buf, ulg stored_len,
-			  int eof));
-void _tr_align        OF((deflate_state *s));
-void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
-                          int eof));
-
-#define d_code(dist) \
-   ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
-/* Mapping from a distance to a distance code. dist is the distance - 1 and
- * must not have side effects. _dist_code[256] and _dist_code[257] are never
- * used.
- */
-
-#ifndef DEBUG
-/* Inline versions of _tr_tally for speed: */
-
-#if defined(GEN_TREES_H) || !defined(STDC)
-  extern uch _length_code[];
-  extern uch _dist_code[];
-#else
-  extern const uch _length_code[];
-  extern const uch _dist_code[];
-#endif
-
-# define _tr_tally_lit(s, c, flush) \
-  { uch cc = (c); \
-    s->d_buf[s->last_lit] = 0; \
-    s->l_buf[s->last_lit++] = cc; \
-    s->dyn_ltree[cc].Freq++; \
-    flush = (s->last_lit == s->lit_bufsize-1); \
-   }
-# define _tr_tally_dist(s, distance, length, flush) \
-  { uch len = (length); \
-    ush dist = (distance); \
-    s->d_buf[s->last_lit] = dist; \
-    s->l_buf[s->last_lit++] = len; \
-    dist--; \
-    s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
-    s->dyn_dtree[d_code(dist)].Freq++; \
-    flush = (s->last_lit == s->lit_bufsize-1); \
-  }
-#else
-# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
-# define _tr_tally_dist(s, distance, length, flush) \
-              flush = _tr_tally(s, distance, length) 
-#endif
-
-#endif
diff --git a/Lib/zlib/descrip.mms b/Lib/zlib/descrip.mms
deleted file mode 100644
index 9d364598a..000000000
--- a/Lib/zlib/descrip.mms
+++ /dev/null
@@ -1,48 +0,0 @@
-# descrip.mms: MMS description file for building zlib on VMS
-# written by Martin P.J. Zinser 
-
-cc_defs = 
-c_deb = 
-
-.ifdef __DECC__
-pref = /prefix=all
-.endif
-
-OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj,\
-       deflate.obj, trees.obj, zutil.obj, inflate.obj, infblock.obj,\
-       inftrees.obj, infcodes.obj, infutil.obj, inffast.obj
-
-CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF)
-
-all : example.exe minigzip.exe
-        @ write sys$output " Example applications available"
-libz.olb : libz.olb($(OBJS))
-	@ write sys$output " libz available"
-
-example.exe : example.obj libz.olb
-              link example,libz.olb/lib
-
-minigzip.exe : minigzip.obj libz.olb
-              link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib
-
-clean : 
-	delete *.obj;*,libz.olb;*
-
-
-# Other dependencies.
-adler32.obj : zutil.h zlib.h zconf.h
-compress.obj : zlib.h zconf.h
-crc32.obj : zutil.h zlib.h zconf.h
-deflate.obj : deflate.h zutil.h zlib.h zconf.h
-example.obj : zlib.h zconf.h
-gzio.obj : zutil.h zlib.h zconf.h
-infblock.obj : zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
-infcodes.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h
-inffast.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
-inflate.obj : zutil.h zlib.h zconf.h infblock.h
-inftrees.obj : zutil.h zlib.h zconf.h inftrees.h
-infutil.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h
-minigzip.obj : zlib.h zconf.h
-trees.obj : deflate.h zutil.h zlib.h zconf.h
-uncompr.obj : zlib.h zconf.h
-zutil.obj : zutil.h zlib.h zconf.h
diff --git a/Lib/zlib/example.c b/Lib/zlib/example.c
deleted file mode 100644
index 8307c841e..000000000
--- a/Lib/zlib/example.c
+++ /dev/null
@@ -1,556 +0,0 @@
-/* example.c -- usage example of the zlib compression library
- * Copyright (C) 1995-1998 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* @(#) $Id$ */
-
-#include 
-#include "zlib.h"
-
-#ifdef STDC
-#  include 
-#  include 
-#else
-   extern void exit  OF((int));
-#endif
-
-#if defined(VMS) || defined(RISCOS)
-#  define TESTFILE "foo-gz"
-#else
-#  define TESTFILE "foo.gz"
-#endif
-
-#define CHECK_ERR(err, msg) { \
-    if (err != Z_OK) { \
-        fprintf(stderr, "%s error: %d\n", msg, err); \
-        exit(1); \
-    } \
-}
-
-const char hello[] = "hello, hello!";
-/* "hello world" would be more standard, but the repeated "hello"
- * stresses the compression code better, sorry...
- */
-
-const char dictionary[] = "hello";
-uLong dictId; /* Adler32 value of the dictionary */
-
-void test_compress      OF((Byte *compr, uLong comprLen,
-		            Byte *uncompr, uLong uncomprLen));
-void test_gzio          OF((const char *out, const char *in, 
-		            Byte *uncompr, int uncomprLen));
-void test_deflate       OF((Byte *compr, uLong comprLen));
-void test_inflate       OF((Byte *compr, uLong comprLen,
-		            Byte *uncompr, uLong uncomprLen));
-void test_large_deflate OF((Byte *compr, uLong comprLen,
-		            Byte *uncompr, uLong uncomprLen));
-void test_large_inflate OF((Byte *compr, uLong comprLen,
-		            Byte *uncompr, uLong uncomprLen));
-void test_flush         OF((Byte *compr, uLong *comprLen));
-void test_sync          OF((Byte *compr, uLong comprLen,
-		            Byte *uncompr, uLong uncomprLen));
-void test_dict_deflate  OF((Byte *compr, uLong comprLen));
-void test_dict_inflate  OF((Byte *compr, uLong comprLen,
-		            Byte *uncompr, uLong uncomprLen));
-int  main               OF((int argc, char *argv[]));
-
-/* ===========================================================================
- * Test compress() and uncompress()
- */
-void test_compress(compr, comprLen, uncompr, uncomprLen)
-    Byte *compr, *uncompr;
-    uLong comprLen, uncomprLen;
-{
-    int err;
-    uLong len = strlen(hello)+1;
-
-    err = compress(compr, &comprLen, (const Bytef*)hello, len);
-    CHECK_ERR(err, "compress");
-
-    strcpy((char*)uncompr, "garbage");
-
-    err = uncompress(uncompr, &uncomprLen, compr, comprLen);
-    CHECK_ERR(err, "uncompress");
-
-    if (strcmp((char*)uncompr, hello)) {
-        fprintf(stderr, "bad uncompress\n");
-	exit(1);
-    } else {
-        printf("uncompress(): %s\n", (char *)uncompr);
-    }
-}
-
-/* ===========================================================================
- * Test read/write of .gz files
- */
-void test_gzio(out, in, uncompr, uncomprLen)
-    const char *out; /* compressed output file */
-    const char *in;  /* compressed input file */
-    Byte *uncompr;
-    int  uncomprLen;
-{
-    int err;
-    int len = strlen(hello)+1;
-    gzFile file;
-    z_off_t pos;
-
-    file = gzopen(out, "wb");
-    if (file == NULL) {
-        fprintf(stderr, "gzopen error\n");
-        exit(1);
-    }
-    gzputc(file, 'h');
-    if (gzputs(file, "ello") != 4) {
-        fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
-	exit(1);
-    }
-    if (gzprintf(file, ", %s!", "hello") != 8) {
-        fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
-	exit(1);
-    }
-    gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
-    gzclose(file);
-
-    file = gzopen(in, "rb");
-    if (file == NULL) {
-        fprintf(stderr, "gzopen error\n");
-    }
-    strcpy((char*)uncompr, "garbage");
-
-    uncomprLen = gzread(file, uncompr, (unsigned)uncomprLen);
-    if (uncomprLen != len) {
-        fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
-	exit(1);
-    }
-    if (strcmp((char*)uncompr, hello)) {
-        fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
-	exit(1);
-    } else {
-        printf("gzread(): %s\n", (char *)uncompr);
-    }
-
-    pos = gzseek(file, -8L, SEEK_CUR);
-    if (pos != 6 || gztell(file) != pos) {
-	fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
-		(long)pos, (long)gztell(file));
-	exit(1);
-    }
-
-    if (gzgetc(file) != ' ') {
-	fprintf(stderr, "gzgetc error\n");
-	exit(1);
-    }
-
-    gzgets(file, (char*)uncompr, uncomprLen);
-    uncomprLen = strlen((char*)uncompr);
-    if (uncomprLen != 6) { /* "hello!" */
-        fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
-	exit(1);
-    }
-    if (strcmp((char*)uncompr, hello+7)) {
-        fprintf(stderr, "bad gzgets after gzseek\n");
-	exit(1);
-    } else {
-        printf("gzgets() after gzseek: %s\n", (char *)uncompr);
-    }
-
-    gzclose(file);
-}
-
-/* ===========================================================================
- * Test deflate() with small buffers
- */
-void test_deflate(compr, comprLen)
-    Byte *compr;
-    uLong comprLen;
-{
-    z_stream c_stream; /* compression stream */
-    int err;
-    int len = strlen(hello)+1;
-
-    c_stream.zalloc = (alloc_func)0;
-    c_stream.zfree = (free_func)0;
-    c_stream.opaque = (voidpf)0;
-
-    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
-    CHECK_ERR(err, "deflateInit");
-
-    c_stream.next_in  = (Bytef*)hello;
-    c_stream.next_out = compr;
-
-    while (c_stream.total_in != (uLong)len && c_stream.total_out < comprLen) {
-        c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
-        err = deflate(&c_stream, Z_NO_FLUSH);
-        CHECK_ERR(err, "deflate");
-    }
-    /* Finish the stream, still forcing small buffers: */
-    for (;;) {
-        c_stream.avail_out = 1;
-        err = deflate(&c_stream, Z_FINISH);
-        if (err == Z_STREAM_END) break;
-        CHECK_ERR(err, "deflate");
-    }
-
-    err = deflateEnd(&c_stream);
-    CHECK_ERR(err, "deflateEnd");
-}
-
-/* ===========================================================================
- * Test inflate() with small buffers
- */
-void test_inflate(compr, comprLen, uncompr, uncomprLen)
-    Byte *compr, *uncompr;
-    uLong comprLen, uncomprLen;
-{
-    int err;
-    z_stream d_stream; /* decompression stream */
-
-    strcpy((char*)uncompr, "garbage");
-
-    d_stream.zalloc = (alloc_func)0;
-    d_stream.zfree = (free_func)0;
-    d_stream.opaque = (voidpf)0;
-
-    d_stream.next_in  = compr;
-    d_stream.avail_in = 0;
-    d_stream.next_out = uncompr;
-
-    err = inflateInit(&d_stream);
-    CHECK_ERR(err, "inflateInit");
-
-    while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
-        d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
-        err = inflate(&d_stream, Z_NO_FLUSH);
-        if (err == Z_STREAM_END) break;
-        CHECK_ERR(err, "inflate");
-    }
-
-    err = inflateEnd(&d_stream);
-    CHECK_ERR(err, "inflateEnd");
-
-    if (strcmp((char*)uncompr, hello)) {
-        fprintf(stderr, "bad inflate\n");
-	exit(1);
-    } else {
-        printf("inflate(): %s\n", (char *)uncompr);
-    }
-}
-
-/* ===========================================================================
- * Test deflate() with large buffers and dynamic change of compression level
- */
-void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
-    Byte *compr, *uncompr;
-    uLong comprLen, uncomprLen;
-{
-    z_stream c_stream; /* compression stream */
-    int err;
-
-    c_stream.zalloc = (alloc_func)0;
-    c_stream.zfree = (free_func)0;
-    c_stream.opaque = (voidpf)0;
-
-    err = deflateInit(&c_stream, Z_BEST_SPEED);
-    CHECK_ERR(err, "deflateInit");
-
-    c_stream.next_out = compr;
-    c_stream.avail_out = (uInt)comprLen;
-
-    /* At this point, uncompr is still mostly zeroes, so it should compress
-     * very well:
-     */
-    c_stream.next_in = uncompr;
-    c_stream.avail_in = (uInt)uncomprLen;
-    err = deflate(&c_stream, Z_NO_FLUSH);
-    CHECK_ERR(err, "deflate");
-    if (c_stream.avail_in != 0) {
-        fprintf(stderr, "deflate not greedy\n");
-	exit(1);
-    }
-
-    /* Feed in already compressed data and switch to no compression: */
-    deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
-    c_stream.next_in = compr;
-    c_stream.avail_in = (uInt)comprLen/2;
-    err = deflate(&c_stream, Z_NO_FLUSH);
-    CHECK_ERR(err, "deflate");
-
-    /* Switch back to compressing mode: */
-    deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
-    c_stream.next_in = uncompr;
-    c_stream.avail_in = (uInt)uncomprLen;
-    err = deflate(&c_stream, Z_NO_FLUSH);
-    CHECK_ERR(err, "deflate");
-
-    err = deflate(&c_stream, Z_FINISH);
-    if (err != Z_STREAM_END) {
-        fprintf(stderr, "deflate should report Z_STREAM_END\n");
-	exit(1);
-    }
-    err = deflateEnd(&c_stream);
-    CHECK_ERR(err, "deflateEnd");
-}
-
-/* ===========================================================================
- * Test inflate() with large buffers
- */
-void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
-    Byte *compr, *uncompr;
-    uLong comprLen, uncomprLen;
-{
-    int err;
-    z_stream d_stream; /* decompression stream */
-
-    strcpy((char*)uncompr, "garbage");
-
-    d_stream.zalloc = (alloc_func)0;
-    d_stream.zfree = (free_func)0;
-    d_stream.opaque = (voidpf)0;
-
-    d_stream.next_in  = compr;
-    d_stream.avail_in = (uInt)comprLen;
-
-    err = inflateInit(&d_stream);
-    CHECK_ERR(err, "inflateInit");
-
-    for (;;) {
-        d_stream.next_out = uncompr;            /* discard the output */
-	d_stream.avail_out = (uInt)uncomprLen;
-        err = inflate(&d_stream, Z_NO_FLUSH);
-        if (err == Z_STREAM_END) break;
-        CHECK_ERR(err, "large inflate");
-    }
-
-    err = inflateEnd(&d_stream);
-    CHECK_ERR(err, "inflateEnd");
-
-    if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
-        fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
-	exit(1);
-    } else {
-        printf("large_inflate(): OK\n");
-    }
-}
-
-/* ===========================================================================
- * Test deflate() with full flush
- */
-void test_flush(compr, comprLen)
-    Byte *compr;
-    uLong *comprLen;
-{
-    z_stream c_stream; /* compression stream */
-    int err;
-    int len = strlen(hello)+1;
-
-    c_stream.zalloc = (alloc_func)0;
-    c_stream.zfree = (free_func)0;
-    c_stream.opaque = (voidpf)0;
-
-    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
-    CHECK_ERR(err, "deflateInit");
-
-    c_stream.next_in  = (Bytef*)hello;
-    c_stream.next_out = compr;
-    c_stream.avail_in = 3;
-    c_stream.avail_out = (uInt)*comprLen;
-    err = deflate(&c_stream, Z_FULL_FLUSH);
-    CHECK_ERR(err, "deflate");
-
-    compr[3]++; /* force an error in first compressed block */
-    c_stream.avail_in = len - 3;
-
-    err = deflate(&c_stream, Z_FINISH);
-    if (err != Z_STREAM_END) {
-        CHECK_ERR(err, "deflate");
-    }
-    err = deflateEnd(&c_stream);
-    CHECK_ERR(err, "deflateEnd");
-
-    *comprLen = c_stream.total_out;
-}
-
-/* ===========================================================================
- * Test inflateSync()
- */
-void test_sync(compr, comprLen, uncompr, uncomprLen)
-    Byte *compr, *uncompr;
-    uLong comprLen, uncomprLen;
-{
-    int err;
-    z_stream d_stream; /* decompression stream */
-
-    strcpy((char*)uncompr, "garbage");
-
-    d_stream.zalloc = (alloc_func)0;
-    d_stream.zfree = (free_func)0;
-    d_stream.opaque = (voidpf)0;
-
-    d_stream.next_in  = compr;
-    d_stream.avail_in = 2; /* just read the zlib header */
-
-    err = inflateInit(&d_stream);
-    CHECK_ERR(err, "inflateInit");
-
-    d_stream.next_out = uncompr;
-    d_stream.avail_out = (uInt)uncomprLen;
-
-    inflate(&d_stream, Z_NO_FLUSH);
-    CHECK_ERR(err, "inflate");
-
-    d_stream.avail_in = (uInt)comprLen-2;   /* read all compressed data */
-    err = inflateSync(&d_stream);           /* but skip the damaged part */
-    CHECK_ERR(err, "inflateSync");
-
-    err = inflate(&d_stream, Z_FINISH);
-    if (err != Z_DATA_ERROR) {
-        fprintf(stderr, "inflate should report DATA_ERROR\n");
-        /* Because of incorrect adler32 */
-	exit(1);
-    }
-    err = inflateEnd(&d_stream);
-    CHECK_ERR(err, "inflateEnd");
-
-    printf("after inflateSync(): hel%s\n", (char *)uncompr);
-}
-
-/* ===========================================================================
- * Test deflate() with preset dictionary
- */
-void test_dict_deflate(compr, comprLen)
-    Byte *compr;
-    uLong comprLen;
-{
-    z_stream c_stream; /* compression stream */
-    int err;
-
-    c_stream.zalloc = (alloc_func)0;
-    c_stream.zfree = (free_func)0;
-    c_stream.opaque = (voidpf)0;
-
-    err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
-    CHECK_ERR(err, "deflateInit");
-
-    err = deflateSetDictionary(&c_stream,
-			       (const Bytef*)dictionary, sizeof(dictionary));
-    CHECK_ERR(err, "deflateSetDictionary");
-
-    dictId = c_stream.adler;
-    c_stream.next_out = compr;
-    c_stream.avail_out = (uInt)comprLen;
-
-    c_stream.next_in = (Bytef*)hello;
-    c_stream.avail_in = (uInt)strlen(hello)+1;
-
-    err = deflate(&c_stream, Z_FINISH);
-    if (err != Z_STREAM_END) {
-        fprintf(stderr, "deflate should report Z_STREAM_END\n");
-	exit(1);
-    }
-    err = deflateEnd(&c_stream);
-    CHECK_ERR(err, "deflateEnd");
-}
-
-/* ===========================================================================
- * Test inflate() with a preset dictionary
- */
-void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
-    Byte *compr, *uncompr;
-    uLong comprLen, uncomprLen;
-{
-    int err;
-    z_stream d_stream; /* decompression stream */
-
-    strcpy((char*)uncompr, "garbage");
-
-    d_stream.zalloc = (alloc_func)0;
-    d_stream.zfree = (free_func)0;
-    d_stream.opaque = (voidpf)0;
-
-    d_stream.next_in  = compr;
-    d_stream.avail_in = (uInt)comprLen;
-
-    err = inflateInit(&d_stream);
-    CHECK_ERR(err, "inflateInit");
-
-    d_stream.next_out = uncompr;
-    d_stream.avail_out = (uInt)uncomprLen;
-
-    for (;;) {
-        err = inflate(&d_stream, Z_NO_FLUSH);
-        if (err == Z_STREAM_END) break;
-	if (err == Z_NEED_DICT) {
-	    if (d_stream.adler != dictId) {
-		fprintf(stderr, "unexpected dictionary");
-		exit(1);
-	    }
-	    err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
-				       sizeof(dictionary));
-	}
-        CHECK_ERR(err, "inflate with dict");
-    }
-
-    err = inflateEnd(&d_stream);
-    CHECK_ERR(err, "inflateEnd");
-
-    if (strcmp((char*)uncompr, hello)) {
-        fprintf(stderr, "bad inflate with dict\n");
-	exit(1);
-    } else {
-        printf("inflate with dictionary: %s\n", (char *)uncompr);
-    }
-}
-
-/* ===========================================================================
- * Usage:  example [output.gz  [input.gz]]
- */
-
-int main(argc, argv)
-    int argc;
-    char *argv[];
-{
-    Byte *compr, *uncompr;
-    uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
-    uLong uncomprLen = comprLen;
-    static const char* myVersion = ZLIB_VERSION;
-
-    if (zlibVersion()[0] != myVersion[0]) {
-        fprintf(stderr, "incompatible zlib version\n");
-        exit(1);
-
-    } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
-        fprintf(stderr, "warning: different zlib version\n");
-    }
-
-    compr    = (Byte*)calloc((uInt)comprLen, 1);
-    uncompr  = (Byte*)calloc((uInt)uncomprLen, 1);
-    /* compr and uncompr are cleared to avoid reading uninitialized
-     * data and to ensure that uncompr compresses well.
-     */
-    if (compr == Z_NULL || uncompr == Z_NULL) {
-        printf("out of memory\n");
-	exit(1);
-    }
-    test_compress(compr, comprLen, uncompr, uncomprLen);
-
-    test_gzio((argc > 1 ? argv[1] : TESTFILE),
-              (argc > 2 ? argv[2] : TESTFILE),
-	      uncompr, (int)uncomprLen);
-
-    test_deflate(compr, comprLen);
-    test_inflate(compr, comprLen, uncompr, uncomprLen);
-
-    test_large_deflate(compr, comprLen, uncompr, uncomprLen);
-    test_large_inflate(compr, comprLen, uncompr, uncomprLen);
-
-    test_flush(compr, &comprLen);
-    test_sync(compr, comprLen, uncompr, uncomprLen);
-    comprLen = uncomprLen;
-
-    test_dict_deflate(compr, comprLen);
-    test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
-
-    exit(0);
-    return 0; /* to avoid warning */
-}
diff --git a/Lib/zlib/gzio.c b/Lib/zlib/gzio.c
deleted file mode 100644
index f7c336a55..000000000
--- a/Lib/zlib/gzio.c
+++ /dev/null
@@ -1,875 +0,0 @@
-/* gzio.c -- IO on .gz files
- * Copyright (C) 1995-1998 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- *
- * Compile this file with -DNO_DEFLATE to avoid the compression code.
- */
-
-/* @(#) $Id$ */
-
-#include 
-
-#include "zutil.h"
-
-struct internal_state {int dummy;}; /* for buggy compilers */
-
-#ifndef Z_BUFSIZE
-#  ifdef MAXSEG_64K
-#    define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */
-#  else
-#    define Z_BUFSIZE 16384
-#  endif
-#endif
-#ifndef Z_PRINTF_BUFSIZE
-#  define Z_PRINTF_BUFSIZE 4096
-#endif
-
-#define ALLOC(size) malloc(size)
-#define TRYFREE(p) {if (p) free(p);}
-
-static int gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */
-
-/* gzip flag byte */
-#define ASCII_FLAG   0x01 /* bit 0 set: file probably ascii text */
-#define HEAD_CRC     0x02 /* bit 1 set: header CRC present */
-#define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
-#define ORIG_NAME    0x08 /* bit 3 set: original file name present */
-#define COMMENT      0x10 /* bit 4 set: file comment present */
-#define RESERVED     0xE0 /* bits 5..7: reserved */
-
-typedef struct gz_stream {
-    z_stream stream;
-    int      z_err;   /* error code for last stream operation */
-    int      z_eof;   /* set if end of input file */
-    FILE     *file;   /* .gz file */
-    Byte     *inbuf;  /* input buffer */
-    Byte     *outbuf; /* output buffer */
-    uLong    crc;     /* crc32 of uncompressed data */
-    char     *msg;    /* error message */
-    char     *path;   /* path name for debugging only */
-    int      transparent; /* 1 if input file is not a .gz file */
-    char     mode;    /* 'w' or 'r' */
-    long     startpos; /* start of compressed data in file (header skipped) */
-} gz_stream;
-
-
-local gzFile gz_open      OF((const char *path, const char *mode, int  fd));
-local int do_flush        OF((gzFile file, int flush));
-local int    get_byte     OF((gz_stream *s));
-local void   check_header OF((gz_stream *s));
-local int    destroy      OF((gz_stream *s));
-local void   putLong      OF((FILE *file, uLong x));
-local uLong  getLong      OF((gz_stream *s));
-
-/* ===========================================================================
-     Opens a gzip (.gz) file for reading or writing. The mode parameter
-   is as in fopen ("rb" or "wb"). The file is given either by file descriptor
-   or path name (if fd == -1).
-     gz_open return NULL if the file could not be opened or if there was
-   insufficient memory to allocate the (de)compression state; errno
-   can be checked to distinguish the two cases (if errno is zero, the
-   zlib error is Z_MEM_ERROR).
-*/
-local gzFile gz_open (path, mode, fd)
-    const char *path;
-    const char *mode;
-    int  fd;
-{
-    int err;
-    int level = Z_DEFAULT_COMPRESSION; /* compression level */
-    int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */
-    char *p = (char*)mode;
-    gz_stream *s;
-    char fmode[80]; /* copy of mode, without the compression level */
-    char *m = fmode;
-
-    if (!path || !mode) return Z_NULL;
-
-    s = (gz_stream *)ALLOC(sizeof(gz_stream));
-    if (!s) return Z_NULL;
-
-    s->stream.zalloc = (alloc_func)0;
-    s->stream.zfree = (free_func)0;
-    s->stream.opaque = (voidpf)0;
-    s->stream.next_in = s->inbuf = Z_NULL;
-    s->stream.next_out = s->outbuf = Z_NULL;
-    s->stream.avail_in = s->stream.avail_out = 0;
-    s->file = NULL;
-    s->z_err = Z_OK;
-    s->z_eof = 0;
-    s->crc = crc32(0L, Z_NULL, 0);
-    s->msg = NULL;
-    s->transparent = 0;
-
-    s->path = (char*)ALLOC(strlen(path)+1);
-    if (s->path == NULL) {
-        return destroy(s), (gzFile)Z_NULL;
-    }
-    strcpy(s->path, path); /* do this early for debugging */
-
-    s->mode = '\0';
-    do {
-        if (*p == 'r') s->mode = 'r';
-        if (*p == 'w' || *p == 'a') s->mode = 'w';
-        if (*p >= '0' && *p <= '9') {
-	    level = *p - '0';
-	} else if (*p == 'f') {
-	  strategy = Z_FILTERED;
-	} else if (*p == 'h') {
-	  strategy = Z_HUFFMAN_ONLY;
-	} else {
-	    *m++ = *p; /* copy the mode */
-	}
-    } while (*p++ && m != fmode + sizeof(fmode));
-    if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL;
-    
-    if (s->mode == 'w') {
-#ifdef NO_DEFLATE
-        err = Z_STREAM_ERROR;
-#else
-        err = deflateInit2(&(s->stream), level,
-                           Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy);
-        /* windowBits is passed < 0 to suppress zlib header */
-
-        s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
-#endif
-        if (err != Z_OK || s->outbuf == Z_NULL) {
-            return destroy(s), (gzFile)Z_NULL;
-        }
-    } else {
-        s->stream.next_in  = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE);
-
-        err = inflateInit2(&(s->stream), -MAX_WBITS);
-        /* windowBits is passed < 0 to tell that there is no zlib header.
-         * Note that in this case inflate *requires* an extra "dummy" byte
-         * after the compressed stream in order to complete decompression and
-         * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are
-         * present after the compressed stream.
-         */
-        if (err != Z_OK || s->inbuf == Z_NULL) {
-            return destroy(s), (gzFile)Z_NULL;
-        }
-    }
-    s->stream.avail_out = Z_BUFSIZE;
-
-    errno = 0;
-    s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode);
-
-    if (s->file == NULL) {
-        return destroy(s), (gzFile)Z_NULL;
-    }
-    if (s->mode == 'w') {
-        /* Write a very simple .gz header:
-         */
-        fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1],
-             Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE);
-	s->startpos = 10L;
-	/* We use 10L instead of ftell(s->file) to because ftell causes an
-         * fflush on some systems. This version of the library doesn't use
-         * startpos anyway in write mode, so this initialization is not
-         * necessary.
-         */
-    } else {
-	check_header(s); /* skip the .gz header */
-	s->startpos = (ftell(s->file) - s->stream.avail_in);
-    }
-    
-    return (gzFile)s;
-}
-
-/* ===========================================================================
-     Opens a gzip (.gz) file for reading or writing.
-*/
-gzFile ZEXPORT gzopen (path, mode)
-    const char *path;
-    const char *mode;
-{
-    return gz_open (path, mode, -1);
-}
-
-/* ===========================================================================
-     Associate a gzFile with the file descriptor fd. fd is not dup'ed here
-   to mimic the behavio(u)r of fdopen.
-*/
-gzFile ZEXPORT gzdopen (fd, mode)
-    int fd;
-    const char *mode;
-{
-    char name[20];
-
-    if (fd < 0) return (gzFile)Z_NULL;
-    sprintf(name, "", fd); /* for debugging */
-
-    return gz_open (name, mode, fd);
-}
-
-/* ===========================================================================
- * Update the compression level and strategy
- */
-int ZEXPORT gzsetparams (file, level, strategy)
-    gzFile file;
-    int level;
-    int strategy;
-{
-    gz_stream *s = (gz_stream*)file;
-
-    if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
-
-    /* Make room to allow flushing */
-    if (s->stream.avail_out == 0) {
-
-	s->stream.next_out = s->outbuf;
-	if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {
-	    s->z_err = Z_ERRNO;
-	}
-	s->stream.avail_out = Z_BUFSIZE;
-    }
-
-    return deflateParams (&(s->stream), level, strategy);
-}
-
-/* ===========================================================================
-     Read a byte from a gz_stream; update next_in and avail_in. Return EOF
-   for end of file.
-   IN assertion: the stream s has been sucessfully opened for reading.
-*/
-local int get_byte(s)
-    gz_stream *s;
-{
-    if (s->z_eof) return EOF;
-    if (s->stream.avail_in == 0) {
-	errno = 0;
-	s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file);
-	if (s->stream.avail_in == 0) {
-	    s->z_eof = 1;
-	    if (ferror(s->file)) s->z_err = Z_ERRNO;
-	    return EOF;
-	}
-	s->stream.next_in = s->inbuf;
-    }
-    s->stream.avail_in--;
-    return *(s->stream.next_in)++;
-}
-
-/* ===========================================================================
-      Check the gzip header of a gz_stream opened for reading. Set the stream
-    mode to transparent if the gzip magic header is not present; set s->err
-    to Z_DATA_ERROR if the magic header is present but the rest of the header
-    is incorrect.
-    IN assertion: the stream s has already been created sucessfully;
-       s->stream.avail_in is zero for the first time, but may be non-zero
-       for concatenated .gz files.
-*/
-local void check_header(s)
-    gz_stream *s;
-{
-    int method; /* method byte */
-    int flags;  /* flags byte */
-    uInt len;
-    int c;
-
-    /* Check the gzip magic header */
-    for (len = 0; len < 2; len++) {
-	c = get_byte(s);
-	if (c != gz_magic[len]) {
-	    if (len != 0) s->stream.avail_in++, s->stream.next_in--;
-	    if (c != EOF) {
-		s->stream.avail_in++, s->stream.next_in--;
-		s->transparent = 1;
-	    }
-	    s->z_err = s->stream.avail_in != 0 ? Z_OK : Z_STREAM_END;
-	    return;
-	}
-    }
-    method = get_byte(s);
-    flags = get_byte(s);
-    if (method != Z_DEFLATED || (flags & RESERVED) != 0) {
-	s->z_err = Z_DATA_ERROR;
-	return;
-    }
-
-    /* Discard time, xflags and OS code: */
-    for (len = 0; len < 6; len++) (void)get_byte(s);
-
-    if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */
-	len  =  (uInt)get_byte(s);
-	len += ((uInt)get_byte(s))<<8;
-	/* len is garbage if EOF but the loop below will quit anyway */
-	while (len-- != 0 && get_byte(s) != EOF) ;
-    }
-    if ((flags & ORIG_NAME) != 0) { /* skip the original file name */
-	while ((c = get_byte(s)) != 0 && c != EOF) ;
-    }
-    if ((flags & COMMENT) != 0) {   /* skip the .gz file comment */
-	while ((c = get_byte(s)) != 0 && c != EOF) ;
-    }
-    if ((flags & HEAD_CRC) != 0) {  /* skip the header crc */
-	for (len = 0; len < 2; len++) (void)get_byte(s);
-    }
-    s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK;
-}
-
- /* ===========================================================================
- * Cleanup then free the given gz_stream. Return a zlib error code.
-   Try freeing in the reverse order of allocations.
- */
-local int destroy (s)
-    gz_stream *s;
-{
-    int err = Z_OK;
-
-    if (!s) return Z_STREAM_ERROR;
-
-    TRYFREE(s->msg);
-
-    if (s->stream.state != NULL) {
-	if (s->mode == 'w') {
-#ifdef NO_DEFLATE
-	    err = Z_STREAM_ERROR;
-#else
-	    err = deflateEnd(&(s->stream));
-#endif
-	} else if (s->mode == 'r') {
-	    err = inflateEnd(&(s->stream));
-	}
-    }
-    if (s->file != NULL && fclose(s->file)) {
-#ifdef ESPIPE
-	if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */
-#endif
-	    err = Z_ERRNO;
-    }
-    if (s->z_err < 0) err = s->z_err;
-
-    TRYFREE(s->inbuf);
-    TRYFREE(s->outbuf);
-    TRYFREE(s->path);
-    TRYFREE(s);
-    return err;
-}
-
-/* ===========================================================================
-     Reads the given number of uncompressed bytes from the compressed file.
-   gzread returns the number of bytes actually read (0 for end of file).
-*/
-int ZEXPORT gzread (file, buf, len)
-    gzFile file;
-    voidp buf;
-    unsigned len;
-{
-    gz_stream *s = (gz_stream*)file;
-    Bytef *start = (Bytef*)buf; /* starting point for crc computation */
-    Byte  *next_out; /* == stream.next_out but not forced far (for MSDOS) */
-
-    if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR;
-
-    if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1;
-    if (s->z_err == Z_STREAM_END) return 0;  /* EOF */
-
-    next_out = (Byte*)buf;
-    s->stream.next_out = (Bytef*)buf;
-    s->stream.avail_out = len;
-
-    while (s->stream.avail_out != 0) {
-
-	if (s->transparent) {
-	    /* Copy first the lookahead bytes: */
-	    uInt n = s->stream.avail_in;
-	    if (n > s->stream.avail_out) n = s->stream.avail_out;
-	    if (n > 0) {
-		zmemcpy(s->stream.next_out, s->stream.next_in, n);
-		next_out += n;
-		s->stream.next_out = next_out;
-		s->stream.next_in   += n;
-		s->stream.avail_out -= n;
-		s->stream.avail_in  -= n;
-	    }
-	    if (s->stream.avail_out > 0) {
-		s->stream.avail_out -= fread(next_out, 1, s->stream.avail_out,
-					     s->file);
-	    }
-	    len -= s->stream.avail_out;
-	    s->stream.total_in  += (uLong)len;
-	    s->stream.total_out += (uLong)len;
-            if (len == 0) s->z_eof = 1;
-	    return (int)len;
-	}
-        if (s->stream.avail_in == 0 && !s->z_eof) {
-
-            errno = 0;
-            s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file);
-            if (s->stream.avail_in == 0) {
-                s->z_eof = 1;
-		if (ferror(s->file)) {
-		    s->z_err = Z_ERRNO;
-		    break;
-		}
-            }
-            s->stream.next_in = s->inbuf;
-        }
-        s->z_err = inflate(&(s->stream), Z_NO_FLUSH);
-
-	if (s->z_err == Z_STREAM_END) {
-	    /* Check CRC and original size */
-	    s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
-	    start = s->stream.next_out;
-
-	    if (getLong(s) != s->crc) {
-		s->z_err = Z_DATA_ERROR;
-	    } else {
-	        (void)getLong(s);
-                /* The uncompressed length returned by above getlong() may
-                 * be different from s->stream.total_out) in case of
-		 * concatenated .gz files. Check for such files:
-		 */
-		check_header(s);
-		if (s->z_err == Z_OK) {
-		    uLong total_in = s->stream.total_in;
-		    uLong total_out = s->stream.total_out;
-
-		    inflateReset(&(s->stream));
-		    s->stream.total_in = total_in;
-		    s->stream.total_out = total_out;
-		    s->crc = crc32(0L, Z_NULL, 0);
-		}
-	    }
-	}
-	if (s->z_err != Z_OK || s->z_eof) break;
-    }
-    s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
-
-    return (int)(len - s->stream.avail_out);
-}
-
-
-/* ===========================================================================
-      Reads one byte from the compressed file. gzgetc returns this byte
-   or -1 in case of end of file or error.
-*/
-int ZEXPORT gzgetc(file)
-    gzFile file;
-{
-    unsigned char c;
-
-    return gzread(file, &c, 1) == 1 ? c : -1;
-}
-
-
-/* ===========================================================================
-      Reads bytes from the compressed file until len-1 characters are
-   read, or a newline character is read and transferred to buf, or an
-   end-of-file condition is encountered.  The string is then terminated
-   with a null character.
-      gzgets returns buf, or Z_NULL in case of error.
-
-      The current implementation is not optimized at all.
-*/
-char * ZEXPORT gzgets(file, buf, len)
-    gzFile file;
-    char *buf;
-    int len;
-{
-    char *b = buf;
-    if (buf == Z_NULL || len <= 0) return Z_NULL;
-
-    while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ;
-    *buf = '\0';
-    return b == buf && len > 0 ? Z_NULL : b;
-}
-
-
-#ifndef NO_DEFLATE
-/* ===========================================================================
-     Writes the given number of uncompressed bytes into the compressed file.
-   gzwrite returns the number of bytes actually written (0 in case of error).
-*/
-int ZEXPORT gzwrite (file, buf, len)
-    gzFile file;
-    const voidp buf;
-    unsigned len;
-{
-    gz_stream *s = (gz_stream*)file;
-
-    if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
-
-    s->stream.next_in = (Bytef*)buf;
-    s->stream.avail_in = len;
-
-    while (s->stream.avail_in != 0) {
-
-        if (s->stream.avail_out == 0) {
-
-            s->stream.next_out = s->outbuf;
-            if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {
-                s->z_err = Z_ERRNO;
-                break;
-            }
-            s->stream.avail_out = Z_BUFSIZE;
-        }
-        s->z_err = deflate(&(s->stream), Z_NO_FLUSH);
-        if (s->z_err != Z_OK) break;
-    }
-    s->crc = crc32(s->crc, (const Bytef *)buf, len);
-
-    return (int)(len - s->stream.avail_in);
-}
-
-/* ===========================================================================
-     Converts, formats, and writes the args to the compressed file under
-   control of the format string, as in fprintf. gzprintf returns the number of
-   uncompressed bytes actually written (0 in case of error).
-*/
-#ifdef STDC
-#include 
-
-int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...)
-{
-    char buf[Z_PRINTF_BUFSIZE];
-    va_list va;
-    int len;
-
-    va_start(va, format);
-#ifdef HAS_vsnprintf
-    (void)vsnprintf(buf, sizeof(buf), format, va);
-#else
-    (void)vsprintf(buf, format, va);
-#endif
-    va_end(va);
-    len = strlen(buf); /* some *sprintf don't return the nb of bytes written */
-    if (len <= 0) return 0;
-
-    return gzwrite(file, buf, (unsigned)len);
-}
-#else /* not ANSI C */
-
-int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
-	               a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
-    gzFile file;
-    const char *format;
-    int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
-	a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;
-{
-    char buf[Z_PRINTF_BUFSIZE];
-    int len;
-
-#ifdef HAS_snprintf
-    snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8,
-	     a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
-#else
-    sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8,
-	    a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
-#endif
-    len = strlen(buf); /* old sprintf doesn't return the nb of bytes written */
-    if (len <= 0) return 0;
-
-    return gzwrite(file, buf, len);
-}
-#endif
-
-/* ===========================================================================
-      Writes c, converted to an unsigned char, into the compressed file.
-   gzputc returns the value that was written, or -1 in case of error.
-*/
-int ZEXPORT gzputc(file, c)
-    gzFile file;
-    int c;
-{
-    unsigned char cc = (unsigned char) c; /* required for big endian systems */
-
-    return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1;
-}
-
-
-/* ===========================================================================
-      Writes the given null-terminated string to the compressed file, excluding
-   the terminating null character.
-      gzputs returns the number of characters written, or -1 in case of error.
-*/
-int ZEXPORT gzputs(file, s)
-    gzFile file;
-    const char *s;
-{
-    return gzwrite(file, (char*)s, (unsigned)strlen(s));
-}
-
-
-/* ===========================================================================
-     Flushes all pending output into the compressed file. The parameter
-   flush is as in the deflate() function.
-*/
-local int do_flush (file, flush)
-    gzFile file;
-    int flush;
-{
-    uInt len;
-    int done = 0;
-    gz_stream *s = (gz_stream*)file;
-
-    if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
-
-    s->stream.avail_in = 0; /* should be zero already anyway */
-
-    for (;;) {
-        len = Z_BUFSIZE - s->stream.avail_out;
-
-        if (len != 0) {
-            if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) {
-                s->z_err = Z_ERRNO;
-                return Z_ERRNO;
-            }
-            s->stream.next_out = s->outbuf;
-            s->stream.avail_out = Z_BUFSIZE;
-        }
-        if (done) break;
-        s->z_err = deflate(&(s->stream), flush);
-
-	/* Ignore the second of two consecutive flushes: */
-	if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK;
-
-        /* deflate has finished flushing only when it hasn't used up
-         * all the available space in the output buffer: 
-         */
-        done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END);
- 
-        if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break;
-    }
-    return  s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
-}
-
-int ZEXPORT gzflush (file, flush)
-     gzFile file;
-     int flush;
-{
-    gz_stream *s = (gz_stream*)file;
-    int err = do_flush (file, flush);
-
-    if (err) return err;
-    fflush(s->file);
-    return  s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
-}
-#endif /* NO_DEFLATE */
-
-/* ===========================================================================
-      Sets the starting position for the next gzread or gzwrite on the given
-   compressed file. The offset represents a number of bytes in the
-      gzseek returns the resulting offset location as measured in bytes from
-   the beginning of the uncompressed stream, or -1 in case of error.
-      SEEK_END is not implemented, returns error.
-      In this version of the library, gzseek can be extremely slow.
-*/
-z_off_t ZEXPORT gzseek (file, offset, whence)
-    gzFile file;
-    z_off_t offset;
-    int whence;
-{
-    gz_stream *s = (gz_stream*)file;
-
-    if (s == NULL || whence == SEEK_END ||
-	s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) {
-	return -1L;
-    }
-    
-    if (s->mode == 'w') {
-#ifdef NO_DEFLATE
-	return -1L;
-#else
-	if (whence == SEEK_SET) {
-	    offset -= s->stream.total_in;
-	}
-	if (offset < 0) return -1L;
-
-	/* At this point, offset is the number of zero bytes to write. */
-	if (s->inbuf == Z_NULL) {
-	    s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */
-	    zmemzero(s->inbuf, Z_BUFSIZE);
-	}
-	while (offset > 0)  {
-	    uInt size = Z_BUFSIZE;
-	    if (offset < Z_BUFSIZE) size = (uInt)offset;
-
-	    size = gzwrite(file, s->inbuf, size);
-	    if (size == 0) return -1L;
-
-	    offset -= size;
-	}
-	return (z_off_t)s->stream.total_in;
-#endif
-    }
-    /* Rest of function is for reading only */
-
-    /* compute absolute position */
-    if (whence == SEEK_CUR) {
-	offset += s->stream.total_out;
-    }
-    if (offset < 0) return -1L;
-
-    if (s->transparent) {
-	/* map to fseek */
-	s->stream.avail_in = 0;
-	s->stream.next_in = s->inbuf;
-        if (fseek(s->file, offset, SEEK_SET) < 0) return -1L;
-
-	s->stream.total_in = s->stream.total_out = (uLong)offset;
-	return offset;
-    }
-
-    /* For a negative seek, rewind and use positive seek */
-    if ((uLong)offset >= s->stream.total_out) {
-	offset -= s->stream.total_out;
-    } else if (gzrewind(file) < 0) {
-	return -1L;
-    }
-    /* offset is now the number of bytes to skip. */
-
-    if (offset != 0 && s->outbuf == Z_NULL) {
-	s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
-    }
-    while (offset > 0)  {
-	int size = Z_BUFSIZE;
-	if (offset < Z_BUFSIZE) size = (int)offset;
-
-	size = gzread(file, s->outbuf, (uInt)size);
-	if (size <= 0) return -1L;
-	offset -= size;
-    }
-    return (z_off_t)s->stream.total_out;
-}
-
-/* ===========================================================================
-     Rewinds input file. 
-*/
-int ZEXPORT gzrewind (file)
-    gzFile file;
-{
-    gz_stream *s = (gz_stream*)file;
-    
-    if (s == NULL || s->mode != 'r') return -1;
-
-    s->z_err = Z_OK;
-    s->z_eof = 0;
-    s->stream.avail_in = 0;
-    s->stream.next_in = s->inbuf;
-    s->crc = crc32(0L, Z_NULL, 0);
-	
-    if (s->startpos == 0) { /* not a compressed file */
-	rewind(s->file);
-	return 0;
-    }
-
-    (void) inflateReset(&s->stream);
-    return fseek(s->file, s->startpos, SEEK_SET);
-}
-
-/* ===========================================================================
-     Returns the starting position for the next gzread or gzwrite on the
-   given compressed file. This position represents a number of bytes in the
-   uncompressed data stream.
-*/
-z_off_t ZEXPORT gztell (file)
-    gzFile file;
-{
-    return gzseek(file, 0L, SEEK_CUR);
-}
-
-/* ===========================================================================
-     Returns 1 when EOF has previously been detected reading the given
-   input stream, otherwise zero.
-*/
-int ZEXPORT gzeof (file)
-    gzFile file;
-{
-    gz_stream *s = (gz_stream*)file;
-    
-    return (s == NULL || s->mode != 'r') ? 0 : s->z_eof;
-}
-
-/* ===========================================================================
-   Outputs a long in LSB order to the given file
-*/
-local void putLong (file, x)
-    FILE *file;
-    uLong x;
-{
-    int n;
-    for (n = 0; n < 4; n++) {
-        fputc((int)(x & 0xff), file);
-        x >>= 8;
-    }
-}
-
-/* ===========================================================================
-   Reads a long in LSB order from the given gz_stream. Sets z_err in case
-   of error.
-*/
-local uLong getLong (s)
-    gz_stream *s;
-{
-    uLong x = (uLong)get_byte(s);
-    int c;
-
-    x += ((uLong)get_byte(s))<<8;
-    x += ((uLong)get_byte(s))<<16;
-    c = get_byte(s);
-    if (c == EOF) s->z_err = Z_DATA_ERROR;
-    x += ((uLong)c)<<24;
-    return x;
-}
-
-/* ===========================================================================
-     Flushes all pending output if necessary, closes the compressed file
-   and deallocates all the (de)compression state.
-*/
-int ZEXPORT gzclose (file)
-    gzFile file;
-{
-    int err;
-    gz_stream *s = (gz_stream*)file;
-
-    if (s == NULL) return Z_STREAM_ERROR;
-
-    if (s->mode == 'w') {
-#ifdef NO_DEFLATE
-	return Z_STREAM_ERROR;
-#else
-        err = do_flush (file, Z_FINISH);
-        if (err != Z_OK) return destroy((gz_stream*)file);
-
-        putLong (s->file, s->crc);
-        putLong (s->file, s->stream.total_in);
-#endif
-    }
-    return destroy((gz_stream*)file);
-}
-
-/* ===========================================================================
-     Returns the error message for the last error which occured on the
-   given compressed file. errnum is set to zlib error number. If an
-   error occured in the file system and not in the compression library,
-   errnum is set to Z_ERRNO and the application may consult errno
-   to get the exact error code.
-*/
-const char*  ZEXPORT gzerror (file, errnum)
-    gzFile file;
-    int *errnum;
-{
-    char *m;
-    gz_stream *s = (gz_stream*)file;
-
-    if (s == NULL) {
-        *errnum = Z_STREAM_ERROR;
-        return (const char*)ERR_MSG(Z_STREAM_ERROR);
-    }
-    *errnum = s->z_err;
-    if (*errnum == Z_OK) return (const char*)"";
-
-    m =  (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg);
-
-    if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err);
-
-    TRYFREE(s->msg);
-    s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3);
-    strcpy(s->msg, s->path);
-    strcat(s->msg, ": ");
-    strcat(s->msg, m);
-    return (const char*)s->msg;
-}
diff --git a/Lib/zlib/infblock.c b/Lib/zlib/infblock.c
deleted file mode 100644
index f4920faa5..000000000
--- a/Lib/zlib/infblock.c
+++ /dev/null
@@ -1,398 +0,0 @@
-/* infblock.c -- interpret and process block types to last block
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-#include "zutil.h"
-#include "infblock.h"
-#include "inftrees.h"
-#include "infcodes.h"
-#include "infutil.h"
-
-struct inflate_codes_state {int dummy;}; /* for buggy compilers */
-
-/* simplify the use of the inflate_huft type with some defines */
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-/* Table for deflate from PKZIP's appnote.txt. */
-local const uInt border[] = { /* Order of the bit length code lengths */
-        16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
-
-/*
-   Notes beyond the 1.93a appnote.txt:
-
-   1. Distance pointers never point before the beginning of the output
-      stream.
-   2. Distance pointers can point back across blocks, up to 32k away.
-   3. There is an implied maximum of 7 bits for the bit length table and
-      15 bits for the actual data.
-   4. If only one code exists, then it is encoded using one bit.  (Zero
-      would be more efficient, but perhaps a little confusing.)  If two
-      codes exist, they are coded using one bit each (0 and 1).
-   5. There is no way of sending zero distance codes--a dummy must be
-      sent if there are none.  (History: a pre 2.0 version of PKZIP would
-      store blocks with no distance codes, but this was discovered to be
-      too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow
-      zero distance codes, which is sent as one code of zero bits in
-      length.
-   6. There are up to 286 literal/length codes.  Code 256 represents the
-      end-of-block.  Note however that the static length tree defines
-      288 codes just to fill out the Huffman codes.  Codes 286 and 287
-      cannot be used though, since there is no length base or extra bits
-      defined for them.  Similarily, there are up to 30 distance codes.
-      However, static trees define 32 codes (all 5 bits) to fill out the
-      Huffman codes, but the last two had better not show up in the data.
-   7. Unzip can check dynamic Huffman blocks for complete code sets.
-      The exception is that a single code would not be complete (see #4).
-   8. The five bits following the block type is really the number of
-      literal codes sent minus 257.
-   9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
-      (1+6+6).  Therefore, to output three times the length, you output
-      three codes (1+1+1), whereas to output four times the same length,
-      you only need two codes (1+3).  Hmm.
-  10. In the tree reconstruction algorithm, Code = Code + Increment
-      only if BitLength(i) is not zero.  (Pretty obvious.)
-  11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19)
-  12. Note: length code 284 can represent 227-258, but length code 285
-      really is 258.  The last length deserves its own, short code
-      since it gets used a lot in very redundant files.  The length
-      258 is special since 258 - 3 (the min match length) is 255.
-  13. The literal/length and distance code bit lengths are read as a
-      single stream of lengths.  It is possible (and advantageous) for
-      a repeat code (16, 17, or 18) to go across the boundary between
-      the two sets of lengths.
- */
-
-
-void inflate_blocks_reset(s, z, c)
-inflate_blocks_statef *s;
-z_streamp z;
-uLongf *c;
-{
-  if (c != Z_NULL)
-    *c = s->check;
-  if (s->mode == BTREE || s->mode == DTREE)
-    ZFREE(z, s->sub.trees.blens);
-  if (s->mode == CODES)
-    inflate_codes_free(s->sub.decode.codes, z);
-  s->mode = TYPE;
-  s->bitk = 0;
-  s->bitb = 0;
-  s->read = s->write = s->window;
-  if (s->checkfn != Z_NULL)
-    z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
-  Tracev((stderr, "inflate:   blocks reset\n"));
-}
-
-
-inflate_blocks_statef *inflate_blocks_new(z, c, w)
-z_streamp z;
-check_func c;
-uInt w;
-{
-  inflate_blocks_statef *s;
-
-  if ((s = (inflate_blocks_statef *)ZALLOC
-       (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
-    return s;
-  if ((s->hufts =
-       (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
-  {
-    ZFREE(z, s);
-    return Z_NULL;
-  }
-  if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
-  {
-    ZFREE(z, s->hufts);
-    ZFREE(z, s);
-    return Z_NULL;
-  }
-  s->end = s->window + w;
-  s->checkfn = c;
-  s->mode = TYPE;
-  Tracev((stderr, "inflate:   blocks allocated\n"));
-  inflate_blocks_reset(s, z, Z_NULL);
-  return s;
-}
-
-
-int inflate_blocks(s, z, r)
-inflate_blocks_statef *s;
-z_streamp z;
-int r;
-{
-  uInt t;               /* temporary storage */
-  uLong b;              /* bit buffer */
-  uInt k;               /* bits in bit buffer */
-  Bytef *p;             /* input data pointer */
-  uInt n;               /* bytes available there */
-  Bytef *q;             /* output window write pointer */
-  uInt m;               /* bytes to end of window or read pointer */
-
-  /* copy input/output information to locals (UPDATE macro restores) */
-  LOAD
-
-  /* process input based on current state */
-  while (1) switch (s->mode)
-  {
-    case TYPE:
-      NEEDBITS(3)
-      t = (uInt)b & 7;
-      s->last = t & 1;
-      switch (t >> 1)
-      {
-        case 0:                         /* stored */
-          Tracev((stderr, "inflate:     stored block%s\n",
-                 s->last ? " (last)" : ""));
-          DUMPBITS(3)
-          t = k & 7;                    /* go to byte boundary */
-          DUMPBITS(t)
-          s->mode = LENS;               /* get length of stored block */
-          break;
-        case 1:                         /* fixed */
-          Tracev((stderr, "inflate:     fixed codes block%s\n",
-                 s->last ? " (last)" : ""));
-          {
-            uInt bl, bd;
-            inflate_huft *tl, *td;
-
-            inflate_trees_fixed(&bl, &bd, &tl, &td, z);
-            s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
-            if (s->sub.decode.codes == Z_NULL)
-            {
-              r = Z_MEM_ERROR;
-              LEAVE
-            }
-          }
-          DUMPBITS(3)
-          s->mode = CODES;
-          break;
-        case 2:                         /* dynamic */
-          Tracev((stderr, "inflate:     dynamic codes block%s\n",
-                 s->last ? " (last)" : ""));
-          DUMPBITS(3)
-          s->mode = TABLE;
-          break;
-        case 3:                         /* illegal */
-          DUMPBITS(3)
-          s->mode = BAD;
-          z->msg = (char*)"invalid block type";
-          r = Z_DATA_ERROR;
-          LEAVE
-      }
-      break;
-    case LENS:
-      NEEDBITS(32)
-      if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
-      {
-        s->mode = BAD;
-        z->msg = (char*)"invalid stored block lengths";
-        r = Z_DATA_ERROR;
-        LEAVE
-      }
-      s->sub.left = (uInt)b & 0xffff;
-      b = k = 0;                      /* dump bits */
-      Tracev((stderr, "inflate:       stored length %u\n", s->sub.left));
-      s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
-      break;
-    case STORED:
-      if (n == 0)
-        LEAVE
-      NEEDOUT
-      t = s->sub.left;
-      if (t > n) t = n;
-      if (t > m) t = m;
-      zmemcpy(q, p, t);
-      p += t;  n -= t;
-      q += t;  m -= t;
-      if ((s->sub.left -= t) != 0)
-        break;
-      Tracev((stderr, "inflate:       stored end, %lu total out\n",
-              z->total_out + (q >= s->read ? q - s->read :
-              (s->end - s->read) + (q - s->window))));
-      s->mode = s->last ? DRY : TYPE;
-      break;
-    case TABLE:
-      NEEDBITS(14)
-      s->sub.trees.table = t = (uInt)b & 0x3fff;
-#ifndef PKZIP_BUG_WORKAROUND
-      if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
-      {
-        s->mode = BAD;
-        z->msg = (char*)"too many length or distance symbols";
-        r = Z_DATA_ERROR;
-        LEAVE
-      }
-#endif
-      t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
-      if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
-      {
-        r = Z_MEM_ERROR;
-        LEAVE
-      }
-      DUMPBITS(14)
-      s->sub.trees.index = 0;
-      Tracev((stderr, "inflate:       table sizes ok\n"));
-      s->mode = BTREE;
-    case BTREE:
-      while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
-      {
-        NEEDBITS(3)
-        s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
-        DUMPBITS(3)
-      }
-      while (s->sub.trees.index < 19)
-        s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
-      s->sub.trees.bb = 7;
-      t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
-                             &s->sub.trees.tb, s->hufts, z);
-      if (t != Z_OK)
-      {
-        ZFREE(z, s->sub.trees.blens);
-        r = t;
-        if (r == Z_DATA_ERROR)
-          s->mode = BAD;
-        LEAVE
-      }
-      s->sub.trees.index = 0;
-      Tracev((stderr, "inflate:       bits tree ok\n"));
-      s->mode = DTREE;
-    case DTREE:
-      while (t = s->sub.trees.table,
-             s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
-      {
-        inflate_huft *h;
-        uInt i, j, c;
-
-        t = s->sub.trees.bb;
-        NEEDBITS(t)
-        h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
-        t = h->bits;
-        c = h->base;
-        if (c < 16)
-        {
-          DUMPBITS(t)
-          s->sub.trees.blens[s->sub.trees.index++] = c;
-        }
-        else /* c == 16..18 */
-        {
-          i = c == 18 ? 7 : c - 14;
-          j = c == 18 ? 11 : 3;
-          NEEDBITS(t + i)
-          DUMPBITS(t)
-          j += (uInt)b & inflate_mask[i];
-          DUMPBITS(i)
-          i = s->sub.trees.index;
-          t = s->sub.trees.table;
-          if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
-              (c == 16 && i < 1))
-          {
-            ZFREE(z, s->sub.trees.blens);
-            s->mode = BAD;
-            z->msg = (char*)"invalid bit length repeat";
-            r = Z_DATA_ERROR;
-            LEAVE
-          }
-          c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
-          do {
-            s->sub.trees.blens[i++] = c;
-          } while (--j);
-          s->sub.trees.index = i;
-        }
-      }
-      s->sub.trees.tb = Z_NULL;
-      {
-        uInt bl, bd;
-        inflate_huft *tl, *td;
-        inflate_codes_statef *c;
-
-        bl = 9;         /* must be <= 9 for lookahead assumptions */
-        bd = 6;         /* must be <= 9 for lookahead assumptions */
-        t = s->sub.trees.table;
-        t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
-                                  s->sub.trees.blens, &bl, &bd, &tl, &td,
-                                  s->hufts, z);
-        ZFREE(z, s->sub.trees.blens);
-        if (t != Z_OK)
-        {
-          if (t == (uInt)Z_DATA_ERROR)
-            s->mode = BAD;
-          r = t;
-          LEAVE
-        }
-        Tracev((stderr, "inflate:       trees ok\n"));
-        if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
-        {
-          r = Z_MEM_ERROR;
-          LEAVE
-        }
-        s->sub.decode.codes = c;
-      }
-      s->mode = CODES;
-    case CODES:
-      UPDATE
-      if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
-        return inflate_flush(s, z, r);
-      r = Z_OK;
-      inflate_codes_free(s->sub.decode.codes, z);
-      LOAD
-      Tracev((stderr, "inflate:       codes end, %lu total out\n",
-              z->total_out + (q >= s->read ? q - s->read :
-              (s->end - s->read) + (q - s->window))));
-      if (!s->last)
-      {
-        s->mode = TYPE;
-        break;
-      }
-      s->mode = DRY;
-    case DRY:
-      FLUSH
-      if (s->read != s->write)
-        LEAVE
-      s->mode = DONE;
-    case DONE:
-      r = Z_STREAM_END;
-      LEAVE
-    case BAD:
-      r = Z_DATA_ERROR;
-      LEAVE
-    default:
-      r = Z_STREAM_ERROR;
-      LEAVE
-  }
-}
-
-
-int inflate_blocks_free(s, z)
-inflate_blocks_statef *s;
-z_streamp z;
-{
-  inflate_blocks_reset(s, z, Z_NULL);
-  ZFREE(z, s->window);
-  ZFREE(z, s->hufts);
-  ZFREE(z, s);
-  Tracev((stderr, "inflate:   blocks freed\n"));
-  return Z_OK;
-}
-
-
-void inflate_set_dictionary(s, d, n)
-inflate_blocks_statef *s;
-const Bytef *d;
-uInt  n;
-{
-  zmemcpy(s->window, d, n);
-  s->read = s->write = s->window + n;
-}
-
-
-/* Returns true if inflate is currently at the end of a block generated
- * by Z_SYNC_FLUSH or Z_FULL_FLUSH. 
- * IN assertion: s != Z_NULL
- */
-int inflate_blocks_sync_point(s)
-inflate_blocks_statef *s;
-{
-  return s->mode == LENS;
-}
diff --git a/Lib/zlib/infblock.h b/Lib/zlib/infblock.h
deleted file mode 100644
index bd25c8075..000000000
--- a/Lib/zlib/infblock.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* infblock.h -- header to use infblock.c
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-struct inflate_blocks_state;
-typedef struct inflate_blocks_state FAR inflate_blocks_statef;
-
-extern inflate_blocks_statef * inflate_blocks_new OF((
-    z_streamp z,
-    check_func c,               /* check function */
-    uInt w));                   /* window size */
-
-extern int inflate_blocks OF((
-    inflate_blocks_statef *,
-    z_streamp ,
-    int));                      /* initial return code */
-
-extern void inflate_blocks_reset OF((
-    inflate_blocks_statef *,
-    z_streamp ,
-    uLongf *));                  /* check value on output */
-
-extern int inflate_blocks_free OF((
-    inflate_blocks_statef *,
-    z_streamp));
-
-extern void inflate_set_dictionary OF((
-    inflate_blocks_statef *s,
-    const Bytef *d,  /* dictionary */
-    uInt  n));       /* dictionary length */
-
-extern int inflate_blocks_sync_point OF((
-    inflate_blocks_statef *s));
diff --git a/Lib/zlib/infcodes.c b/Lib/zlib/infcodes.c
deleted file mode 100644
index d4e5ee9a5..000000000
--- a/Lib/zlib/infcodes.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/* infcodes.c -- process literals and length/distance pairs
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-#include "zutil.h"
-#include "inftrees.h"
-#include "infblock.h"
-#include "infcodes.h"
-#include "infutil.h"
-#include "inffast.h"
-
-/* simplify the use of the inflate_huft type with some defines */
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-typedef enum {        /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
-      START,    /* x: set up for LEN */
-      LEN,      /* i: get length/literal/eob next */
-      LENEXT,   /* i: getting length extra (have base) */
-      DIST,     /* i: get distance next */
-      DISTEXT,  /* i: getting distance extra */
-      COPY,     /* o: copying bytes in window, waiting for space */
-      LIT,      /* o: got literal, waiting for output space */
-      WASH,     /* o: got eob, possibly still output waiting */
-      END,      /* x: got eob and all data flushed */
-      BADCODE}  /* x: got error */
-inflate_codes_mode;
-
-/* inflate codes private state */
-struct inflate_codes_state {
-
-  /* mode */
-  inflate_codes_mode mode;      /* current inflate_codes mode */
-
-  /* mode dependent information */
-  uInt len;
-  union {
-    struct {
-      inflate_huft *tree;       /* pointer into tree */
-      uInt need;                /* bits needed */
-    } code;             /* if LEN or DIST, where in tree */
-    uInt lit;           /* if LIT, literal */
-    struct {
-      uInt get;                 /* bits to get for extra */
-      uInt dist;                /* distance back to copy from */
-    } copy;             /* if EXT or COPY, where and how much */
-  } sub;                /* submode */
-
-  /* mode independent information */
-  Byte lbits;           /* ltree bits decoded per branch */
-  Byte dbits;           /* dtree bits decoder per branch */
-  inflate_huft *ltree;          /* literal/length/eob tree */
-  inflate_huft *dtree;          /* distance tree */
-
-};
-
-
-inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z)
-uInt bl, bd;
-inflate_huft *tl;
-inflate_huft *td; /* need separate declaration for Borland C++ */
-z_streamp z;
-{
-  inflate_codes_statef *c;
-
-  if ((c = (inflate_codes_statef *)
-       ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)
-  {
-    c->mode = START;
-    c->lbits = (Byte)bl;
-    c->dbits = (Byte)bd;
-    c->ltree = tl;
-    c->dtree = td;
-    Tracev((stderr, "inflate:       codes new\n"));
-  }
-  return c;
-}
-
-
-int inflate_codes(s, z, r)
-inflate_blocks_statef *s;
-z_streamp z;
-int r;
-{
-  uInt j;               /* temporary storage */
-  inflate_huft *t;      /* temporary pointer */
-  uInt e;               /* extra bits or operation */
-  uLong b;              /* bit buffer */
-  uInt k;               /* bits in bit buffer */
-  Bytef *p;             /* input data pointer */
-  uInt n;               /* bytes available there */
-  Bytef *q;             /* output window write pointer */
-  uInt m;               /* bytes to end of window or read pointer */
-  Bytef *f;             /* pointer to copy strings from */
-  inflate_codes_statef *c = s->sub.decode.codes;  /* codes state */
-
-  /* copy input/output information to locals (UPDATE macro restores) */
-  LOAD
-
-  /* process input and output based on current state */
-  while (1) switch (c->mode)
-  {             /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
-    case START:         /* x: set up for LEN */
-#ifndef SLOW
-      if (m >= 258 && n >= 10)
-      {
-        UPDATE
-        r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
-        LOAD
-        if (r != Z_OK)
-        {
-          c->mode = r == Z_STREAM_END ? WASH : BADCODE;
-          break;
-        }
-      }
-#endif /* !SLOW */
-      c->sub.code.need = c->lbits;
-      c->sub.code.tree = c->ltree;
-      c->mode = LEN;
-    case LEN:           /* i: get length/literal/eob next */
-      j = c->sub.code.need;
-      NEEDBITS(j)
-      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
-      DUMPBITS(t->bits)
-      e = (uInt)(t->exop);
-      if (e == 0)               /* literal */
-      {
-        c->sub.lit = t->base;
-        Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
-                 "inflate:         literal '%c'\n" :
-                 "inflate:         literal 0x%02x\n", t->base));
-        c->mode = LIT;
-        break;
-      }
-      if (e & 16)               /* length */
-      {
-        c->sub.copy.get = e & 15;
-        c->len = t->base;
-        c->mode = LENEXT;
-        break;
-      }
-      if ((e & 64) == 0)        /* next table */
-      {
-        c->sub.code.need = e;
-        c->sub.code.tree = t + t->base;
-        break;
-      }
-      if (e & 32)               /* end of block */
-      {
-        Tracevv((stderr, "inflate:         end of block\n"));
-        c->mode = WASH;
-        break;
-      }
-      c->mode = BADCODE;        /* invalid code */
-      z->msg = (char*)"invalid literal/length code";
-      r = Z_DATA_ERROR;
-      LEAVE
-    case LENEXT:        /* i: getting length extra (have base) */
-      j = c->sub.copy.get;
-      NEEDBITS(j)
-      c->len += (uInt)b & inflate_mask[j];
-      DUMPBITS(j)
-      c->sub.code.need = c->dbits;
-      c->sub.code.tree = c->dtree;
-      Tracevv((stderr, "inflate:         length %u\n", c->len));
-      c->mode = DIST;
-    case DIST:          /* i: get distance next */
-      j = c->sub.code.need;
-      NEEDBITS(j)
-      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
-      DUMPBITS(t->bits)
-      e = (uInt)(t->exop);
-      if (e & 16)               /* distance */
-      {
-        c->sub.copy.get = e & 15;
-        c->sub.copy.dist = t->base;
-        c->mode = DISTEXT;
-        break;
-      }
-      if ((e & 64) == 0)        /* next table */
-      {
-        c->sub.code.need = e;
-        c->sub.code.tree = t + t->base;
-        break;
-      }
-      c->mode = BADCODE;        /* invalid code */
-      z->msg = (char*)"invalid distance code";
-      r = Z_DATA_ERROR;
-      LEAVE
-    case DISTEXT:       /* i: getting distance extra */
-      j = c->sub.copy.get;
-      NEEDBITS(j)
-      c->sub.copy.dist += (uInt)b & inflate_mask[j];
-      DUMPBITS(j)
-      Tracevv((stderr, "inflate:         distance %u\n", c->sub.copy.dist));
-      c->mode = COPY;
-    case COPY:          /* o: copying bytes in window, waiting for space */
-#ifndef __TURBOC__ /* Turbo C bug for following expression */
-      f = (uInt)(q - s->window) < c->sub.copy.dist ?
-          s->end - (c->sub.copy.dist - (q - s->window)) :
-          q - c->sub.copy.dist;
-#else
-      f = q - c->sub.copy.dist;
-      if ((uInt)(q - s->window) < c->sub.copy.dist)
-        f = s->end - (c->sub.copy.dist - (uInt)(q - s->window));
-#endif
-      while (c->len)
-      {
-        NEEDOUT
-        OUTBYTE(*f++)
-        if (f == s->end)
-          f = s->window;
-        c->len--;
-      }
-      c->mode = START;
-      break;
-    case LIT:           /* o: got literal, waiting for output space */
-      NEEDOUT
-      OUTBYTE(c->sub.lit)
-      c->mode = START;
-      break;
-    case WASH:          /* o: got eob, possibly more output */
-      if (k > 7)        /* return unused byte, if any */
-      {
-        Assert(k < 16, "inflate_codes grabbed too many bytes")
-        k -= 8;
-        n++;
-        p--;            /* can always return one */
-      }
-      FLUSH
-      if (s->read != s->write)
-        LEAVE
-      c->mode = END;
-    case END:
-      r = Z_STREAM_END;
-      LEAVE
-    case BADCODE:       /* x: got error */
-      r = Z_DATA_ERROR;
-      LEAVE
-    default:
-      r = Z_STREAM_ERROR;
-      LEAVE
-  }
-#ifdef NEED_DUMMY_RETURN
-  return Z_STREAM_ERROR;  /* Some dumb compilers complain without this */
-#endif
-}
-
-
-void inflate_codes_free(c, z)
-inflate_codes_statef *c;
-z_streamp z;
-{
-  ZFREE(z, c);
-  Tracev((stderr, "inflate:       codes free\n"));
-}
diff --git a/Lib/zlib/infcodes.h b/Lib/zlib/infcodes.h
deleted file mode 100644
index 6c750d896..000000000
--- a/Lib/zlib/infcodes.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* infcodes.h -- header to use infcodes.c
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-struct inflate_codes_state;
-typedef struct inflate_codes_state FAR inflate_codes_statef;
-
-extern inflate_codes_statef *inflate_codes_new OF((
-    uInt, uInt,
-    inflate_huft *, inflate_huft *,
-    z_streamp ));
-
-extern int inflate_codes OF((
-    inflate_blocks_statef *,
-    z_streamp ,
-    int));
-
-extern void inflate_codes_free OF((
-    inflate_codes_statef *,
-    z_streamp ));
-
diff --git a/Lib/zlib/inffast.c b/Lib/zlib/inffast.c
deleted file mode 100644
index 61a78ee93..000000000
--- a/Lib/zlib/inffast.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/* inffast.c -- process literals and length/distance pairs fast
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-#include "zutil.h"
-#include "inftrees.h"
-#include "infblock.h"
-#include "infcodes.h"
-#include "infutil.h"
-#include "inffast.h"
-
-struct inflate_codes_state {int dummy;}; /* for buggy compilers */
-
-/* simplify the use of the inflate_huft type with some defines */
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-/* macros for bit input with no checking and for returning unused bytes */
-#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<avail_in-n;c=(k>>3)>3:c;n+=c;p-=c;k-=c<<3;}
-
-/* Called with number of bytes left to write in window at least 258
-   (the maximum string length) and number of input bytes available
-   at least ten.  The ten bytes are six bytes for the longest length/
-   distance pair plus four bytes for overloading the bit buffer. */
-
-int inflate_fast(bl, bd, tl, td, s, z)
-uInt bl, bd;
-inflate_huft *tl;
-inflate_huft *td; /* need separate declaration for Borland C++ */
-inflate_blocks_statef *s;
-z_streamp z;
-{
-  inflate_huft *t;      /* temporary pointer */
-  uInt e;               /* extra bits or operation */
-  uLong b;              /* bit buffer */
-  uInt k;               /* bits in bit buffer */
-  Bytef *p;             /* input data pointer */
-  uInt n;               /* bytes available there */
-  Bytef *q;             /* output window write pointer */
-  uInt m;               /* bytes to end of window or read pointer */
-  uInt ml;              /* mask for literal/length tree */
-  uInt md;              /* mask for distance tree */
-  uInt c;               /* bytes to copy */
-  uInt d;               /* distance back to copy from */
-  Bytef *r;             /* copy source pointer */
-
-  /* load input, output, bit values */
-  LOAD
-
-  /* initialize masks */
-  ml = inflate_mask[bl];
-  md = inflate_mask[bd];
-
-  /* do until not enough input or output space for fast loop */
-  do {                          /* assume called with m >= 258 && n >= 10 */
-    /* get literal/length code */
-    GRABBITS(20)                /* max bits for literal/length code */
-    if ((e = (t = tl + ((uInt)b & ml))->exop) == 0)
-    {
-      DUMPBITS(t->bits)
-      Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
-                "inflate:         * literal '%c'\n" :
-                "inflate:         * literal 0x%02x\n", t->base));
-      *q++ = (Byte)t->base;
-      m--;
-      continue;
-    }
-    do {
-      DUMPBITS(t->bits)
-      if (e & 16)
-      {
-        /* get extra bits for length */
-        e &= 15;
-        c = t->base + ((uInt)b & inflate_mask[e]);
-        DUMPBITS(e)
-        Tracevv((stderr, "inflate:         * length %u\n", c));
-
-        /* decode distance base of block to copy */
-        GRABBITS(15);           /* max bits for distance code */
-        e = (t = td + ((uInt)b & md))->exop;
-        do {
-          DUMPBITS(t->bits)
-          if (e & 16)
-          {
-            /* get extra bits to add to distance base */
-            e &= 15;
-            GRABBITS(e)         /* get extra bits (up to 13) */
-            d = t->base + ((uInt)b & inflate_mask[e]);
-            DUMPBITS(e)
-            Tracevv((stderr, "inflate:         * distance %u\n", d));
-
-            /* do the copy */
-            m -= c;
-            if ((uInt)(q - s->window) >= d)     /* offset before dest */
-            {                                   /*  just copy */
-              r = q - d;
-              *q++ = *r++;  c--;        /* minimum count is three, */
-              *q++ = *r++;  c--;        /*  so unroll loop a little */
-            }
-            else                        /* else offset after destination */
-            {
-              e = d - (uInt)(q - s->window); /* bytes from offset to end */
-              r = s->end - e;           /* pointer to offset */
-              if (c > e)                /* if source crosses, */
-              {
-                c -= e;                 /* copy to end of window */
-                do {
-                  *q++ = *r++;
-                } while (--e);
-                r = s->window;          /* copy rest from start of window */
-              }
-            }
-            do {                        /* copy all or what's left */
-              *q++ = *r++;
-            } while (--c);
-            break;
-          }
-          else if ((e & 64) == 0)
-          {
-            t += t->base;
-            e = (t += ((uInt)b & inflate_mask[e]))->exop;
-          }
-          else
-          {
-            z->msg = (char*)"invalid distance code";
-            UNGRAB
-            UPDATE
-            return Z_DATA_ERROR;
-          }
-        } while (1);
-        break;
-      }
-      if ((e & 64) == 0)
-      {
-        t += t->base;
-        if ((e = (t += ((uInt)b & inflate_mask[e]))->exop) == 0)
-        {
-          DUMPBITS(t->bits)
-          Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
-                    "inflate:         * literal '%c'\n" :
-                    "inflate:         * literal 0x%02x\n", t->base));
-          *q++ = (Byte)t->base;
-          m--;
-          break;
-        }
-      }
-      else if (e & 32)
-      {
-        Tracevv((stderr, "inflate:         * end of block\n"));
-        UNGRAB
-        UPDATE
-        return Z_STREAM_END;
-      }
-      else
-      {
-        z->msg = (char*)"invalid literal/length code";
-        UNGRAB
-        UPDATE
-        return Z_DATA_ERROR;
-      }
-    } while (1);
-  } while (m >= 258 && n >= 10);
-
-  /* not enough input or output--restore pointers and return */
-  UNGRAB
-  UPDATE
-  return Z_OK;
-}
diff --git a/Lib/zlib/inffast.h b/Lib/zlib/inffast.h
deleted file mode 100644
index 8facec553..000000000
--- a/Lib/zlib/inffast.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* inffast.h -- header to use inffast.c
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-extern int inflate_fast OF((
-    uInt,
-    uInt,
-    inflate_huft *,
-    inflate_huft *,
-    inflate_blocks_statef *,
-    z_streamp ));
diff --git a/Lib/zlib/inffixed.h b/Lib/zlib/inffixed.h
deleted file mode 100644
index 77f7e7631..000000000
--- a/Lib/zlib/inffixed.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/* inffixed.h -- table for decoding fixed codes
- * Generated automatically by the maketree.c program
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-local uInt fixed_bl = 9;
-local uInt fixed_bd = 5;
-local inflate_huft fixed_tl[] = {
-    {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
-    {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192},
-    {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160},
-    {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224},
-    {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144},
-    {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208},
-    {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176},
-    {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240},
-    {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
-    {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200},
-    {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168},
-    {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232},
-    {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152},
-    {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216},
-    {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184},
-    {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248},
-    {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
-    {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196},
-    {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164},
-    {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228},
-    {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148},
-    {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212},
-    {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180},
-    {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244},
-    {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
-    {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204},
-    {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172},
-    {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236},
-    {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156},
-    {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220},
-    {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188},
-    {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252},
-    {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
-    {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194},
-    {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162},
-    {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226},
-    {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146},
-    {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210},
-    {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178},
-    {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242},
-    {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
-    {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202},
-    {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170},
-    {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234},
-    {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154},
-    {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218},
-    {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186},
-    {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250},
-    {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
-    {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198},
-    {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166},
-    {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230},
-    {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150},
-    {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214},
-    {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182},
-    {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246},
-    {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
-    {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206},
-    {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174},
-    {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238},
-    {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158},
-    {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222},
-    {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190},
-    {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254},
-    {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
-    {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193},
-    {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161},
-    {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225},
-    {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145},
-    {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209},
-    {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177},
-    {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241},
-    {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
-    {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201},
-    {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169},
-    {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233},
-    {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153},
-    {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217},
-    {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185},
-    {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249},
-    {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
-    {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197},
-    {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165},
-    {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229},
-    {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149},
-    {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213},
-    {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181},
-    {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245},
-    {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
-    {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205},
-    {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173},
-    {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237},
-    {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157},
-    {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221},
-    {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189},
-    {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253},
-    {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
-    {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195},
-    {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163},
-    {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227},
-    {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147},
-    {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211},
-    {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179},
-    {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243},
-    {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
-    {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203},
-    {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171},
-    {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235},
-    {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155},
-    {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219},
-    {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187},
-    {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251},
-    {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
-    {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199},
-    {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167},
-    {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231},
-    {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151},
-    {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215},
-    {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183},
-    {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247},
-    {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
-    {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207},
-    {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175},
-    {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239},
-    {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159},
-    {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223},
-    {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191},
-    {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255}
-  };
-local inflate_huft fixed_td[] = {
-    {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097},
-    {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385},
-    {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193},
-    {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577},
-    {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145},
-    {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577},
-    {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289},
-    {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577}
-  };
diff --git a/Lib/zlib/inflate.c b/Lib/zlib/inflate.c
deleted file mode 100644
index 32e9b8de6..000000000
--- a/Lib/zlib/inflate.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/* inflate.c -- zlib interface to inflate modules
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-#include "zutil.h"
-#include "infblock.h"
-
-struct inflate_blocks_state {int dummy;}; /* for buggy compilers */
-
-typedef enum {
-      METHOD,   /* waiting for method byte */
-      FLAG,     /* waiting for flag byte */
-      DICT4,    /* four dictionary check bytes to go */
-      DICT3,    /* three dictionary check bytes to go */
-      DICT2,    /* two dictionary check bytes to go */
-      DICT1,    /* one dictionary check byte to go */
-      DICT0,    /* waiting for inflateSetDictionary */
-      BLOCKS,   /* decompressing blocks */
-      CHECK4,   /* four check bytes to go */
-      CHECK3,   /* three check bytes to go */
-      CHECK2,   /* two check bytes to go */
-      CHECK1,   /* one check byte to go */
-      DONE,     /* finished check, done */
-      BAD}      /* got an error--stay here */
-inflate_mode;
-
-/* inflate private state */
-struct internal_state {
-
-  /* mode */
-  inflate_mode  mode;   /* current inflate mode */
-
-  /* mode dependent information */
-  union {
-    uInt method;        /* if FLAGS, method byte */
-    struct {
-      uLong was;                /* computed check value */
-      uLong need;               /* stream check value */
-    } check;            /* if CHECK, check values to compare */
-    uInt marker;        /* if BAD, inflateSync's marker bytes count */
-  } sub;        /* submode */
-
-  /* mode independent information */
-  int  nowrap;          /* flag for no wrapper */
-  uInt wbits;           /* log2(window size)  (8..15, defaults to 15) */
-  inflate_blocks_statef 
-    *blocks;            /* current inflate_blocks state */
-
-};
-
-
-int ZEXPORT inflateReset(z)
-z_streamp z;
-{
-  if (z == Z_NULL || z->state == Z_NULL)
-    return Z_STREAM_ERROR;
-  z->total_in = z->total_out = 0;
-  z->msg = Z_NULL;
-  z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
-  inflate_blocks_reset(z->state->blocks, z, Z_NULL);
-  Tracev((stderr, "inflate: reset\n"));
-  return Z_OK;
-}
-
-
-int ZEXPORT inflateEnd(z)
-z_streamp z;
-{
-  if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
-    return Z_STREAM_ERROR;
-  if (z->state->blocks != Z_NULL)
-    inflate_blocks_free(z->state->blocks, z);
-  ZFREE(z, z->state);
-  z->state = Z_NULL;
-  Tracev((stderr, "inflate: end\n"));
-  return Z_OK;
-}
-
-
-int ZEXPORT inflateInit2_(z, w, version, stream_size)
-z_streamp z;
-int w;
-const char *version;
-int stream_size;
-{
-  if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
-      stream_size != sizeof(z_stream))
-      return Z_VERSION_ERROR;
-
-  /* initialize state */
-  if (z == Z_NULL)
-    return Z_STREAM_ERROR;
-  z->msg = Z_NULL;
-  if (z->zalloc == Z_NULL)
-  {
-    z->zalloc = zcalloc;
-    z->opaque = (voidpf)0;
-  }
-  if (z->zfree == Z_NULL) z->zfree = zcfree;
-  if ((z->state = (struct internal_state FAR *)
-       ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
-    return Z_MEM_ERROR;
-  z->state->blocks = Z_NULL;
-
-  /* handle undocumented nowrap option (no zlib header or check) */
-  z->state->nowrap = 0;
-  if (w < 0)
-  {
-    w = - w;
-    z->state->nowrap = 1;
-  }
-
-  /* set window size */
-  if (w < 8 || w > 15)
-  {
-    inflateEnd(z);
-    return Z_STREAM_ERROR;
-  }
-  z->state->wbits = (uInt)w;
-
-  /* create inflate_blocks state */
-  if ((z->state->blocks =
-      inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w))
-      == Z_NULL)
-  {
-    inflateEnd(z);
-    return Z_MEM_ERROR;
-  }
-  Tracev((stderr, "inflate: allocated\n"));
-
-  /* reset state */
-  inflateReset(z);
-  return Z_OK;
-}
-
-
-int ZEXPORT inflateInit_(z, version, stream_size)
-z_streamp z;
-const char *version;
-int stream_size;
-{
-  return inflateInit2_(z, DEF_WBITS, version, stream_size);
-}
-
-
-#define NEEDBYTE {if(z->avail_in==0)return r;r=f;}
-#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
-
-int ZEXPORT inflate(z, f)
-z_streamp z;
-int f;
-{
-  int r;
-  uInt b;
-
-  if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL)
-    return Z_STREAM_ERROR;
-  f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK;
-  r = Z_BUF_ERROR;
-  while (1) switch (z->state->mode)
-  {
-    case METHOD:
-      NEEDBYTE
-      if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED)
-      {
-        z->state->mode = BAD;
-        z->msg = (char*)"unknown compression method";
-        z->state->sub.marker = 5;       /* can't try inflateSync */
-        break;
-      }
-      if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
-      {
-        z->state->mode = BAD;
-        z->msg = (char*)"invalid window size";
-        z->state->sub.marker = 5;       /* can't try inflateSync */
-        break;
-      }
-      z->state->mode = FLAG;
-    case FLAG:
-      NEEDBYTE
-      b = NEXTBYTE;
-      if (((z->state->sub.method << 8) + b) % 31)
-      {
-        z->state->mode = BAD;
-        z->msg = (char*)"incorrect header check";
-        z->state->sub.marker = 5;       /* can't try inflateSync */
-        break;
-      }
-      Tracev((stderr, "inflate: zlib header ok\n"));
-      if (!(b & PRESET_DICT))
-      {
-        z->state->mode = BLOCKS;
-        break;
-      }
-      z->state->mode = DICT4;
-    case DICT4:
-      NEEDBYTE
-      z->state->sub.check.need = (uLong)NEXTBYTE << 24;
-      z->state->mode = DICT3;
-    case DICT3:
-      NEEDBYTE
-      z->state->sub.check.need += (uLong)NEXTBYTE << 16;
-      z->state->mode = DICT2;
-    case DICT2:
-      NEEDBYTE
-      z->state->sub.check.need += (uLong)NEXTBYTE << 8;
-      z->state->mode = DICT1;
-    case DICT1:
-      NEEDBYTE
-      z->state->sub.check.need += (uLong)NEXTBYTE;
-      z->adler = z->state->sub.check.need;
-      z->state->mode = DICT0;
-      return Z_NEED_DICT;
-    case DICT0:
-      z->state->mode = BAD;
-      z->msg = (char*)"need dictionary";
-      z->state->sub.marker = 0;       /* can try inflateSync */
-      return Z_STREAM_ERROR;
-    case BLOCKS:
-      r = inflate_blocks(z->state->blocks, z, r);
-      if (r == Z_DATA_ERROR)
-      {
-        z->state->mode = BAD;
-        z->state->sub.marker = 0;       /* can try inflateSync */
-        break;
-      }
-      if (r == Z_OK)
-        r = f;
-      if (r != Z_STREAM_END)
-        return r;
-      r = f;
-      inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
-      if (z->state->nowrap)
-      {
-        z->state->mode = DONE;
-        break;
-      }
-      z->state->mode = CHECK4;
-    case CHECK4:
-      NEEDBYTE
-      z->state->sub.check.need = (uLong)NEXTBYTE << 24;
-      z->state->mode = CHECK3;
-    case CHECK3:
-      NEEDBYTE
-      z->state->sub.check.need += (uLong)NEXTBYTE << 16;
-      z->state->mode = CHECK2;
-    case CHECK2:
-      NEEDBYTE
-      z->state->sub.check.need += (uLong)NEXTBYTE << 8;
-      z->state->mode = CHECK1;
-    case CHECK1:
-      NEEDBYTE
-      z->state->sub.check.need += (uLong)NEXTBYTE;
-
-      if (z->state->sub.check.was != z->state->sub.check.need)
-      {
-        z->state->mode = BAD;
-        z->msg = (char*)"incorrect data check";
-        z->state->sub.marker = 5;       /* can't try inflateSync */
-        break;
-      }
-      Tracev((stderr, "inflate: zlib check ok\n"));
-      z->state->mode = DONE;
-    case DONE:
-      return Z_STREAM_END;
-    case BAD:
-      return Z_DATA_ERROR;
-    default:
-      return Z_STREAM_ERROR;
-  }
-#ifdef NEED_DUMMY_RETURN
-  return Z_STREAM_ERROR;  /* Some dumb compilers complain without this */
-#endif
-}
-
-
-int ZEXPORT inflateSetDictionary(z, dictionary, dictLength)
-z_streamp z;
-const Bytef *dictionary;
-uInt  dictLength;
-{
-  uInt length = dictLength;
-
-  if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0)
-    return Z_STREAM_ERROR;
-
-  if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR;
-  z->adler = 1L;
-
-  if (length >= ((uInt)1<state->wbits))
-  {
-    length = (1<state->wbits)-1;
-    dictionary += dictLength - length;
-  }
-  inflate_set_dictionary(z->state->blocks, dictionary, length);
-  z->state->mode = BLOCKS;
-  return Z_OK;
-}
-
-
-int ZEXPORT inflateSync(z)
-z_streamp z;
-{
-  uInt n;       /* number of bytes to look at */
-  Bytef *p;     /* pointer to bytes */
-  uInt m;       /* number of marker bytes found in a row */
-  uLong r, w;   /* temporaries to save total_in and total_out */
-
-  /* set up */
-  if (z == Z_NULL || z->state == Z_NULL)
-    return Z_STREAM_ERROR;
-  if (z->state->mode != BAD)
-  {
-    z->state->mode = BAD;
-    z->state->sub.marker = 0;
-  }
-  if ((n = z->avail_in) == 0)
-    return Z_BUF_ERROR;
-  p = z->next_in;
-  m = z->state->sub.marker;
-
-  /* search */
-  while (n && m < 4)
-  {
-    static const Byte mark[4] = {0, 0, 0xff, 0xff};
-    if (*p == mark[m])
-      m++;
-    else if (*p)
-      m = 0;
-    else
-      m = 4 - m;
-    p++, n--;
-  }
-
-  /* restore */
-  z->total_in += p - z->next_in;
-  z->next_in = p;
-  z->avail_in = n;
-  z->state->sub.marker = m;
-
-  /* return no joy or set up to restart on a new block */
-  if (m != 4)
-    return Z_DATA_ERROR;
-  r = z->total_in;  w = z->total_out;
-  inflateReset(z);
-  z->total_in = r;  z->total_out = w;
-  z->state->mode = BLOCKS;
-  return Z_OK;
-}
-
-
-/* Returns true if inflate is currently at the end of a block generated
- * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
- * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH
- * but removes the length bytes of the resulting empty stored block. When
- * decompressing, PPP checks that at the end of input packet, inflate is
- * waiting for these length bytes.
- */
-int ZEXPORT inflateSyncPoint(z)
-z_streamp z;
-{
-  if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL)
-    return Z_STREAM_ERROR;
-  return inflate_blocks_sync_point(z->state->blocks);
-}
diff --git a/Lib/zlib/inftrees.c b/Lib/zlib/inftrees.c
deleted file mode 100644
index ef1e0b6b8..000000000
--- a/Lib/zlib/inftrees.c
+++ /dev/null
@@ -1,455 +0,0 @@
-/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-#include "zutil.h"
-#include "inftrees.h"
-
-#if !defined(BUILDFIXED) && !defined(STDC)
-#  define BUILDFIXED   /* non ANSI compilers may not accept inffixed.h */
-#endif
-
-const char inflate_copyright[] =
-   " inflate 1.1.3 Copyright 1995-1998 Mark Adler ";
-/*
-  If you use the zlib library in a product, an acknowledgment is welcome
-  in the documentation of your product. If for some reason you cannot
-  include such an acknowledgment, I would appreciate that you keep this
-  copyright string in the executable of your product.
- */
-struct internal_state  {int dummy;}; /* for buggy compilers */
-
-/* simplify the use of the inflate_huft type with some defines */
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-
-local int huft_build OF((
-    uIntf *,            /* code lengths in bits */
-    uInt,               /* number of codes */
-    uInt,               /* number of "simple" codes */
-    const uIntf *,      /* list of base values for non-simple codes */
-    const uIntf *,      /* list of extra bits for non-simple codes */
-    inflate_huft * FAR*,/* result: starting table */
-    uIntf *,            /* maximum lookup bits (returns actual) */
-    inflate_huft *,     /* space for trees */
-    uInt *,             /* hufts used in space */
-    uIntf * ));         /* space for values */
-
-/* Tables for deflate from PKZIP's appnote.txt. */
-local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */
-        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
-        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
-        /* see note #13 above about 258 */
-local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */
-        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
-        3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */
-local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */
-        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
-        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
-        8193, 12289, 16385, 24577};
-local const uInt cpdext[30] = { /* Extra bits for distance codes */
-        0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
-        7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
-        12, 12, 13, 13};
-
-/*
-   Huffman code decoding is performed using a multi-level table lookup.
-   The fastest way to decode is to simply build a lookup table whose
-   size is determined by the longest code.  However, the time it takes
-   to build this table can also be a factor if the data being decoded
-   is not very long.  The most common codes are necessarily the
-   shortest codes, so those codes dominate the decoding time, and hence
-   the speed.  The idea is you can have a shorter table that decodes the
-   shorter, more probable codes, and then point to subsidiary tables for
-   the longer codes.  The time it costs to decode the longer codes is
-   then traded against the time it takes to make longer tables.
-
-   This results of this trade are in the variables lbits and dbits
-   below.  lbits is the number of bits the first level table for literal/
-   length codes can decode in one step, and dbits is the same thing for
-   the distance codes.  Subsequent tables are also less than or equal to
-   those sizes.  These values may be adjusted either when all of the
-   codes are shorter than that, in which case the longest code length in
-   bits is used, or when the shortest code is *longer* than the requested
-   table size, in which case the length of the shortest code in bits is
-   used.
-
-   There are two different values for the two tables, since they code a
-   different number of possibilities each.  The literal/length table
-   codes 286 possible values, or in a flat code, a little over eight
-   bits.  The distance table codes 30 possible values, or a little less
-   than five bits, flat.  The optimum values for speed end up being
-   about one bit more than those, so lbits is 8+1 and dbits is 5+1.
-   The optimum values may differ though from machine to machine, and
-   possibly even between compilers.  Your mileage may vary.
- */
-
-
-/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
-#define BMAX 15         /* maximum bit length of any code */
-
-local int huft_build(b, n, s, d, e, t, m, hp, hn, v)
-uIntf *b;               /* code lengths in bits (all assumed <= BMAX) */
-uInt n;                 /* number of codes (assumed <= 288) */
-uInt s;                 /* number of simple-valued codes (0..s-1) */
-const uIntf *d;         /* list of base values for non-simple codes */
-const uIntf *e;         /* list of extra bits for non-simple codes */
-inflate_huft * FAR *t;  /* result: starting table */
-uIntf *m;               /* maximum lookup bits, returns actual */
-inflate_huft *hp;       /* space for trees */
-uInt *hn;               /* hufts used in space */
-uIntf *v;               /* working area: values in order of bit length */
-/* Given a list of code lengths and a maximum table size, make a set of
-   tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR
-   if the given code set is incomplete (the tables are still built in this
-   case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
-   lengths), or Z_MEM_ERROR if not enough memory. */
-{
-
-  uInt a;                       /* counter for codes of length k */
-  uInt c[BMAX+1];               /* bit length count table */
-  uInt f;                       /* i repeats in table every f entries */
-  int g;                        /* maximum code length */
-  int h;                        /* table level */
-  register uInt i;              /* counter, current code */
-  register uInt j;              /* counter */
-  register int k;               /* number of bits in current code */
-  int l;                        /* bits per table (returned in m) */
-  uInt mask;                    /* (1 << w) - 1, to avoid cc -O bug on HP */
-  register uIntf *p;            /* pointer into c[], b[], or v[] */
-  inflate_huft *q;              /* points to current table */
-  struct inflate_huft_s r;      /* table entry for structure assignment */
-  inflate_huft *u[BMAX];        /* table stack */
-  register int w;               /* bits before this table == (l * h) */
-  uInt x[BMAX+1];               /* bit offsets, then code stack */
-  uIntf *xp;                    /* pointer into x */
-  int y;                        /* number of dummy codes added */
-  uInt z;                       /* number of entries in current table */
-
-
-  /* Generate counts for each bit length */
-  p = c;
-#define C0 *p++ = 0;
-#define C2 C0 C0 C0 C0
-#define C4 C2 C2 C2 C2
-  C4                            /* clear c[]--assume BMAX+1 is 16 */
-  p = b;  i = n;
-  do {
-    c[*p++]++;                  /* assume all entries <= BMAX */
-  } while (--i);
-  if (c[0] == n)                /* null input--all zero length codes */
-  {
-    *t = (inflate_huft *)Z_NULL;
-    *m = 0;
-    return Z_OK;
-  }
-
-
-  /* Find minimum and maximum length, bound *m by those */
-  l = *m;
-  for (j = 1; j <= BMAX; j++)
-    if (c[j])
-      break;
-  k = j;                        /* minimum code length */
-  if ((uInt)l < j)
-    l = j;
-  for (i = BMAX; i; i--)
-    if (c[i])
-      break;
-  g = i;                        /* maximum code length */
-  if ((uInt)l > i)
-    l = i;
-  *m = l;
-
-
-  /* Adjust last length count to fill out codes, if needed */
-  for (y = 1 << j; j < i; j++, y <<= 1)
-    if ((y -= c[j]) < 0)
-      return Z_DATA_ERROR;
-  if ((y -= c[i]) < 0)
-    return Z_DATA_ERROR;
-  c[i] += y;
-
-
-  /* Generate starting offsets into the value table for each length */
-  x[1] = j = 0;
-  p = c + 1;  xp = x + 2;
-  while (--i) {                 /* note that i == g from above */
-    *xp++ = (j += *p++);
-  }
-
-
-  /* Make a table of values in order of bit lengths */
-  p = b;  i = 0;
-  do {
-    if ((j = *p++) != 0)
-      v[x[j]++] = i;
-  } while (++i < n);
-  n = x[g];                     /* set n to length of v */
-
-
-  /* Generate the Huffman codes and for each, make the table entries */
-  x[0] = i = 0;                 /* first Huffman code is zero */
-  p = v;                        /* grab values in bit order */
-  h = -1;                       /* no tables yet--level -1 */
-  w = -l;                       /* bits decoded == (l * h) */
-  u[0] = (inflate_huft *)Z_NULL;        /* just to keep compilers happy */
-  q = (inflate_huft *)Z_NULL;   /* ditto */
-  z = 0;                        /* ditto */
-
-  /* go through the bit lengths (k already is bits in shortest code) */
-  for (; k <= g; k++)
-  {
-    a = c[k];
-    while (a--)
-    {
-      /* here i is the Huffman code of length k bits for value *p */
-      /* make tables up to required level */
-      while (k > w + l)
-      {
-        h++;
-        w += l;                 /* previous table always l bits */
-
-        /* compute minimum size table less than or equal to l bits */
-        z = g - w;
-        z = z > (uInt)l ? l : z;        /* table size upper limit */
-        if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */
-        {                       /* too few codes for k-w bit table */
-          f -= a + 1;           /* deduct codes from patterns left */
-          xp = c + k;
-          if (j < z)
-            while (++j < z)     /* try smaller tables up to z bits */
-            {
-              if ((f <<= 1) <= *++xp)
-                break;          /* enough codes to use up j bits */
-              f -= *xp;         /* else deduct codes from patterns */
-            }
-        }
-        z = 1 << j;             /* table entries for j-bit table */
-
-        /* allocate new table */
-        if (*hn + z > MANY)     /* (note: doesn't matter for fixed) */
-          return Z_MEM_ERROR;   /* not enough memory */
-        u[h] = q = hp + *hn;
-        *hn += z;
-
-        /* connect to last table, if there is one */
-        if (h)
-        {
-          x[h] = i;             /* save pattern for backing up */
-          r.bits = (Byte)l;     /* bits to dump before this table */
-          r.exop = (Byte)j;     /* bits in this table */
-          j = i >> (w - l);
-          r.base = (uInt)(q - u[h-1] - j);   /* offset to this table */
-          u[h-1][j] = r;        /* connect to last table */
-        }
-        else
-          *t = q;               /* first table is returned result */
-      }
-
-      /* set up table entry in r */
-      r.bits = (Byte)(k - w);
-      if (p >= v + n)
-        r.exop = 128 + 64;      /* out of values--invalid code */
-      else if (*p < s)
-      {
-        r.exop = (Byte)(*p < 256 ? 0 : 32 + 64);     /* 256 is end-of-block */
-        r.base = *p++;          /* simple code is just the value */
-      }
-      else
-      {
-        r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */
-        r.base = d[*p++ - s];
-      }
-
-      /* fill code-like entries with r */
-      f = 1 << (k - w);
-      for (j = i >> w; j < z; j += f)
-        q[j] = r;
-
-      /* backwards increment the k-bit code i */
-      for (j = 1 << (k - 1); i & j; j >>= 1)
-        i ^= j;
-      i ^= j;
-
-      /* backup over finished tables */
-      mask = (1 << w) - 1;      /* needed on HP, cc -O bug */
-      while ((i & mask) != x[h])
-      {
-        h--;                    /* don't need to update q */
-        w -= l;
-        mask = (1 << w) - 1;
-      }
-    }
-  }
-
-
-  /* Return Z_BUF_ERROR if we were given an incomplete table */
-  return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
-}
-
-
-int inflate_trees_bits(c, bb, tb, hp, z)
-uIntf *c;               /* 19 code lengths */
-uIntf *bb;              /* bits tree desired/actual depth */
-inflate_huft * FAR *tb; /* bits tree result */
-inflate_huft *hp;       /* space for trees */
-z_streamp z;            /* for messages */
-{
-  int r;
-  uInt hn = 0;          /* hufts used in space */
-  uIntf *v;             /* work area for huft_build */
-
-  if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL)
-    return Z_MEM_ERROR;
-  r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL,
-                 tb, bb, hp, &hn, v);
-  if (r == Z_DATA_ERROR)
-    z->msg = (char*)"oversubscribed dynamic bit lengths tree";
-  else if (r == Z_BUF_ERROR || *bb == 0)
-  {
-    z->msg = (char*)"incomplete dynamic bit lengths tree";
-    r = Z_DATA_ERROR;
-  }
-  ZFREE(z, v);
-  return r;
-}
-
-
-int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, hp, z)
-uInt nl;                /* number of literal/length codes */
-uInt nd;                /* number of distance codes */
-uIntf *c;               /* that many (total) code lengths */
-uIntf *bl;              /* literal desired/actual bit depth */
-uIntf *bd;              /* distance desired/actual bit depth */
-inflate_huft * FAR *tl; /* literal/length tree result */
-inflate_huft * FAR *td; /* distance tree result */
-inflate_huft *hp;       /* space for trees */
-z_streamp z;            /* for messages */
-{
-  int r;
-  uInt hn = 0;          /* hufts used in space */
-  uIntf *v;             /* work area for huft_build */
-
-  /* allocate work area */
-  if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
-    return Z_MEM_ERROR;
-
-  /* build literal/length tree */
-  r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v);
-  if (r != Z_OK || *bl == 0)
-  {
-    if (r == Z_DATA_ERROR)
-      z->msg = (char*)"oversubscribed literal/length tree";
-    else if (r != Z_MEM_ERROR)
-    {
-      z->msg = (char*)"incomplete literal/length tree";
-      r = Z_DATA_ERROR;
-    }
-    ZFREE(z, v);
-    return r;
-  }
-
-  /* build distance tree */
-  r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v);
-  if (r != Z_OK || (*bd == 0 && nl > 257))
-  {
-    if (r == Z_DATA_ERROR)
-      z->msg = (char*)"oversubscribed distance tree";
-    else if (r == Z_BUF_ERROR) {
-#ifdef PKZIP_BUG_WORKAROUND
-      r = Z_OK;
-    }
-#else
-      z->msg = (char*)"incomplete distance tree";
-      r = Z_DATA_ERROR;
-    }
-    else if (r != Z_MEM_ERROR)
-    {
-      z->msg = (char*)"empty distance tree with lengths";
-      r = Z_DATA_ERROR;
-    }
-    ZFREE(z, v);
-    return r;
-#endif
-  }
-
-  /* done */
-  ZFREE(z, v);
-  return Z_OK;
-}
-
-
-/* build fixed tables only once--keep them here */
-#ifdef BUILDFIXED
-local int fixed_built = 0;
-#define FIXEDH 544      /* number of hufts used by fixed tables */
-local inflate_huft fixed_mem[FIXEDH];
-local uInt fixed_bl;
-local uInt fixed_bd;
-local inflate_huft *fixed_tl;
-local inflate_huft *fixed_td;
-#else
-#include "inffixed.h"
-#endif
-
-
-int inflate_trees_fixed(bl, bd, tl, td, z)
-uIntf *bl;               /* literal desired/actual bit depth */
-uIntf *bd;               /* distance desired/actual bit depth */
-inflate_huft * FAR *tl;  /* literal/length tree result */
-inflate_huft * FAR *td;  /* distance tree result */
-z_streamp z;             /* for memory allocation */
-{
-#ifdef BUILDFIXED
-  /* build fixed tables if not already */
-  if (!fixed_built)
-  {
-    int k;              /* temporary variable */
-    uInt f = 0;         /* number of hufts used in fixed_mem */
-    uIntf *c;           /* length list for huft_build */
-    uIntf *v;           /* work area for huft_build */
-
-    /* allocate memory */
-    if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
-      return Z_MEM_ERROR;
-    if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
-    {
-      ZFREE(z, c);
-      return Z_MEM_ERROR;
-    }
-
-    /* literal table */
-    for (k = 0; k < 144; k++)
-      c[k] = 8;
-    for (; k < 256; k++)
-      c[k] = 9;
-    for (; k < 280; k++)
-      c[k] = 7;
-    for (; k < 288; k++)
-      c[k] = 8;
-    fixed_bl = 9;
-    huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl,
-               fixed_mem, &f, v);
-
-    /* distance table */
-    for (k = 0; k < 30; k++)
-      c[k] = 5;
-    fixed_bd = 5;
-    huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd,
-               fixed_mem, &f, v);
-
-    /* done */
-    ZFREE(z, v);
-    ZFREE(z, c);
-    fixed_built = 1;
-  }
-#endif
-  *bl = fixed_bl;
-  *bd = fixed_bd;
-  *tl = fixed_tl;
-  *td = fixed_td;
-  return Z_OK;
-}
diff --git a/Lib/zlib/inftrees.h b/Lib/zlib/inftrees.h
deleted file mode 100644
index 85853e097..000000000
--- a/Lib/zlib/inftrees.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* inftrees.h -- header to use inftrees.c
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-/* Huffman code lookup table entry--this entry is four bytes for machines
-   that have 16-bit pointers (e.g. PC's in the small or medium model). */
-
-typedef struct inflate_huft_s FAR inflate_huft;
-
-struct inflate_huft_s {
-  union {
-    struct {
-      Byte Exop;        /* number of extra bits or operation */
-      Byte Bits;        /* number of bits in this code or subcode */
-    } what;
-    uInt pad;           /* pad structure to a power of 2 (4 bytes for */
-  } word;               /*  16-bit, 8 bytes for 32-bit int's) */
-  uInt base;            /* literal, length base, distance base,
-                           or table offset */
-};
-
-/* Maximum size of dynamic tree.  The maximum found in a long but non-
-   exhaustive search was 1004 huft structures (850 for length/literals
-   and 154 for distances, the latter actually the result of an
-   exhaustive search).  The actual maximum is not known, but the
-   value below is more than safe. */
-#define MANY 1440
-
-extern int inflate_trees_bits OF((
-    uIntf *,                    /* 19 code lengths */
-    uIntf *,                    /* bits tree desired/actual depth */
-    inflate_huft * FAR *,       /* bits tree result */
-    inflate_huft *,             /* space for trees */
-    z_streamp));                /* for messages */
-
-extern int inflate_trees_dynamic OF((
-    uInt,                       /* number of literal/length codes */
-    uInt,                       /* number of distance codes */
-    uIntf *,                    /* that many (total) code lengths */
-    uIntf *,                    /* literal desired/actual bit depth */
-    uIntf *,                    /* distance desired/actual bit depth */
-    inflate_huft * FAR *,       /* literal/length tree result */
-    inflate_huft * FAR *,       /* distance tree result */
-    inflate_huft *,             /* space for trees */
-    z_streamp));                /* for messages */
-
-extern int inflate_trees_fixed OF((
-    uIntf *,                    /* literal desired/actual bit depth */
-    uIntf *,                    /* distance desired/actual bit depth */
-    inflate_huft * FAR *,       /* literal/length tree result */
-    inflate_huft * FAR *,       /* distance tree result */
-    z_streamp));                /* for memory allocation */
diff --git a/Lib/zlib/infutil.c b/Lib/zlib/infutil.c
deleted file mode 100644
index 824dab571..000000000
--- a/Lib/zlib/infutil.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* inflate_util.c -- data and routines common to blocks and codes
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-#include "zutil.h"
-#include "infblock.h"
-#include "inftrees.h"
-#include "infcodes.h"
-#include "infutil.h"
-
-struct inflate_codes_state {int dummy;}; /* for buggy compilers */
-
-/* And'ing with mask[n] masks the lower n bits */
-uInt inflate_mask[17] = {
-    0x0000,
-    0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
-    0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
-};
-
-
-/* copy as much as possible from the sliding window to the output area */
-int inflate_flush(s, z, r)
-inflate_blocks_statef *s;
-z_streamp z;
-int r;
-{
-  uInt n;
-  Bytef *p;
-  Bytef *q;
-
-  /* local copies of source and destination pointers */
-  p = z->next_out;
-  q = s->read;
-
-  /* compute number of bytes to copy as far as end of window */
-  n = (uInt)((q <= s->write ? s->write : s->end) - q);
-  if (n > z->avail_out) n = z->avail_out;
-  if (n && r == Z_BUF_ERROR) r = Z_OK;
-
-  /* update counters */
-  z->avail_out -= n;
-  z->total_out += n;
-
-  /* update check information */
-  if (s->checkfn != Z_NULL)
-    z->adler = s->check = (*s->checkfn)(s->check, q, n);
-
-  /* copy as far as end of window */
-  zmemcpy(p, q, n);
-  p += n;
-  q += n;
-
-  /* see if more to copy at beginning of window */
-  if (q == s->end)
-  {
-    /* wrap pointers */
-    q = s->window;
-    if (s->write == s->end)
-      s->write = s->window;
-
-    /* compute bytes to copy */
-    n = (uInt)(s->write - q);
-    if (n > z->avail_out) n = z->avail_out;
-    if (n && r == Z_BUF_ERROR) r = Z_OK;
-
-    /* update counters */
-    z->avail_out -= n;
-    z->total_out += n;
-
-    /* update check information */
-    if (s->checkfn != Z_NULL)
-      z->adler = s->check = (*s->checkfn)(s->check, q, n);
-
-    /* copy */
-    zmemcpy(p, q, n);
-    p += n;
-    q += n;
-  }
-
-  /* update pointers */
-  z->next_out = p;
-  s->read = q;
-
-  /* done */
-  return r;
-}
diff --git a/Lib/zlib/infutil.h b/Lib/zlib/infutil.h
deleted file mode 100644
index 99d1135d0..000000000
--- a/Lib/zlib/infutil.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* infutil.h -- types and macros common to blocks and codes
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-#ifndef _INFUTIL_H
-#define _INFUTIL_H
-
-typedef enum {
-      TYPE,     /* get type bits (3, including end bit) */
-      LENS,     /* get lengths for stored */
-      STORED,   /* processing stored block */
-      TABLE,    /* get table lengths */
-      BTREE,    /* get bit lengths tree for a dynamic block */
-      DTREE,    /* get length, distance trees for a dynamic block */
-      CODES,    /* processing fixed or dynamic block */
-      DRY,      /* output remaining window bytes */
-      DONE,     /* finished last block, done */
-      BAD}      /* got a data error--stuck here */
-inflate_block_mode;
-
-/* inflate blocks semi-private state */
-struct inflate_blocks_state {
-
-  /* mode */
-  inflate_block_mode  mode;     /* current inflate_block mode */
-
-  /* mode dependent information */
-  union {
-    uInt left;          /* if STORED, bytes left to copy */
-    struct {
-      uInt table;               /* table lengths (14 bits) */
-      uInt index;               /* index into blens (or border) */
-      uIntf *blens;             /* bit lengths of codes */
-      uInt bb;                  /* bit length tree depth */
-      inflate_huft *tb;         /* bit length decoding tree */
-    } trees;            /* if DTREE, decoding info for trees */
-    struct {
-      inflate_codes_statef 
-         *codes;
-    } decode;           /* if CODES, current state */
-  } sub;                /* submode */
-  uInt last;            /* true if this block is the last block */
-
-  /* mode independent information */
-  uInt bitk;            /* bits in bit buffer */
-  uLong bitb;           /* bit buffer */
-  inflate_huft *hufts;  /* single malloc for tree space */
-  Bytef *window;        /* sliding window */
-  Bytef *end;           /* one byte after sliding window */
-  Bytef *read;          /* window read pointer */
-  Bytef *write;         /* window write pointer */
-  check_func checkfn;   /* check function */
-  uLong check;          /* check on output */
-
-};
-
-
-/* defines for inflate input/output */
-/*   update pointers and return */
-#define UPDBITS {s->bitb=b;s->bitk=k;}
-#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
-#define UPDOUT {s->write=q;}
-#define UPDATE {UPDBITS UPDIN UPDOUT}
-#define LEAVE {UPDATE return inflate_flush(s,z,r);}
-/*   get bytes and bits */
-#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
-#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
-#define NEXTBYTE (n--,*p++)
-#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<>=(j);k-=(j);}
-/*   output bytes */
-#define WAVAIL (uInt)(qread?s->read-q-1:s->end-q)
-#define LOADOUT {q=s->write;m=(uInt)WAVAIL;}
-#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}}
-#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
-#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}
-#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
-/*   load local pointers */
-#define LOAD {LOADIN LOADOUT}
-
-/* masks for lower bits (size given to avoid silly warnings with Visual C++) */
-extern uInt inflate_mask[17];
-
-/* copy as much as possible from the sliding window to the output area */
-extern int inflate_flush OF((
-    inflate_blocks_statef *,
-    z_streamp ,
-    int));
-
-struct internal_state      {int dummy;}; /* for buggy compilers */
-
-#endif
diff --git a/Lib/zlib/maketree.c b/Lib/zlib/maketree.c
deleted file mode 100644
index 949d78641..000000000
--- a/Lib/zlib/maketree.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/* maketree.c -- make inffixed.h table for decoding fixed codes
- * Copyright (C) 1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-/* This program is included in the distribution for completeness.
-   You do not need to compile or run this program since inffixed.h
-   is already included in the distribution.  To use this program
-   you need to compile zlib with BUILDFIXED defined and then compile
-   and link this program with the zlib library.  Then the output of
-   this program can be piped to inffixed.h. */
-
-#include 
-#include 
-#include "zutil.h"
-#include "inftrees.h"
-
-/* simplify the use of the inflate_huft type with some defines */
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-/* generate initialization table for an inflate_huft structure array */
-void maketree(uInt b, inflate_huft *t)
-{
-  int i, e;
-
-  i = 0;
-  while (1)
-  {
-    e = t[i].exop;
-    if (e && (e & (16+64)) == 0)        /* table pointer */
-    {
-      fprintf(stderr, "maketree: cannot initialize sub-tables!\n");
-      exit(1);
-    }
-    if (i % 4 == 0)
-      printf("\n   ");
-    printf(" {{{%u,%u}},%u}", t[i].exop, t[i].bits, t[i].base);
-    if (++i == (1<
-#include "zlib.h"
-
-#ifdef STDC
-#  include 
-#  include 
-#else
-   extern void exit  OF((int));
-#endif
-
-#ifdef USE_MMAP
-#  include 
-#  include 
-#  include 
-#endif
-
-#if defined(MSDOS) || defined(OS2) || defined(WIN32)
-#  include 
-#  include 
-#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
-#else
-#  define SET_BINARY_MODE(file)
-#endif
-
-#ifdef VMS
-#  define unlink delete
-#  define GZ_SUFFIX "-gz"
-#endif
-#ifdef RISCOS
-#  define unlink remove
-#  define GZ_SUFFIX "-gz"
-#  define fileno(file) file->__file
-#endif
-#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
-#  include  /* for fileno */
-#endif
-
-#ifndef WIN32 /* unlink already in stdio.h for WIN32 */
-  extern int unlink OF((const char *));
-#endif
-
-#ifndef GZ_SUFFIX
-#  define GZ_SUFFIX ".gz"
-#endif
-#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1)
-
-#define BUFLEN      16384
-#define MAX_NAME_LEN 1024
-
-#ifdef MAXSEG_64K
-#  define local static
-   /* Needed for systems with limitation on stack size. */
-#else
-#  define local
-#endif
-
-char *prog;
-
-void error            OF((const char *msg));
-void gz_compress      OF((FILE   *in, gzFile out));
-#ifdef USE_MMAP
-int  gz_compress_mmap OF((FILE   *in, gzFile out));
-#endif
-void gz_uncompress    OF((gzFile in, FILE   *out));
-void file_compress    OF((char  *file, char *mode));
-void file_uncompress  OF((char  *file));
-int  main             OF((int argc, char *argv[]));
-
-/* ===========================================================================
- * Display error message and exit
- */
-void error(msg)
-    const char *msg;
-{
-    fprintf(stderr, "%s: %s\n", prog, msg);
-    exit(1);
-}
-
-/* ===========================================================================
- * Compress input to output then close both files.
- */
-
-void gz_compress(in, out)
-    FILE   *in;
-    gzFile out;
-{
-    local char buf[BUFLEN];
-    int len;
-    int err;
-
-#ifdef USE_MMAP
-    /* Try first compressing with mmap. If mmap fails (minigzip used in a
-     * pipe), use the normal fread loop.
-     */
-    if (gz_compress_mmap(in, out) == Z_OK) return;
-#endif
-    for (;;) {
-        len = fread(buf, 1, sizeof(buf), in);
-        if (ferror(in)) {
-            perror("fread");
-            exit(1);
-        }
-        if (len == 0) break;
-
-        if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err));
-    }
-    fclose(in);
-    if (gzclose(out) != Z_OK) error("failed gzclose");
-}
-
-#ifdef USE_MMAP /* MMAP version, Miguel Albrecht  */
-
-/* Try compressing the input file at once using mmap. Return Z_OK if
- * if success, Z_ERRNO otherwise.
- */
-int gz_compress_mmap(in, out)
-    FILE   *in;
-    gzFile out;
-{
-    int len;
-    int err;
-    int ifd = fileno(in);
-    caddr_t buf;    /* mmap'ed buffer for the entire input file */
-    off_t buf_len;  /* length of the input file */
-    struct stat sb;
-
-    /* Determine the size of the file, needed for mmap: */
-    if (fstat(ifd, &sb) < 0) return Z_ERRNO;
-    buf_len = sb.st_size;
-    if (buf_len <= 0) return Z_ERRNO;
-
-    /* Now do the actual mmap: */
-    buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); 
-    if (buf == (caddr_t)(-1)) return Z_ERRNO;
-
-    /* Compress the whole file at once: */
-    len = gzwrite(out, (char *)buf, (unsigned)buf_len);
-
-    if (len != (int)buf_len) error(gzerror(out, &err));
-
-    munmap(buf, buf_len);
-    fclose(in);
-    if (gzclose(out) != Z_OK) error("failed gzclose");
-    return Z_OK;
-}
-#endif /* USE_MMAP */
-
-/* ===========================================================================
- * Uncompress input to output then close both files.
- */
-void gz_uncompress(in, out)
-    gzFile in;
-    FILE   *out;
-{
-    local char buf[BUFLEN];
-    int len;
-    int err;
-
-    for (;;) {
-        len = gzread(in, buf, sizeof(buf));
-        if (len < 0) error (gzerror(in, &err));
-        if (len == 0) break;
-
-        if ((int)fwrite(buf, 1, (unsigned)len, out) != len) {
-	    error("failed fwrite");
-	}
-    }
-    if (fclose(out)) error("failed fclose");
-
-    if (gzclose(in) != Z_OK) error("failed gzclose");
-}
-
-
-/* ===========================================================================
- * Compress the given file: create a corresponding .gz file and remove the
- * original.
- */
-void file_compress(file, mode)
-    char  *file;
-    char  *mode;
-{
-    local char outfile[MAX_NAME_LEN];
-    FILE  *in;
-    gzFile out;
-
-    strcpy(outfile, file);
-    strcat(outfile, GZ_SUFFIX);
-
-    in = fopen(file, "rb");
-    if (in == NULL) {
-        perror(file);
-        exit(1);
-    }
-    out = gzopen(outfile, mode);
-    if (out == NULL) {
-        fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile);
-        exit(1);
-    }
-    gz_compress(in, out);
-
-    unlink(file);
-}
-
-
-/* ===========================================================================
- * Uncompress the given file and remove the original.
- */
-void file_uncompress(file)
-    char  *file;
-{
-    local char buf[MAX_NAME_LEN];
-    char *infile, *outfile;
-    FILE  *out;
-    gzFile in;
-    int len = strlen(file);
-
-    strcpy(buf, file);
-
-    if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) {
-        infile = file;
-        outfile = buf;
-        outfile[len-3] = '\0';
-    } else {
-        outfile = file;
-        infile = buf;
-        strcat(infile, GZ_SUFFIX);
-    }
-    in = gzopen(infile, "rb");
-    if (in == NULL) {
-        fprintf(stderr, "%s: can't gzopen %s\n", prog, infile);
-        exit(1);
-    }
-    out = fopen(outfile, "wb");
-    if (out == NULL) {
-        perror(file);
-        exit(1);
-    }
-
-    gz_uncompress(in, out);
-
-    unlink(infile);
-}
-
-
-/* ===========================================================================
- * Usage:  minigzip [-d] [-f] [-h] [-1 to -9] [files...]
- *   -d : decompress
- *   -f : compress with Z_FILTERED
- *   -h : compress with Z_HUFFMAN_ONLY
- *   -1 to -9 : compression level
- */
-
-int main(argc, argv)
-    int argc;
-    char *argv[];
-{
-    int uncompr = 0;
-    gzFile file;
-    char outmode[20];
-
-    strcpy(outmode, "wb6 ");
-
-    prog = argv[0];
-    argc--, argv++;
-
-    while (argc > 0) {
-      if (strcmp(*argv, "-d") == 0)
-	uncompr = 1;
-      else if (strcmp(*argv, "-f") == 0)
-	outmode[3] = 'f';
-      else if (strcmp(*argv, "-h") == 0)
-	outmode[3] = 'h';
-      else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' &&
-	       (*argv)[2] == 0)
-	outmode[2] = (*argv)[1];
-      else
-	break;
-      argc--, argv++;
-    }
-    if (argc == 0) {
-        SET_BINARY_MODE(stdin);
-        SET_BINARY_MODE(stdout);
-        if (uncompr) {
-            file = gzdopen(fileno(stdin), "rb");
-            if (file == NULL) error("can't gzdopen stdin");
-            gz_uncompress(file, stdout);
-        } else {
-            file = gzdopen(fileno(stdout), outmode);
-            if (file == NULL) error("can't gzdopen stdout");
-            gz_compress(stdin, file);
-        }
-    } else {
-        do {
-            if (uncompr) {
-                file_uncompress(*argv);
-            } else {
-                file_compress(*argv, outmode);
-            }
-        } while (argv++, --argc);
-    }
-    exit(0);
-    return 0; /* to avoid warning */
-}
diff --git a/Lib/zlib/msdos/Makefile.b32 b/Lib/zlib/msdos/Makefile.b32
deleted file mode 100644
index f476da916..000000000
--- a/Lib/zlib/msdos/Makefile.b32
+++ /dev/null
@@ -1,104 +0,0 @@
-# Makefile for zlib
-# Borland C++   
-
-# This version of the zlib makefile was adapted by Chris Young for use
-# with Borland C 4.5x with the Dos Power Pack for a 32-bit protected mode
-# flat memory model.  It was created for use with POV-Ray ray tracer and
-# you may choose to edit the CFLAGS to suit your needs but the
-# switches -WX and -DMSDOS are required.
-# -- Chris Young 76702.1655@compuserve.com
-
-# To use, do "make -fmakefile.b32"
-
-# See zconf.h for details about the memory requirements.
-
-# ------------- Borland C++ -------------
-MODEL=-WX 
-CFLAGS= $(MODEL) -P-C -K -N- -k- -d -3 -r- -v- -f -DMSDOS
-CC=bcc32
-LD=bcc32
-LIB=tlib
-LDFLAGS= $(MODEL)
-O=.obj
-
-# variables
-OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
-  trees$(O)
-OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
-  trees$(O)
-OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
-  infutil$(O) inffast$(O)
-OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
-  infutil$(O)+inffast$(O)
-
-all: test
-
-adler32.obj: adler32.c zlib.h zconf.h
-	$(CC) -c $(CFLAGS) $*.c
-
-compress.obj: compress.c zlib.h zconf.h
-	$(CC) -c $(CFLAGS) $*.c
-
-crc32.obj: crc32.c zlib.h zconf.h
-	$(CC) -c $(CFLAGS) $*.c
-
-deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
-	$(CC) -c $(CFLAGS) $*.c
-
-gzio.obj: gzio.c zutil.h zlib.h zconf.h
-	$(CC) -c $(CFLAGS) $*.c
-
-infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
-   infcodes.h infutil.h
-	$(CC) -c $(CFLAGS) $*.c
-
-infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
-   infcodes.h inffast.h
-	$(CC) -c $(CFLAGS) $*.c
-
-inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
-	$(CC) -c $(CFLAGS) $*.c
-
-inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
-	$(CC) -c $(CFLAGS) $*.c
-
-infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
-	$(CC) -c $(CFLAGS) $*.c
-
-inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
-	$(CC) -c $(CFLAGS) $*.c
-
-trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
-	$(CC) -c $(CFLAGS) $*.c
-
-uncompr.obj: uncompr.c zlib.h zconf.h
-	$(CC) -c $(CFLAGS) $*.c
-
-zutil.obj: zutil.c zutil.h zlib.h zconf.h
-	$(CC) -c $(CFLAGS) $*.c
-
-example.obj: example.c zlib.h zconf.h
-	$(CC) -c $(CFLAGS) $*.c
-
-minigzip.obj: minigzip.c zlib.h zconf.h
-	$(CC) -c $(CFLAGS) $*.c
-
-# we must cut the command line to fit in the MS/DOS 128 byte limit:
-zlib.lib: $(OBJ1) $(OBJ2)
-	del zlib.lib
-	$(LIB) zlib +$(OBJP1)
-	$(LIB) zlib +$(OBJP2)
-
-example.exe: example.obj zlib.lib
-	$(LD) $(LDFLAGS) example.obj zlib.lib
-
-minigzip.exe: minigzip.obj zlib.lib
-	$(LD) $(LDFLAGS) minigzip.obj zlib.lib
-
-test: example.exe minigzip.exe
-	example
-	echo hello world | minigzip | minigzip -d 
-
-#clean:
-#	del *.obj
-#	del *.exe
diff --git a/Lib/zlib/msdos/Makefile.bor b/Lib/zlib/msdos/Makefile.bor
deleted file mode 100644
index f5651b40f..000000000
--- a/Lib/zlib/msdos/Makefile.bor
+++ /dev/null
@@ -1,125 +0,0 @@
-# Makefile for zlib
-# Borland C++   ************ UNTESTED ***********
-
-# To use, do "make -fmakefile.bor"
-# To compile in small model, set below: MODEL=s
-
-# WARNING: the small model is supported but only for small values of
-# MAX_WBITS and MAX_MEM_LEVEL. For example:
-#    -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3
-# If you wish to reduce the memory requirements (default 256K for big
-# objects plus a few K), you can add to the LOC macro below:
-#   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
-# See zconf.h for details about the memory requirements.
-
-# ------------- Turbo C++, Borland C++ -------------
-
-#    Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
-#    should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added
-#    to the declaration of LOC here:
-LOC = $(LOCAL_ZLIB)
-
-# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc.
-CPU_TYP = 0
-
-# Memory model: one of s, m, c, l (small, medium, compact, large)
-MODEL=l
-
-CC=bcc
-#   replace bcc with tcc for Turbo C++ 1.0, with bcc32 for the 32 bit version
-LD=$(CC)
-AR=tlib
-
-# compiler flags
-CFLAGS=-O2 -Z -m$(MODEL) $(LOC)
-#   replace "-O2" by "-O -G -a -d" for Turbo C++ 1.0
-
-LDFLAGS=-m$(MODEL)
-
-O=.obj
-
-# variables
-OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
-  trees$(O)
-OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
-  trees$(O)
-OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
-  infutil$(O) inffast$(O)
-OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
-  infutil$(O)+inffast$(O)
-
-ZLIB_H = zlib.h zconf.h
-ZUTIL_H = zutil.h $(ZLIB_H)
-
-ZLIB_LIB = zlib_$(MODEL).lib
-
-all: test
-
-# individual dependencies and action rules:
-adler32.obj: adler32.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-compress.obj: compress.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-crc32.obj: crc32.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-deflate.obj: deflate.c deflate.h $(ZUTIL_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-gzio.obj: gzio.c $(ZUTIL_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-infblock.obj: infblock.c $(ZUTIL_H) infblock.h inftrees.h infcodes.h infutil.h
-	$(CC) -c $(CFLAGS) $*.c
-
-infcodes.obj: infcodes.c $(ZUTIL_H) inftrees.h infutil.h infcodes.h inffast.h
-	$(CC) -c $(CFLAGS) $*.c
-
-inflate.obj: inflate.c $(ZUTIL_H) infblock.h
-	$(CC) -c $(CFLAGS) $*.c
-
-inftrees.obj: inftrees.c $(ZUTIL_H) inftrees.h
-	$(CC) -c $(CFLAGS) $*.c
-
-infutil.obj: infutil.c $(ZUTIL_H) inftrees.h infutil.h
-	$(CC) -c $(CFLAGS) $*.c
-
-inffast.obj: inffast.c $(ZUTIL_H) inftrees.h infutil.h inffast.h
-	$(CC) -c $(CFLAGS) $*.c
-
-trees.obj: trees.c deflate.h $(ZUTIL_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-uncompr.obj: uncompr.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-zutil.obj: zutil.c $(ZUTIL_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-example.obj: example.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-minigzip.obj: minigzip.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-# we must cut the command line to fit in the MS/DOS 128 byte limit:
-$(ZLIB_LIB): $(OBJ1) $(OBJ2)
-	del $(ZLIB_LIB)
-	$(AR) $(ZLIB_LIB) +$(OBJP1)
-	$(AR) $(ZLIB_LIB) +$(OBJP2)
-
-example.exe: example.obj $(ZLIB_LIB)
-	$(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
-
-minigzip.exe: minigzip.obj $(ZLIB_LIB)
-	$(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
-
-test: example.exe minigzip.exe
-	example
-	echo hello world | minigzip | minigzip -d 
-
-#clean:
-#	del *.obj
-#	del *.exe
diff --git a/Lib/zlib/msdos/Makefile.dj2 b/Lib/zlib/msdos/Makefile.dj2
deleted file mode 100644
index 0ab431c8a..000000000
--- a/Lib/zlib/msdos/Makefile.dj2
+++ /dev/null
@@ -1,100 +0,0 @@
-# Makefile for zlib.  Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96.
-# Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile, or to compile and test, type:
-# 
-#   make -fmakefile.dj2;  make test -fmakefile.dj2
-# 
-# To install libz.a, zconf.h and zlib.h in the djgpp directories, type:
-# 
-#    make install -fmakefile.dj2
-# 
-# after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as
-# in the sample below if the pattern of the DJGPP distribution is to
-# be followed.  Remember that, while 'es around <=> are ignored in
-# makefiles, they are *not* in batch files or in djgpp.env.
-# - - - - -
-# [make]
-# INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include
-# LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib
-# BUTT=-m486
-# - - - - -
-# Alternately, these variables may be defined below, overriding the values
-# in djgpp.env, as
-# INCLUDE_PATH=c:\usr\include
-# LIBRARY_PATH=c:\usr\lib
-
-CC=gcc
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-             -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is available, replace "copy /Y" with "cp -fp" .
-CP=copy /Y
-# If gnu install.exe is available, replace $(CP) with ginstall.
-INSTALL=$(CP)
-# The default value of RM is "rm -f."  If "rm.exe" is found, comment out:
-RM=del
-LDLIBS=-L. -lz
-LD=$(CC) -s -o
-LDSHARED=$(CC)
-
-INCL=zlib.h zconf.h
-LIBS=libz.a
-
-AR=ar rcs
-
-prefix=/usr/local
-exec_prefix = $(prefix)
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-all: example.exe minigzip.exe
-
-test: all
-	./example
-	echo hello world | .\minigzip | .\minigzip -d 
-
-%.o : %.c
-	$(CC) $(CFLAGS) -c $< -o $@
-
-libz.a: $(OBJS)
-	$(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
-	$(LD) $@ $< $(LDLIBS)
-
-# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env .
-
-.PHONY : uninstall clean
-
-install: $(INCL) $(LIBS)
-	-@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH)
-	-@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH)
-	$(INSTALL) zlib.h $(INCLUDE_PATH)
-	$(INSTALL) zconf.h $(INCLUDE_PATH)
-	$(INSTALL) libz.a $(LIBRARY_PATH)
-
-uninstall:
-	$(RM) $(INCLUDE_PATH)\zlib.h
-	$(RM) $(INCLUDE_PATH)\zconf.h
-	$(RM) $(LIBRARY_PATH)\libz.a
-
-clean:
-	$(RM) *.d
-	$(RM) *.o
-	$(RM) *.exe
-	$(RM) libz.a
-	$(RM) foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
diff --git a/Lib/zlib/msdos/Makefile.emx b/Lib/zlib/msdos/Makefile.emx
deleted file mode 100644
index 0e5e5cc43..000000000
--- a/Lib/zlib/msdos/Makefile.emx
+++ /dev/null
@@ -1,69 +0,0 @@
-# Makefile for zlib.  Modified for emx 0.9c by Chr. Spieler, 6/17/98.
-# Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile, or to compile and test, type:
-# 
-#   make -fmakefile.emx;  make test -fmakefile.emx
-# 
-
-CC=gcc
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-             -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is available, replace "copy /Y" with "cp -fp" .
-CP=copy /Y
-# If gnu install.exe is available, replace $(CP) with ginstall.
-INSTALL=$(CP)
-# The default value of RM is "rm -f."  If "rm.exe" is found, comment out:
-RM=del
-LDLIBS=-L. -lzlib
-LD=$(CC) -s -o
-LDSHARED=$(CC)
-
-INCL=zlib.h zconf.h
-LIBS=zlib.a
-
-AR=ar rcs
-
-prefix=/usr/local
-exec_prefix = $(prefix)
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-all: example.exe minigzip.exe
-
-test: all
-	./example
-	echo hello world | .\minigzip | .\minigzip -d 
-
-%.o : %.c
-	$(CC) $(CFLAGS) -c $< -o $@
-
-zlib.a: $(OBJS)
-	$(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
-	$(LD) $@ $< $(LDLIBS)
-
-
-.PHONY : clean
-
-clean:
-	$(RM) *.d
-	$(RM) *.o
-	$(RM) *.exe
-	$(RM) zlib.a
-	$(RM) foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
diff --git a/Lib/zlib/msdos/Makefile.msc b/Lib/zlib/msdos/Makefile.msc
deleted file mode 100644
index 562201d87..000000000
--- a/Lib/zlib/msdos/Makefile.msc
+++ /dev/null
@@ -1,121 +0,0 @@
-# Makefile for zlib
-# Microsoft C 5.1 or later
-
-# To use, do "make makefile.msc"
-# To compile in small model, set below: MODEL=S
-
-# If you wish to reduce the memory requirements (default 256K for big
-# objects plus a few K), you can add to the LOC macro below:
-#   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
-# See zconf.h for details about the memory requirements.
-
-# ------------- Microsoft C 5.1 and later -------------
-
-#    Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
-#    should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added
-#    to the declaration of LOC here:
-LOC = $(LOCAL_ZLIB)
-
-# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc.
-CPU_TYP = 0
-
-# Memory model: one of S, M, C, L (small, medium, compact, large)
-MODEL=L
-
-CC=cl
-CFLAGS=-nologo -A$(MODEL) -G$(CPU_TYP) -W3 -Oait -Gs $(LOC)
-#-Ox generates bad code with MSC 5.1
-LIB_CFLAGS=-Zl $(CFLAGS)
-
-LD=link
-LDFLAGS=/noi/e/st:0x1500/noe/farcall/packcode
-# "/farcall/packcode" are only useful for `large code' memory models
-# but should be a "no-op" for small code models.
-
-O=.obj
-
-# variables
-OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
-  trees$(O)
-OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
-  trees$(O)
-OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
-  infutil$(O) inffast$(O)
-OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
-  infutil$(O)+inffast$(O)
-
-ZLIB_H = zlib.h zconf.h
-ZUTIL_H = zutil.h $(ZLIB_H)
-
-ZLIB_LIB = zlib_$(MODEL).lib
-
-all:  $(ZLIB_LIB) example.exe minigzip.exe
-
-# individual dependencies and action rules:
-adler32.obj: adler32.c $(ZLIB_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-compress.obj: compress.c $(ZLIB_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-crc32.obj: crc32.c $(ZLIB_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-deflate.obj: deflate.c deflate.h $(ZUTIL_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-gzio.obj: gzio.c $(ZUTIL_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-infblock.obj: infblock.c $(ZUTIL_H) infblock.h inftrees.h infcodes.h infutil.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-infcodes.obj: infcodes.c $(ZUTIL_H) inftrees.h infutil.h infcodes.h inffast.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-inflate.obj: inflate.c $(ZUTIL_H) infblock.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-inftrees.obj: inftrees.c $(ZUTIL_H) inftrees.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-infutil.obj: infutil.c $(ZUTIL_H) inftrees.h infutil.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-inffast.obj: inffast.c $(ZUTIL_H) inftrees.h infutil.h inffast.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-trees.obj: trees.c deflate.h $(ZUTIL_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-uncompr.obj: uncompr.c $(ZLIB_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-zutil.obj: zutil.c $(ZUTIL_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-example.obj: example.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-minigzip.obj: minigzip.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-# we must cut the command line to fit in the MS/DOS 128 byte limit:
-$(ZLIB_LIB): $(OBJ1) $(OBJ2)
-	if exist $(ZLIB_LIB) del $(ZLIB_LIB)
-	lib $(ZLIB_LIB) $(OBJ1);
-	lib $(ZLIB_LIB) $(OBJ2);
-
-example.exe: example.obj $(ZLIB_LIB)
-	$(LD) $(LDFLAGS) example.obj,,,$(ZLIB_LIB);
-
-minigzip.exe: minigzip.obj $(ZLIB_LIB)
-	$(LD) $(LDFLAGS) minigzip.obj,,,$(ZLIB_LIB);
-
-test: example.exe minigzip.exe
-	example
-	echo hello world | minigzip | minigzip -d 
-
-#clean:
-#	del *.obj
-#	del *.exe
diff --git a/Lib/zlib/msdos/Makefile.tc b/Lib/zlib/msdos/Makefile.tc
deleted file mode 100644
index 63e055035..000000000
--- a/Lib/zlib/msdos/Makefile.tc
+++ /dev/null
@@ -1,108 +0,0 @@
-# Makefile for zlib
-# TurboC 2.0
-
-# To use, do "make -fmakefile.tc"
-# To compile in small model, set below: MODEL=-ms
-
-# WARNING: the small model is supported but only for small values of
-# MAX_WBITS and MAX_MEM_LEVEL. For example:
-#    -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
-# If you wish to reduce the memory requirements (default 256K for big
-# objects plus a few K), you can add to CFLAGS below:
-#   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
-# See zconf.h for details about the memory requirements.
-
-# ------------- Turbo C 2.0 -------------
-MODEL=l
-# CFLAGS=-O2 -G -Z -m$(MODEL) -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
-CFLAGS=-O2 -G -Z -m$(MODEL)
-CC=tcc -I\tc\include
-LD=tcc -L\tc\lib
-AR=tlib
-LDFLAGS=-m$(MODEL) -f-
-O=.obj
-
-# variables
-OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
-  trees$(O)
-OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
-  trees$(O)
-OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
-  infutil$(O) inffast$(O)
-OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
-  infutil$(O)+inffast$(O)
-
-ZLIB_H = zlib.h zconf.h
-ZUTIL_H = zutil.h $(ZLIB_H)
-
-ZLIB_LIB = zlib_$(MODEL).lib
-
-all: test
-
-adler32.obj: adler32.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-compress.obj: compress.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-crc32.obj: crc32.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-deflate.obj: deflate.c deflate.h $(ZUTIL_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-gzio.obj: gzio.c $(ZUTIL_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-infblock.obj: infblock.c $(ZUTIL_H) infblock.h inftrees.h infcodes.h infutil.h
-	$(CC) -c $(CFLAGS) $*.c
-
-infcodes.obj: infcodes.c $(ZUTIL_H) inftrees.h infutil.h infcodes.h inffast.h
-	$(CC) -c $(CFLAGS) $*.c
-
-inflate.obj: inflate.c $(ZUTIL_H) infblock.h
-	$(CC) -c $(CFLAGS) $*.c
-
-inftrees.obj: inftrees.c $(ZUTIL_H) inftrees.h
-	$(CC) -c $(CFLAGS) $*.c
-
-infutil.obj: infutil.c $(ZUTIL_H) inftrees.h infutil.h
-	$(CC) -c $(CFLAGS) $*.c
-
-inffast.obj: inffast.c $(ZUTIL_H) inftrees.h infutil.h inffast.h
-	$(CC) -c $(CFLAGS) $*.c
-
-trees.obj: trees.c deflate.h $(ZUTIL_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-uncompr.obj: uncompr.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-zutil.obj: zutil.c $(ZUTIL_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-example.obj: example.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-minigzip.obj: minigzip.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-# we must cut the command line to fit in the MS/DOS 128 byte limit:
-$(ZLIB_LIB): $(OBJ1) $(OBJ2)
-	del $(ZLIB_LIB)
-	$(AR) $(ZLIB_LIB) +$(OBJP1)
-	$(AR) $(ZLIB_LIB) +$(OBJP2)
-
-example.exe: example.obj $(ZLIB_LIB)
-	$(LD) $(LDFLAGS) -eexample.exe example.obj $(ZLIB_LIB)
-
-minigzip.exe: minigzip.obj $(ZLIB_LIB)
-	$(LD) $(LDFLAGS) -eminigzip.exe minigzip.obj $(ZLIB_LIB)
-
-test: example.exe minigzip.exe
-	example
-	echo hello world | minigzip | minigzip -d 
-
-#clean:
-#	del *.obj
-#	del *.exe
diff --git a/Lib/zlib/msdos/Makefile.w32 b/Lib/zlib/msdos/Makefile.w32
deleted file mode 100644
index 0a05fa9a4..000000000
--- a/Lib/zlib/msdos/Makefile.w32
+++ /dev/null
@@ -1,97 +0,0 @@
-# Makefile for zlib
-# Microsoft 32-bit Visual C++ 4.0 or later (may work on earlier versions)
-
-# To use, do "nmake /f makefile.w32"
-
-# If you wish to reduce the memory requirements (default 256K for big
-# objects plus a few K), you can add to CFLAGS below: 
-#   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
-# See zconf.h for details about the memory requirements.
-
-# ------------- Microsoft Visual C++ 4.0 and later -------------
-MODEL=
-CFLAGS=-Ox -GA3s -nologo -W3
-CC=cl
-LD=link
-LDFLAGS=
-O=.obj
-
-# variables
-OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
-  trees$(O)
-OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
-  trees$(O)
-OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
-  infutil$(O) inffast$(O)
-OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
-  infutil$(O)+inffast$(O)
-
-all:  zlib.lib example.exe minigzip.exe
-
-adler32.obj: adler32.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-compress.obj: compress.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-crc32.obj: crc32.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-gzio.obj: gzio.c zutil.h zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
-   infcodes.h infutil.h
-  $(CC) -c $(CFLAGS) $*.c
-
-infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
-   infcodes.h inffast.h
-  $(CC) -c $(CFLAGS) $*.c
-
-inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
-  $(CC) -c $(CFLAGS) $*.c
-
-inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
-  $(CC) -c $(CFLAGS) $*.c
-
-infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
-  $(CC) -c $(CFLAGS) $*.c
-
-inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
-  $(CC) -c $(CFLAGS) $*.c
-
-trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-uncompr.obj: uncompr.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-zutil.obj: zutil.c zutil.h zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-example.obj: example.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-minigzip.obj: minigzip.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-zlib.lib: $(OBJ1) $(OBJ2)
-  if exist zlib.lib del zlib.lib
-  lib /OUT:zlib.lib $(OBJ1) $(OBJ2)
-
-example.exe: example.obj zlib.lib
-  $(LD) $(LDFLAGS) example.obj zlib.lib /OUT:example.exe /SUBSYSTEM:CONSOLE
-
-minigzip.exe: minigzip.obj zlib.lib
-  $(LD) $(LDFLAGS) minigzip.obj zlib.lib /OUT:minigzip.exe /SUBSYSTEM:CONSOLE
-
-test: example.exe minigzip.exe
-  example
-  echo hello world | minigzip | minigzip -d 
-
-#clean:
-#  del *.obj
-#  del *.exe
diff --git a/Lib/zlib/msdos/Makefile.wat b/Lib/zlib/msdos/Makefile.wat
deleted file mode 100644
index 44bf8607f..000000000
--- a/Lib/zlib/msdos/Makefile.wat
+++ /dev/null
@@ -1,103 +0,0 @@
-# Makefile for zlib
-# Watcom 10a
-
-# This version of the zlib makefile was adapted by Chris Young for use
-# with Watcom 10a 32-bit protected mode flat memory model.  It was created 
-# for use with POV-Ray ray tracer and you may choose to edit the CFLAGS to 
-# suit your needs but the -DMSDOS is required.
-# -- Chris Young 76702.1655@compuserve.com
-
-# To use, do "wmake -f makefile.wat"
-
-# See zconf.h for details about the memory requirements.
-
-# ------------- Watcom 10a -------------
-MODEL=-mf 
-CFLAGS= $(MODEL) -fpi87 -fp5 -zp4 -5r -w5 -oneatx -DMSDOS
-CC=wcc386
-LD=wcl386
-LIB=wlib -b -c 
-LDFLAGS= 
-O=.obj
-
-# variables
-OBJ1=adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) 
-OBJ2=trees$(O) zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) 
-OBJ3=infutil$(O) inffast$(O)
-OBJP1=adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)
-OBJP2=trees$(O)+zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)
-OBJP3=infutil$(O)+inffast$(O)
-
-all: test
-
-adler32.obj: adler32.c zlib.h zconf.h
-	$(CC) $(CFLAGS) $*.c
-
-compress.obj: compress.c zlib.h zconf.h
-	$(CC) $(CFLAGS) $*.c
-
-crc32.obj: crc32.c zlib.h zconf.h
-	$(CC) $(CFLAGS) $*.c
-
-deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
-	$(CC) $(CFLAGS) $*.c
-
-gzio.obj: gzio.c zutil.h zlib.h zconf.h
-	$(CC) $(CFLAGS) $*.c
-
-infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h &
-  infcodes.h infutil.h
-	$(CC) $(CFLAGS) $*.c
-
-infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h &
-  infcodes.h inffast.h
-	$(CC) $(CFLAGS) $*.c
-
-inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
-	$(CC) $(CFLAGS) $*.c
-
-inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
-	$(CC) $(CFLAGS) $*.c
-
-infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
-	$(CC) $(CFLAGS) $*.c
-
-inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
-	$(CC) $(CFLAGS) $*.c
-
-trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
-	$(CC) $(CFLAGS) $*.c
-
-uncompr.obj: uncompr.c zlib.h zconf.h
-	$(CC) $(CFLAGS) $*.c
-
-zutil.obj: zutil.c zutil.h zlib.h zconf.h
-	$(CC) $(CFLAGS) $*.c
-
-example.obj: example.c zlib.h zconf.h
-	$(CC) $(CFLAGS) $*.c
-
-minigzip.obj: minigzip.c zlib.h zconf.h
-	$(CC) $(CFLAGS) $*.c
-
-# we must cut the command line to fit in the MS/DOS 128 byte limit:
-zlib.lib: $(OBJ1) $(OBJ2) $(OBJ3) 
-	del zlib.lib
-	$(LIB) zlib.lib +$(OBJP1)
-	$(LIB) zlib.lib +$(OBJP2)
-	$(LIB) zlib.lib +$(OBJP3)
-
-example.exe: example.obj zlib.lib
-	$(LD) $(LDFLAGS) example.obj zlib.lib
-
-minigzip.exe: minigzip.obj zlib.lib
-	$(LD) $(LDFLAGS) minigzip.obj zlib.lib
-
-test: minigzip.exe example.exe
-	example
-	echo hello world | minigzip | minigzip -d >test
-	type test
-
-#clean:
-#	del *.obj
-#	del *.exe
diff --git a/Lib/zlib/msdos/zlib.def b/Lib/zlib/msdos/zlib.def
deleted file mode 100644
index 6c04412f9..000000000
--- a/Lib/zlib/msdos/zlib.def
+++ /dev/null
@@ -1,60 +0,0 @@
-LIBRARY		"zlib"
-
-DESCRIPTION	'"""zlib data compression library"""'
-
-EXETYPE		NT
-
-SUBSYSTEM	WINDOWS
-
-STUB		'WINSTUB.EXE'
-
-VERSION		1.13
-
-CODE		 EXECUTE READ
-
-DATA		 READ WRITE
-
-HEAPSIZE	1048576,4096
-
-EXPORTS
-    adler32                        @1
-    compress                       @2
-    crc32                          @3
-    deflate                        @4
-    deflateCopy                    @5
-    deflateEnd                     @6
-    deflateInit2_                  @7
-    deflateInit_                   @8
-    deflateParams                  @9
-    deflateReset                   @10
-    deflateSetDictionary           @11
-    gzclose                        @12
-    gzdopen                        @13
-    gzerror                        @14
-    gzflush                        @15
-    gzopen                         @16
-    gzread                         @17
-    gzwrite                        @18
-    inflate                        @19
-    inflateEnd                     @20
-    inflateInit2_                  @21
-    inflateInit_                   @22
-    inflateReset                   @23
-    inflateSetDictionary           @24
-    inflateSync                    @25
-    uncompress                     @26
-    zlibVersion                    @27
-    gzprintf                       @28
-    gzputc                         @29
-    gzgetc                         @30
-    gzseek                         @31
-    gzrewind                       @32
-    gztell                         @33
-    gzeof                          @34
-    gzsetparams                    @35
-    zError                         @36
-    inflateSyncPoint               @37
-    get_crc_table                  @38
-    compress2                      @39
-    gzputs                         @40
-    gzgets                         @41
diff --git a/Lib/zlib/msdos/zlib.rc b/Lib/zlib/msdos/zlib.rc
deleted file mode 100644
index 556d4ff95..000000000
--- a/Lib/zlib/msdos/zlib.rc
+++ /dev/null
@@ -1,32 +0,0 @@
-#include 
-
-#define IDR_VERSION1  1
-IDR_VERSION1	VERSIONINFO	MOVEABLE IMPURE LOADONCALL DISCARDABLE
-  FILEVERSION	 1,1,3,0
-  PRODUCTVERSION 1,1,3,0
-  FILEFLAGSMASK	VS_FFI_FILEFLAGSMASK
-  FILEFLAGS	0
-  FILEOS	VOS_DOS_WINDOWS32
-  FILETYPE	VFT_DLL
-  FILESUBTYPE	0	// not used
-BEGIN
-  BLOCK "StringFileInfo"
-  BEGIN
-    BLOCK "040904E4"
-    //language ID = U.S. English, char set = Windows, Multilingual
-
-    BEGIN
-      VALUE "FileDescription", "zlib data compression library\0"
-      VALUE "FileVersion",	"1.1.3\0"
-      VALUE "InternalName",	"zlib\0"
-      VALUE "OriginalFilename",	"zlib.dll\0"
-      VALUE "ProductName",	"ZLib.DLL\0"
-      VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
-      VALUE "LegalCopyright", "(C) 1995-1998 Jean-loup Gailly & Mark Adler\0"
-    END
-  END
-  BLOCK "VarFileInfo"
-  BEGIN
-    VALUE "Translation", 0x0409, 1252
-  END
-END
diff --git a/Lib/zlib/nt/Makefile.emx b/Lib/zlib/nt/Makefile.emx
deleted file mode 100644
index 2d475b184..000000000
--- a/Lib/zlib/nt/Makefile.emx
+++ /dev/null
@@ -1,138 +0,0 @@
-# Makefile for zlib.  Modified for emx/rsxnt by Chr. Spieler, 6/16/98.
-# Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile, or to compile and test, type:
-# 
-#   make -fmakefile.emx;  make test -fmakefile.emx
-# 
-
-CC=gcc -Zwin32
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-             -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is available, replace "copy /Y" with "cp -fp" .
-CP=copy /Y
-# If gnu install.exe is available, replace $(CP) with ginstall.
-INSTALL=$(CP)
-# The default value of RM is "rm -f."  If "rm.exe" is found, comment out:
-RM=del
-LDLIBS=-L. -lzlib
-LD=$(CC) -s -o
-LDSHARED=$(CC)
-
-INCL=zlib.h zconf.h
-LIBS=zlib.a
-
-AR=ar rcs
-
-prefix=/usr/local
-exec_prefix = $(prefix)
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-all: example.exe minigzip.exe
-
-test: all
-	./example
-	echo hello world | .\minigzip | .\minigzip -d 
-
-%.o : %.c
-	$(CC) $(CFLAGS) -c $< -o $@
-
-zlib.a: $(OBJS)
-	$(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
-	$(LD) $@ $< $(LDLIBS)
-
-
-.PHONY : clean
-
-clean:
-	$(RM) *.d
-	$(RM) *.o
-	$(RM) *.exe
-	$(RM) zlib.a
-	$(RM) foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
-# Makefile for zlib.  Modified for emx 0.9c by Chr. Spieler, 6/17/98.
-# Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile, or to compile and test, type:
-# 
-#   make -fmakefile.emx;  make test -fmakefile.emx
-# 
-
-CC=gcc
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-             -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is available, replace "copy /Y" with "cp -fp" .
-CP=copy /Y
-# If gnu install.exe is available, replace $(CP) with ginstall.
-INSTALL=$(CP)
-# The default value of RM is "rm -f."  If "rm.exe" is found, comment out:
-RM=del
-LDLIBS=-L. -lzlib
-LD=$(CC) -s -o
-LDSHARED=$(CC)
-
-INCL=zlib.h zconf.h
-LIBS=zlib.a
-
-AR=ar rcs
-
-prefix=/usr/local
-exec_prefix = $(prefix)
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-all: example.exe minigzip.exe
-
-test: all
-	./example
-	echo hello world | .\minigzip | .\minigzip -d 
-
-%.o : %.c
-	$(CC) $(CFLAGS) -c $< -o $@
-
-zlib.a: $(OBJS)
-	$(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
-	$(LD) $@ $< $(LDLIBS)
-
-
-.PHONY : clean
-
-clean:
-	$(RM) *.d
-	$(RM) *.o
-	$(RM) *.exe
-	$(RM) zlib.a
-	$(RM) foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
diff --git a/Lib/zlib/nt/Makefile.gcc b/Lib/zlib/nt/Makefile.gcc
deleted file mode 100644
index cdd652f23..000000000
--- a/Lib/zlib/nt/Makefile.gcc
+++ /dev/null
@@ -1,87 +0,0 @@
-# Makefile for zlib.  Modified for mingw32 by C. Spieler, 6/16/98.
-# (This Makefile is directly derived from Makefile.dj2)
-# Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile, or to compile and test, type:
-# 
-#   make -fmakefile.gcc;  make test -fmakefile.gcc
-# 
-# To install libz.a, zconf.h and zlib.h in the mingw32 directories, type:
-# 
-#    make install -fmakefile.gcc
-# 
-
-CC=gcc
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-             -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is available, replace "copy /Y" with "cp -fp" .
-CP=copy /Y
-# If gnu install.exe is available, replace $(CP) with ginstall.
-INSTALL=$(CP)
-# The default value of RM is "rm -f."  If "rm.exe" is found, comment out:
-RM=del
-LDLIBS=-L. -lz
-LD=$(CC) -s -o
-LDSHARED=$(CC)
-
-INCL=zlib.h zconf.h
-LIBS=libz.a
-
-AR=ar rcs
-
-prefix=/usr/local
-exec_prefix = $(prefix)
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-all: example.exe minigzip.exe
-
-test: all
-	./example
-	echo hello world | .\minigzip | .\minigzip -d 
-
-%.o : %.c
-	$(CC) $(CFLAGS) -c $< -o $@
-
-libz.a: $(OBJS)
-	$(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
-	$(LD) $@ $< $(LDLIBS)
-
-# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env .
-
-.PHONY : uninstall clean
-
-install: $(INCL) $(LIBS)
-	-@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH)
-	-@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH)
-	$(INSTALL) zlib.h $(INCLUDE_PATH)
-	$(INSTALL) zconf.h $(INCLUDE_PATH)
-	$(INSTALL) libz.a $(LIBRARY_PATH)
-
-uninstall:
-	$(RM) $(INCLUDE_PATH)\zlib.h
-	$(RM) $(INCLUDE_PATH)\zconf.h
-	$(RM) $(LIBRARY_PATH)\libz.a
-
-clean:
-	$(RM) *.d
-	$(RM) *.o
-	$(RM) *.exe
-	$(RM) libz.a
-	$(RM) foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
diff --git a/Lib/zlib/nt/Makefile.nt b/Lib/zlib/nt/Makefile.nt
deleted file mode 100644
index b250f2ac7..000000000
--- a/Lib/zlib/nt/Makefile.nt
+++ /dev/null
@@ -1,88 +0,0 @@
-# Makefile for zlib
-
-!include 
-
-CC=cl
-LD=link
-CFLAGS=-O -nologo
-LDFLAGS=
-O=.obj
-
-# variables
-OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
-  trees$(O)
-OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
-  infutil$(O) inffast$(O)
-
-all:  zlib.dll example.exe minigzip.exe
-
-adler32.obj: adler32.c zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-compress.obj: compress.c zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-crc32.obj: crc32.c zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-gzio.obj: gzio.c zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
-   infcodes.h infutil.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
-   infcodes.h inffast.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-uncompr.obj: uncompr.c zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-zutil.obj: zutil.c zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-example.obj: example.c zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-minigzip.obj: minigzip.c zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-zlib.dll: $(OBJ1) $(OBJ2) zlib.dnt
-	link $(dlllflags) -out:$@ -def:zlib.dnt $(OBJ1) $(OBJ2) $(guilibsdll)
-
-zlib.lib: zlib.dll
-
-example.exe: example.obj zlib.lib
-	$(LD) $(LDFLAGS) example.obj zlib.lib
-
-minigzip.exe: minigzip.obj zlib.lib
-	$(LD) $(LDFLAGS) minigzip.obj zlib.lib
-
-test: example.exe minigzip.exe
-	example
-	echo hello world | minigzip | minigzip -d 
-
-clean:
-	del *.obj
-	del *.exe
-	del *.dll
-	del *.lib
diff --git a/Lib/zlib/nt/zlib.dnt b/Lib/zlib/nt/zlib.dnt
deleted file mode 100644
index 7f9475cfb..000000000
--- a/Lib/zlib/nt/zlib.dnt
+++ /dev/null
@@ -1,47 +0,0 @@
-LIBRARY		zlib.dll
-EXETYPE WINDOWS
-CODE		 PRELOAD MOVEABLE DISCARDABLE
-DATA		 PRELOAD MOVEABLE MULTIPLE
-
-EXPORTS
-    adler32                        @1
-    compress                       @2
-    crc32                          @3
-    deflate                        @4
-    deflateCopy                    @5
-    deflateEnd                     @6
-    deflateInit2_                  @7
-    deflateInit_                   @8
-    deflateParams                  @9
-    deflateReset                   @10
-    deflateSetDictionary           @11
-    gzclose                        @12
-    gzdopen                        @13
-    gzerror                        @14
-    gzflush                        @15
-    gzopen                         @16
-    gzread                         @17
-    gzwrite                        @18
-    inflate                        @19
-    inflateEnd                     @20
-    inflateInit2_                  @21
-    inflateInit_                   @22
-    inflateReset                   @23
-    inflateSetDictionary           @24
-    inflateSync                    @25
-    uncompress                     @26
-    zlibVersion                    @27
-    gzprintf                       @28
-    gzputc                         @29
-    gzgetc                         @30
-    gzseek                         @31
-    gzrewind                       @32
-    gztell                         @33
-    gzeof                          @34
-    gzsetparams                    @35
-    zError                         @36
-    inflateSyncPoint               @37
-    get_crc_table                  @38
-    compress2                      @39
-    gzputs                         @40
-    gzgets                         @41
diff --git a/Lib/zlib/os2/Makefile.os2 b/Lib/zlib/os2/Makefile.os2
deleted file mode 100644
index 4f569471e..000000000
--- a/Lib/zlib/os2/Makefile.os2
+++ /dev/null
@@ -1,136 +0,0 @@
-# Makefile for zlib under OS/2 using GCC (PGCC)
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile and test, type:
-#   cp Makefile.os2 ..
-#   cd ..
-#   make -f Makefile.os2 test
-
-# This makefile will build a static library z.lib, a shared library
-# z.dll and a import library zdll.lib. You can use either z.lib or
-# zdll.lib by specifying either -lz or -lzdll on gcc's command line
-
-CC=gcc -Zomf -s
-
-CFLAGS=-O6 -Wall
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-g -DDEBUG
-#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-#           -Wstrict-prototypes -Wmissing-prototypes
-
-#################### BUG WARNING: #####################
-## infcodes.c hits a bug in pgcc-1.0, so you have to use either
-## -O# where # <= 4 or one of (-fno-ommit-frame-pointer or -fno-force-mem)
-## This bug is reportedly fixed in pgcc >1.0, but this was not tested
-CFLAGS+=-fno-force-mem
-
-LDFLAGS=-s -L. -lzdll -Zcrtdll
-LDSHARED=$(CC) -s -Zomf -Zdll -Zcrtdll
-
-VER=1.1.0
-ZLIB=z.lib
-SHAREDLIB=z.dll
-SHAREDLIBIMP=zdll.lib
-LIBS=$(ZLIB) $(SHAREDLIB) $(SHAREDLIBIMP)
-
-AR=emxomfar cr
-IMPLIB=emximp
-RANLIB=echo
-TAR=tar
-SHELL=bash
-
-prefix=/usr/local
-exec_prefix = $(prefix)
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] *.[ch] descrip.mms \
-  algorithm.txt zlib.3 msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
-  nt/Makefile.nt nt/zlib.dnt  contrib/README.contrib contrib/*.txt \
-  contrib/asm386/*.asm contrib/asm386/*.c \
-  contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/iostream/*.cpp \
-  contrib/iostream/*.h  contrib/iostream2/*.h contrib/iostream2/*.cpp \
-  contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32
-
-all: example.exe minigzip.exe
-
-test: all
-	@LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
-	echo hello world | ./minigzip | ./minigzip -d || \
-	  echo '		*** minigzip test FAILED ***' ; \
-	if ./example; then \
-	  echo '		*** zlib test OK ***'; \
-	else \
-	  echo '		*** zlib test FAILED ***'; \
-	fi
-
-$(ZLIB): $(OBJS)
-	$(AR) $@ $(OBJS)
-	-@ ($(RANLIB) $@ || true) >/dev/null 2>&1
-
-$(SHAREDLIB): $(OBJS) os2/z.def
-	$(LDSHARED) -o $@ $^
-
-$(SHAREDLIBIMP): os2/z.def
-	$(IMPLIB) -o $@ $^
-
-example.exe: example.o $(LIBS)
-	$(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
-
-minigzip.exe: minigzip.o $(LIBS)
-	$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
-
-clean:
-	rm -f *.o *~ example minigzip libz.a libz.so* foo.gz
-
-distclean:	clean
-
-zip:
-	mv Makefile Makefile~; cp -p Makefile.in Makefile
-	rm -f test.c ztest*.c
-	v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
-	zip -ul9 zlib$$v $(DISTFILES)
-	mv Makefile~ Makefile
-
-dist:
-	mv Makefile Makefile~; cp -p Makefile.in Makefile
-	rm -f test.c ztest*.c
-	d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
-	rm -f $$d.tar.gz; \
-	if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \
-	files=""; \
-	for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \
-	cd ..; \
-	GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \
-	if test ! -d $$d; then rm -f $$d; fi
-	mv Makefile~ Makefile
-
-tags:	
-	etags *.[ch]
-
-depend:
-	makedepend -- $(CFLAGS) -- *.[ch]
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
-
-adler32.o: zlib.h zconf.h
-compress.o: zlib.h zconf.h
-crc32.o: zlib.h zconf.h
-deflate.o: deflate.h zutil.h zlib.h zconf.h
-example.o: zlib.h zconf.h
-gzio.o: zutil.h zlib.h zconf.h
-infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h
-infcodes.o: zutil.h zlib.h zconf.h
-infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h
-inffast.o: zutil.h zlib.h zconf.h inftrees.h
-inffast.o: infblock.h infcodes.h infutil.h inffast.h
-inflate.o: zutil.h zlib.h zconf.h infblock.h
-inftrees.o: zutil.h zlib.h zconf.h inftrees.h
-infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
-minigzip.o:  zlib.h zconf.h 
-trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
-uncompr.o: zlib.h zconf.h
-zutil.o: zutil.h zlib.h zconf.h  
diff --git a/Lib/zlib/os2/zlib.def b/Lib/zlib/os2/zlib.def
deleted file mode 100644
index 4c753f1a3..000000000
--- a/Lib/zlib/os2/zlib.def
+++ /dev/null
@@ -1,51 +0,0 @@
-;
-; Slightly modified version of ../nt/zlib.dnt :-)
-;
-
-LIBRARY		Z
-DESCRIPTION	"Zlib compression library for OS/2"
-CODE		PRELOAD MOVEABLE DISCARDABLE
-DATA		PRELOAD MOVEABLE MULTIPLE
-
-EXPORTS
-    adler32
-    compress
-    crc32
-    deflate
-    deflateCopy
-    deflateEnd
-    deflateInit2_
-    deflateInit_
-    deflateParams
-    deflateReset
-    deflateSetDictionary
-    gzclose
-    gzdopen
-    gzerror
-    gzflush
-    gzopen
-    gzread
-    gzwrite
-    inflate
-    inflateEnd
-    inflateInit2_
-    inflateInit_
-    inflateReset
-    inflateSetDictionary
-    inflateSync
-    uncompress
-    zlibVersion
-    gzprintf
-    gzputc
-    gzgetc
-    gzseek
-    gzrewind
-    gztell
-    gzeof
-    gzsetparams
-    zError
-    inflateSyncPoint
-    get_crc_table
-    compress2
-    gzputs
-    gzgets
diff --git a/Lib/zlib/trees.c b/Lib/zlib/trees.c
deleted file mode 100644
index f01fb30d8..000000000
--- a/Lib/zlib/trees.c
+++ /dev/null
@@ -1,1214 +0,0 @@
-/* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-1998 Jean-loup Gailly
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/*
- *  ALGORITHM
- *
- *      The "deflation" process uses several Huffman trees. The more
- *      common source values are represented by shorter bit sequences.
- *
- *      Each code tree is stored in a compressed form which is itself
- * a Huffman encoding of the lengths of all the code strings (in
- * ascending order by source values).  The actual code strings are
- * reconstructed from the lengths in the inflate process, as described
- * in the deflate specification.
- *
- *  REFERENCES
- *
- *      Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
- *      Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
- *
- *      Storer, James A.
- *          Data Compression:  Methods and Theory, pp. 49-50.
- *          Computer Science Press, 1988.  ISBN 0-7167-8156-5.
- *
- *      Sedgewick, R.
- *          Algorithms, p290.
- *          Addison-Wesley, 1983. ISBN 0-201-06672-6.
- */
-
-/* @(#) $Id$ */
-
-/* #define GEN_TREES_H */
-
-#include "deflate.h"
-
-#ifdef DEBUG
-#  include 
-#endif
-
-/* ===========================================================================
- * Constants
- */
-
-#define MAX_BL_BITS 7
-/* Bit length codes must not exceed MAX_BL_BITS bits */
-
-#define END_BLOCK 256
-/* end of block literal code */
-
-#define REP_3_6      16
-/* repeat previous bit length 3-6 times (2 bits of repeat count) */
-
-#define REPZ_3_10    17
-/* repeat a zero length 3-10 times  (3 bits of repeat count) */
-
-#define REPZ_11_138  18
-/* repeat a zero length 11-138 times  (7 bits of repeat count) */
-
-local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
-   = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
-
-local const int extra_dbits[D_CODES] /* extra bits for each distance code */
-   = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
-
-local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
-   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
-
-local const uch bl_order[BL_CODES]
-   = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
-/* The lengths of the bit length codes are sent in order of decreasing
- * probability, to avoid transmitting the lengths for unused bit length codes.
- */
-
-#define Buf_size (8 * 2*sizeof(char))
-/* Number of bits used within bi_buf. (bi_buf might be implemented on
- * more than 16 bits on some systems.)
- */
-
-/* ===========================================================================
- * Local data. These are initialized only once.
- */
-
-#define DIST_CODE_LEN  512 /* see definition of array dist_code below */
-
-#if defined(GEN_TREES_H) || !defined(STDC)
-/* non ANSI compilers may not accept trees.h */
-
-local ct_data static_ltree[L_CODES+2];
-/* The static literal tree. Since the bit lengths are imposed, there is no
- * need for the L_CODES extra codes used during heap construction. However
- * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
- * below).
- */
-
-local ct_data static_dtree[D_CODES];
-/* The static distance tree. (Actually a trivial tree since all codes use
- * 5 bits.)
- */
-
-uch _dist_code[DIST_CODE_LEN];
-/* Distance codes. The first 256 values correspond to the distances
- * 3 .. 258, the last 256 values correspond to the top 8 bits of
- * the 15 bit distances.
- */
-
-uch _length_code[MAX_MATCH-MIN_MATCH+1];
-/* length code for each normalized match length (0 == MIN_MATCH) */
-
-local int base_length[LENGTH_CODES];
-/* First normalized length for each code (0 = MIN_MATCH) */
-
-local int base_dist[D_CODES];
-/* First normalized distance for each code (0 = distance of 1) */
-
-#else
-#  include "trees.h"
-#endif /* GEN_TREES_H */
-
-struct static_tree_desc_s {
-    const ct_data *static_tree;  /* static tree or NULL */
-    const intf *extra_bits;      /* extra bits for each code or NULL */
-    int     extra_base;          /* base index for extra_bits */
-    int     elems;               /* max number of elements in the tree */
-    int     max_length;          /* max bit length for the codes */
-};
-
-local static_tree_desc  static_l_desc =
-{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
-
-local static_tree_desc  static_d_desc =
-{static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS};
-
-local static_tree_desc  static_bl_desc =
-{(const ct_data *)0, extra_blbits, 0,   BL_CODES, MAX_BL_BITS};
-
-/* ===========================================================================
- * Local (static) routines in this file.
- */
-
-local void tr_static_init OF((void));
-local void init_block     OF((deflate_state *s));
-local void pqdownheap     OF((deflate_state *s, ct_data *tree, int k));
-local void gen_bitlen     OF((deflate_state *s, tree_desc *desc));
-local void gen_codes      OF((ct_data *tree, int max_code, ushf *bl_count));
-local void build_tree     OF((deflate_state *s, tree_desc *desc));
-local void scan_tree      OF((deflate_state *s, ct_data *tree, int max_code));
-local void send_tree      OF((deflate_state *s, ct_data *tree, int max_code));
-local int  build_bl_tree  OF((deflate_state *s));
-local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
-                              int blcodes));
-local void compress_block OF((deflate_state *s, ct_data *ltree,
-                              ct_data *dtree));
-local void set_data_type  OF((deflate_state *s));
-local unsigned bi_reverse OF((unsigned value, int length));
-local void bi_windup      OF((deflate_state *s));
-local void bi_flush       OF((deflate_state *s));
-local void copy_block     OF((deflate_state *s, charf *buf, unsigned len,
-                              int header));
-
-#ifdef GEN_TREES_H
-local void gen_trees_header OF((void));
-#endif
-
-#ifndef DEBUG
-#  define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
-   /* Send a code of the given tree. c and tree must not have side effects */
-
-#else /* DEBUG */
-#  define send_code(s, c, tree) \
-     { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
-       send_bits(s, tree[c].Code, tree[c].Len); }
-#endif
-
-/* ===========================================================================
- * Output a short LSB first on the stream.
- * IN assertion: there is enough room in pendingBuf.
- */
-#define put_short(s, w) { \
-    put_byte(s, (uch)((w) & 0xff)); \
-    put_byte(s, (uch)((ush)(w) >> 8)); \
-}
-
-/* ===========================================================================
- * Send a value on a given number of bits.
- * IN assertion: length <= 16 and value fits in length bits.
- */
-#ifdef DEBUG
-local void send_bits      OF((deflate_state *s, int value, int length));
-
-local void send_bits(s, value, length)
-    deflate_state *s;
-    int value;  /* value to send */
-    int length; /* number of bits */
-{
-    Tracevv((stderr," l %2d v %4x ", length, value));
-    Assert(length > 0 && length <= 15, "invalid length");
-    s->bits_sent += (ulg)length;
-
-    /* If not enough room in bi_buf, use (valid) bits from bi_buf and
-     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
-     * unused bits in value.
-     */
-    if (s->bi_valid > (int)Buf_size - length) {
-        s->bi_buf |= (value << s->bi_valid);
-        put_short(s, s->bi_buf);
-        s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
-        s->bi_valid += length - Buf_size;
-    } else {
-        s->bi_buf |= value << s->bi_valid;
-        s->bi_valid += length;
-    }
-}
-#else /* !DEBUG */
-
-#define send_bits(s, value, length) \
-{ int len = length;\
-  if (s->bi_valid > (int)Buf_size - len) {\
-    int val = value;\
-    s->bi_buf |= (val << s->bi_valid);\
-    put_short(s, s->bi_buf);\
-    s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
-    s->bi_valid += len - Buf_size;\
-  } else {\
-    s->bi_buf |= (value) << s->bi_valid;\
-    s->bi_valid += len;\
-  }\
-}
-#endif /* DEBUG */
-
-
-#define MAX(a,b) (a >= b ? a : b)
-/* the arguments must not have side effects */
-
-/* ===========================================================================
- * Initialize the various 'constant' tables.
- */
-local void tr_static_init()
-{
-#if defined(GEN_TREES_H) || !defined(STDC)
-    static int static_init_done = 0;
-    int n;        /* iterates over tree elements */
-    int bits;     /* bit counter */
-    int length;   /* length value */
-    int code;     /* code value */
-    int dist;     /* distance index */
-    ush bl_count[MAX_BITS+1];
-    /* number of codes at each bit length for an optimal tree */
-
-    if (static_init_done) return;
-
-    /* For some embedded targets, global variables are not initialized: */
-    static_l_desc.static_tree = static_ltree;
-    static_l_desc.extra_bits = extra_lbits;
-    static_d_desc.static_tree = static_dtree;
-    static_d_desc.extra_bits = extra_dbits;
-    static_bl_desc.extra_bits = extra_blbits;
-
-    /* Initialize the mapping length (0..255) -> length code (0..28) */
-    length = 0;
-    for (code = 0; code < LENGTH_CODES-1; code++) {
-        base_length[code] = length;
-        for (n = 0; n < (1< dist code (0..29) */
-    dist = 0;
-    for (code = 0 ; code < 16; code++) {
-        base_dist[code] = dist;
-        for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */
-    for ( ; code < D_CODES; code++) {
-        base_dist[code] = dist << 7;
-        for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
-            _dist_code[256 + dist++] = (uch)code;
-        }
-    }
-    Assert (dist == 256, "tr_static_init: 256+dist != 512");
-
-    /* Construct the codes of the static literal tree */
-    for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
-    n = 0;
-    while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
-    while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
-    while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
-    while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
-    /* Codes 286 and 287 do not exist, but we must include them in the
-     * tree construction to get a canonical Huffman tree (longest code
-     * all ones)
-     */
-    gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
-
-    /* The static distance tree is trivial: */
-    for (n = 0; n < D_CODES; n++) {
-        static_dtree[n].Len = 5;
-        static_dtree[n].Code = bi_reverse((unsigned)n, 5);
-    }
-    static_init_done = 1;
-
-#  ifdef GEN_TREES_H
-    gen_trees_header();
-#  endif
-#endif /* defined(GEN_TREES_H) || !defined(STDC) */
-}
-
-/* ===========================================================================
- * Genererate the file trees.h describing the static trees.
- */
-#ifdef GEN_TREES_H
-#  ifndef DEBUG
-#    include 
-#  endif
-
-#  define SEPARATOR(i, last, width) \
-      ((i) == (last)? "\n};\n\n" :    \
-       ((i) % (width) == (width)-1 ? ",\n" : ", "))
-
-void gen_trees_header()
-{
-    FILE *header = fopen("trees.h", "w");
-    int i;
-
-    Assert (header != NULL, "Can't open trees.h");
-    fprintf(header,
-	    "/* header created automatically with -DGEN_TREES_H */\n\n");
-
-    fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
-    for (i = 0; i < L_CODES+2; i++) {
-	fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
-		static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
-    }
-
-    fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
-    for (i = 0; i < D_CODES; i++) {
-	fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
-		static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
-    }
-
-    fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n");
-    for (i = 0; i < DIST_CODE_LEN; i++) {
-	fprintf(header, "%2u%s", _dist_code[i],
-		SEPARATOR(i, DIST_CODE_LEN-1, 20));
-    }
-
-    fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
-    for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
-	fprintf(header, "%2u%s", _length_code[i],
-		SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
-    }
-
-    fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
-    for (i = 0; i < LENGTH_CODES; i++) {
-	fprintf(header, "%1u%s", base_length[i],
-		SEPARATOR(i, LENGTH_CODES-1, 20));
-    }
-
-    fprintf(header, "local const int base_dist[D_CODES] = {\n");
-    for (i = 0; i < D_CODES; i++) {
-	fprintf(header, "%5u%s", base_dist[i],
-		SEPARATOR(i, D_CODES-1, 10));
-    }
-
-    fclose(header);
-}
-#endif /* GEN_TREES_H */
-
-/* ===========================================================================
- * Initialize the tree data structures for a new zlib stream.
- */
-void _tr_init(s)
-    deflate_state *s;
-{
-    tr_static_init();
-
-    s->l_desc.dyn_tree = s->dyn_ltree;
-    s->l_desc.stat_desc = &static_l_desc;
-
-    s->d_desc.dyn_tree = s->dyn_dtree;
-    s->d_desc.stat_desc = &static_d_desc;
-
-    s->bl_desc.dyn_tree = s->bl_tree;
-    s->bl_desc.stat_desc = &static_bl_desc;
-
-    s->bi_buf = 0;
-    s->bi_valid = 0;
-    s->last_eob_len = 8; /* enough lookahead for inflate */
-#ifdef DEBUG
-    s->compressed_len = 0L;
-    s->bits_sent = 0L;
-#endif
-
-    /* Initialize the first block of the first file: */
-    init_block(s);
-}
-
-/* ===========================================================================
- * Initialize a new block.
- */
-local void init_block(s)
-    deflate_state *s;
-{
-    int n; /* iterates over tree elements */
-
-    /* Initialize the trees. */
-    for (n = 0; n < L_CODES;  n++) s->dyn_ltree[n].Freq = 0;
-    for (n = 0; n < D_CODES;  n++) s->dyn_dtree[n].Freq = 0;
-    for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
-
-    s->dyn_ltree[END_BLOCK].Freq = 1;
-    s->opt_len = s->static_len = 0L;
-    s->last_lit = s->matches = 0;
-}
-
-#define SMALLEST 1
-/* Index within the heap array of least frequent node in the Huffman tree */
-
-
-/* ===========================================================================
- * Remove the smallest element from the heap and recreate the heap with
- * one less element. Updates heap and heap_len.
- */
-#define pqremove(s, tree, top) \
-{\
-    top = s->heap[SMALLEST]; \
-    s->heap[SMALLEST] = s->heap[s->heap_len--]; \
-    pqdownheap(s, tree, SMALLEST); \
-}
-
-/* ===========================================================================
- * Compares to subtrees, using the tree depth as tie breaker when
- * the subtrees have equal frequency. This minimizes the worst case length.
- */
-#define smaller(tree, n, m, depth) \
-   (tree[n].Freq < tree[m].Freq || \
-   (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
-
-/* ===========================================================================
- * Restore the heap property by moving down the tree starting at node k,
- * exchanging a node with the smallest of its two sons if necessary, stopping
- * when the heap property is re-established (each father smaller than its
- * two sons).
- */
-local void pqdownheap(s, tree, k)
-    deflate_state *s;
-    ct_data *tree;  /* the tree to restore */
-    int k;               /* node to move down */
-{
-    int v = s->heap[k];
-    int j = k << 1;  /* left son of k */
-    while (j <= s->heap_len) {
-        /* Set j to the smallest of the two sons: */
-        if (j < s->heap_len &&
-            smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
-            j++;
-        }
-        /* Exit if v is smaller than both sons */
-        if (smaller(tree, v, s->heap[j], s->depth)) break;
-
-        /* Exchange v with the smallest son */
-        s->heap[k] = s->heap[j];  k = j;
-
-        /* And continue down the tree, setting j to the left son of k */
-        j <<= 1;
-    }
-    s->heap[k] = v;
-}
-
-/* ===========================================================================
- * Compute the optimal bit lengths for a tree and update the total bit length
- * for the current block.
- * IN assertion: the fields freq and dad are set, heap[heap_max] and
- *    above are the tree nodes sorted by increasing frequency.
- * OUT assertions: the field len is set to the optimal bit length, the
- *     array bl_count contains the frequencies for each bit length.
- *     The length opt_len is updated; static_len is also updated if stree is
- *     not null.
- */
-local void gen_bitlen(s, desc)
-    deflate_state *s;
-    tree_desc *desc;    /* the tree descriptor */
-{
-    ct_data *tree        = desc->dyn_tree;
-    int max_code         = desc->max_code;
-    const ct_data *stree = desc->stat_desc->static_tree;
-    const intf *extra    = desc->stat_desc->extra_bits;
-    int base             = desc->stat_desc->extra_base;
-    int max_length       = desc->stat_desc->max_length;
-    int h;              /* heap index */
-    int n, m;           /* iterate over the tree elements */
-    int bits;           /* bit length */
-    int xbits;          /* extra bits */
-    ush f;              /* frequency */
-    int overflow = 0;   /* number of elements with bit length too large */
-
-    for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
-
-    /* In a first pass, compute the optimal bit lengths (which may
-     * overflow in the case of the bit length tree).
-     */
-    tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
-
-    for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
-        n = s->heap[h];
-        bits = tree[tree[n].Dad].Len + 1;
-        if (bits > max_length) bits = max_length, overflow++;
-        tree[n].Len = (ush)bits;
-        /* We overwrite tree[n].Dad which is no longer needed */
-
-        if (n > max_code) continue; /* not a leaf node */
-
-        s->bl_count[bits]++;
-        xbits = 0;
-        if (n >= base) xbits = extra[n-base];
-        f = tree[n].Freq;
-        s->opt_len += (ulg)f * (bits + xbits);
-        if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);
-    }
-    if (overflow == 0) return;
-
-    Trace((stderr,"\nbit length overflow\n"));
-    /* This happens for example on obj2 and pic of the Calgary corpus */
-
-    /* Find the first bit length which could increase: */
-    do {
-        bits = max_length-1;
-        while (s->bl_count[bits] == 0) bits--;
-        s->bl_count[bits]--;      /* move one leaf down the tree */
-        s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
-        s->bl_count[max_length]--;
-        /* The brother of the overflow item also moves one step up,
-         * but this does not affect bl_count[max_length]
-         */
-        overflow -= 2;
-    } while (overflow > 0);
-
-    /* Now recompute all bit lengths, scanning in increasing frequency.
-     * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
-     * lengths instead of fixing only the wrong ones. This idea is taken
-     * from 'ar' written by Haruhiko Okumura.)
-     */
-    for (bits = max_length; bits != 0; bits--) {
-        n = s->bl_count[bits];
-        while (n != 0) {
-            m = s->heap[--h];
-            if (m > max_code) continue;
-            if (tree[m].Len != (unsigned) bits) {
-                Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
-                s->opt_len += ((long)bits - (long)tree[m].Len)
-                              *(long)tree[m].Freq;
-                tree[m].Len = (ush)bits;
-            }
-            n--;
-        }
-    }
-}
-
-/* ===========================================================================
- * Generate the codes for a given tree and bit counts (which need not be
- * optimal).
- * IN assertion: the array bl_count contains the bit length statistics for
- * the given tree and the field len is set for all tree elements.
- * OUT assertion: the field code is set for all tree elements of non
- *     zero code length.
- */
-local void gen_codes (tree, max_code, bl_count)
-    ct_data *tree;             /* the tree to decorate */
-    int max_code;              /* largest code with non zero frequency */
-    ushf *bl_count;            /* number of codes at each bit length */
-{
-    ush next_code[MAX_BITS+1]; /* next code value for each bit length */
-    ush code = 0;              /* running code value */
-    int bits;                  /* bit index */
-    int n;                     /* code index */
-
-    /* The distribution counts are first used to generate the code values
-     * without bit reversal.
-     */
-    for (bits = 1; bits <= MAX_BITS; bits++) {
-        next_code[bits] = code = (code + bl_count[bits-1]) << 1;
-    }
-    /* Check that the bit counts in bl_count are consistent. The last code
-     * must be all ones.
-     */
-    Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree;
-    const ct_data *stree  = desc->stat_desc->static_tree;
-    int elems             = desc->stat_desc->elems;
-    int n, m;          /* iterate over heap elements */
-    int max_code = -1; /* largest code with non zero frequency */
-    int node;          /* new node being created */
-
-    /* Construct the initial heap, with least frequent element in
-     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
-     * heap[0] is not used.
-     */
-    s->heap_len = 0, s->heap_max = HEAP_SIZE;
-
-    for (n = 0; n < elems; n++) {
-        if (tree[n].Freq != 0) {
-            s->heap[++(s->heap_len)] = max_code = n;
-            s->depth[n] = 0;
-        } else {
-            tree[n].Len = 0;
-        }
-    }
-
-    /* The pkzip format requires that at least one distance code exists,
-     * and that at least one bit should be sent even if there is only one
-     * possible code. So to avoid special checks later on we force at least
-     * two codes of non zero frequency.
-     */
-    while (s->heap_len < 2) {
-        node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
-        tree[node].Freq = 1;
-        s->depth[node] = 0;
-        s->opt_len--; if (stree) s->static_len -= stree[node].Len;
-        /* node is 0 or 1 so it does not have extra bits */
-    }
-    desc->max_code = max_code;
-
-    /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
-     * establish sub-heaps of increasing lengths:
-     */
-    for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
-
-    /* Construct the Huffman tree by repeatedly combining the least two
-     * frequent nodes.
-     */
-    node = elems;              /* next internal node of the tree */
-    do {
-        pqremove(s, tree, n);  /* n = node of least frequency */
-        m = s->heap[SMALLEST]; /* m = node of next least frequency */
-
-        s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
-        s->heap[--(s->heap_max)] = m;
-
-        /* Create a new node father of n and m */
-        tree[node].Freq = tree[n].Freq + tree[m].Freq;
-        s->depth[node] = (uch) (MAX(s->depth[n], s->depth[m]) + 1);
-        tree[n].Dad = tree[m].Dad = (ush)node;
-#ifdef DUMP_BL_TREE
-        if (tree == s->bl_tree) {
-            fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
-                    node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
-        }
-#endif
-        /* and insert the new node in the heap */
-        s->heap[SMALLEST] = node++;
-        pqdownheap(s, tree, SMALLEST);
-
-    } while (s->heap_len >= 2);
-
-    s->heap[--(s->heap_max)] = s->heap[SMALLEST];
-
-    /* At this point, the fields freq and dad are set. We can now
-     * generate the bit lengths.
-     */
-    gen_bitlen(s, (tree_desc *)desc);
-
-    /* The field len is now set, we can generate the bit codes */
-    gen_codes ((ct_data *)tree, max_code, s->bl_count);
-}
-
-/* ===========================================================================
- * Scan a literal or distance tree to determine the frequencies of the codes
- * in the bit length tree.
- */
-local void scan_tree (s, tree, max_code)
-    deflate_state *s;
-    ct_data *tree;   /* the tree to be scanned */
-    int max_code;    /* and its largest code of non zero frequency */
-{
-    int n;                     /* iterates over all tree elements */
-    int prevlen = -1;          /* last emitted length */
-    int curlen;                /* length of current code */
-    int nextlen = tree[0].Len; /* length of next code */
-    int count = 0;             /* repeat count of the current code */
-    int max_count = 7;         /* max repeat count */
-    int min_count = 4;         /* min repeat count */
-
-    if (nextlen == 0) max_count = 138, min_count = 3;
-    tree[max_code+1].Len = (ush)0xffff; /* guard */
-
-    for (n = 0; n <= max_code; n++) {
-        curlen = nextlen; nextlen = tree[n+1].Len;
-        if (++count < max_count && curlen == nextlen) {
-            continue;
-        } else if (count < min_count) {
-            s->bl_tree[curlen].Freq += count;
-        } else if (curlen != 0) {
-            if (curlen != prevlen) s->bl_tree[curlen].Freq++;
-            s->bl_tree[REP_3_6].Freq++;
-        } else if (count <= 10) {
-            s->bl_tree[REPZ_3_10].Freq++;
-        } else {
-            s->bl_tree[REPZ_11_138].Freq++;
-        }
-        count = 0; prevlen = curlen;
-        if (nextlen == 0) {
-            max_count = 138, min_count = 3;
-        } else if (curlen == nextlen) {
-            max_count = 6, min_count = 3;
-        } else {
-            max_count = 7, min_count = 4;
-        }
-    }
-}
-
-/* ===========================================================================
- * Send a literal or distance tree in compressed form, using the codes in
- * bl_tree.
- */
-local void send_tree (s, tree, max_code)
-    deflate_state *s;
-    ct_data *tree; /* the tree to be scanned */
-    int max_code;       /* and its largest code of non zero frequency */
-{
-    int n;                     /* iterates over all tree elements */
-    int prevlen = -1;          /* last emitted length */
-    int curlen;                /* length of current code */
-    int nextlen = tree[0].Len; /* length of next code */
-    int count = 0;             /* repeat count of the current code */
-    int max_count = 7;         /* max repeat count */
-    int min_count = 4;         /* min repeat count */
-
-    /* tree[max_code+1].Len = -1; */  /* guard already set */
-    if (nextlen == 0) max_count = 138, min_count = 3;
-
-    for (n = 0; n <= max_code; n++) {
-        curlen = nextlen; nextlen = tree[n+1].Len;
-        if (++count < max_count && curlen == nextlen) {
-            continue;
-        } else if (count < min_count) {
-            do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
-
-        } else if (curlen != 0) {
-            if (curlen != prevlen) {
-                send_code(s, curlen, s->bl_tree); count--;
-            }
-            Assert(count >= 3 && count <= 6, " 3_6?");
-            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
-
-        } else if (count <= 10) {
-            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
-
-        } else {
-            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
-        }
-        count = 0; prevlen = curlen;
-        if (nextlen == 0) {
-            max_count = 138, min_count = 3;
-        } else if (curlen == nextlen) {
-            max_count = 6, min_count = 3;
-        } else {
-            max_count = 7, min_count = 4;
-        }
-    }
-}
-
-/* ===========================================================================
- * Construct the Huffman tree for the bit lengths and return the index in
- * bl_order of the last bit length code to send.
- */
-local int build_bl_tree(s)
-    deflate_state *s;
-{
-    int max_blindex;  /* index of last bit length code of non zero freq */
-
-    /* Determine the bit length frequencies for literal and distance trees */
-    scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
-    scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
-
-    /* Build the bit length tree: */
-    build_tree(s, (tree_desc *)(&(s->bl_desc)));
-    /* opt_len now includes the length of the tree representations, except
-     * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
-     */
-
-    /* Determine the number of bit length codes to send. The pkzip format
-     * requires that at least 4 bit length codes be sent. (appnote.txt says
-     * 3 but the actual value used is 4.)
-     */
-    for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
-        if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
-    }
-    /* Update opt_len to include the bit length tree and counts */
-    s->opt_len += 3*(max_blindex+1) + 5+5+4;
-    Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
-            s->opt_len, s->static_len));
-
-    return max_blindex;
-}
-
-/* ===========================================================================
- * Send the header for a block using dynamic Huffman trees: the counts, the
- * lengths of the bit length codes, the literal tree and the distance tree.
- * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
- */
-local void send_all_trees(s, lcodes, dcodes, blcodes)
-    deflate_state *s;
-    int lcodes, dcodes, blcodes; /* number of codes for each tree */
-{
-    int rank;                    /* index in bl_order */
-
-    Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
-    Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
-            "too many codes");
-    Tracev((stderr, "\nbl counts: "));
-    send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
-    send_bits(s, dcodes-1,   5);
-    send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */
-    for (rank = 0; rank < blcodes; rank++) {
-        Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
-        send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
-    }
-    Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
-
-    send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
-    Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
-
-    send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
-    Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
-}
-
-/* ===========================================================================
- * Send a stored block
- */
-void _tr_stored_block(s, buf, stored_len, eof)
-    deflate_state *s;
-    charf *buf;       /* input block */
-    ulg stored_len;   /* length of input block */
-    int eof;          /* true if this is the last block for a file */
-{
-    send_bits(s, (STORED_BLOCK<<1)+eof, 3);  /* send block type */
-#ifdef DEBUG
-    s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
-    s->compressed_len += (stored_len + 4) << 3;
-#endif
-    copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
-}
-
-/* ===========================================================================
- * Send one empty static block to give enough lookahead for inflate.
- * This takes 10 bits, of which 7 may remain in the bit buffer.
- * The current inflate code requires 9 bits of lookahead. If the
- * last two codes for the previous block (real code plus EOB) were coded
- * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
- * the last real code. In this case we send two empty static blocks instead
- * of one. (There are no problems if the previous block is stored or fixed.)
- * To simplify the code, we assume the worst case of last real code encoded
- * on one bit only.
- */
-void _tr_align(s)
-    deflate_state *s;
-{
-    send_bits(s, STATIC_TREES<<1, 3);
-    send_code(s, END_BLOCK, static_ltree);
-#ifdef DEBUG
-    s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
-#endif
-    bi_flush(s);
-    /* Of the 10 bits for the empty block, we have already sent
-     * (10 - bi_valid) bits. The lookahead for the last real code (before
-     * the EOB of the previous block) was thus at least one plus the length
-     * of the EOB plus what we have just sent of the empty static block.
-     */
-    if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
-        send_bits(s, STATIC_TREES<<1, 3);
-        send_code(s, END_BLOCK, static_ltree);
-#ifdef DEBUG
-        s->compressed_len += 10L;
-#endif
-        bi_flush(s);
-    }
-    s->last_eob_len = 7;
-}
-
-/* ===========================================================================
- * Determine the best encoding for the current block: dynamic trees, static
- * trees or store, and output the encoded block to the zip file.
- */
-void _tr_flush_block(s, buf, stored_len, eof)
-    deflate_state *s;
-    charf *buf;       /* input block, or NULL if too old */
-    ulg stored_len;   /* length of input block */
-    int eof;          /* true if this is the last block for a file */
-{
-    ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
-    int max_blindex = 0;  /* index of last bit length code of non zero freq */
-
-    /* Build the Huffman trees unless a stored block is forced */
-    if (s->level > 0) {
-
-	 /* Check if the file is ascii or binary */
-	if (s->data_type == Z_UNKNOWN) set_data_type(s);
-
-	/* Construct the literal and distance trees */
-	build_tree(s, (tree_desc *)(&(s->l_desc)));
-	Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
-		s->static_len));
-
-	build_tree(s, (tree_desc *)(&(s->d_desc)));
-	Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
-		s->static_len));
-	/* At this point, opt_len and static_len are the total bit lengths of
-	 * the compressed block data, excluding the tree representations.
-	 */
-
-	/* Build the bit length tree for the above two trees, and get the index
-	 * in bl_order of the last bit length code to send.
-	 */
-	max_blindex = build_bl_tree(s);
-
-	/* Determine the best encoding. Compute first the block length in bytes*/
-	opt_lenb = (s->opt_len+3+7)>>3;
-	static_lenb = (s->static_len+3+7)>>3;
-
-	Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
-		opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
-		s->last_lit));
-
-	if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
-
-    } else {
-        Assert(buf != (char*)0, "lost buf");
-	opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
-    }
-
-#ifdef FORCE_STORED
-    if (buf != (char*)0) { /* force stored block */
-#else
-    if (stored_len+4 <= opt_lenb && buf != (char*)0) {
-                       /* 4: two words for the lengths */
-#endif
-        /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
-         * Otherwise we can't have processed more than WSIZE input bytes since
-         * the last block flush, because compression would have been
-         * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
-         * transform a block into a stored block.
-         */
-        _tr_stored_block(s, buf, stored_len, eof);
-
-#ifdef FORCE_STATIC
-    } else if (static_lenb >= 0) { /* force static trees */
-#else
-    } else if (static_lenb == opt_lenb) {
-#endif
-        send_bits(s, (STATIC_TREES<<1)+eof, 3);
-        compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
-#ifdef DEBUG
-        s->compressed_len += 3 + s->static_len;
-#endif
-    } else {
-        send_bits(s, (DYN_TREES<<1)+eof, 3);
-        send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
-                       max_blindex+1);
-        compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
-#ifdef DEBUG
-        s->compressed_len += 3 + s->opt_len;
-#endif
-    }
-    Assert (s->compressed_len == s->bits_sent, "bad compressed size");
-    /* The above check is made mod 2^32, for files larger than 512 MB
-     * and uLong implemented on 32 bits.
-     */
-    init_block(s);
-
-    if (eof) {
-        bi_windup(s);
-#ifdef DEBUG
-        s->compressed_len += 7;  /* align on byte boundary */
-#endif
-    }
-    Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
-           s->compressed_len-7*eof));
-}
-
-/* ===========================================================================
- * Save the match info and tally the frequency counts. Return true if
- * the current block must be flushed.
- */
-int _tr_tally (s, dist, lc)
-    deflate_state *s;
-    unsigned dist;  /* distance of matched string */
-    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
-{
-    s->d_buf[s->last_lit] = (ush)dist;
-    s->l_buf[s->last_lit++] = (uch)lc;
-    if (dist == 0) {
-        /* lc is the unmatched char */
-        s->dyn_ltree[lc].Freq++;
-    } else {
-        s->matches++;
-        /* Here, lc is the match length - MIN_MATCH */
-        dist--;             /* dist = match distance - 1 */
-        Assert((ush)dist < (ush)MAX_DIST(s) &&
-               (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
-               (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
-
-        s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
-        s->dyn_dtree[d_code(dist)].Freq++;
-    }
-
-#ifdef TRUNCATE_BLOCK
-    /* Try to guess if it is profitable to stop the current block here */
-    if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
-        /* Compute an upper bound for the compressed length */
-        ulg out_length = (ulg)s->last_lit*8L;
-        ulg in_length = (ulg)((long)s->strstart - s->block_start);
-        int dcode;
-        for (dcode = 0; dcode < D_CODES; dcode++) {
-            out_length += (ulg)s->dyn_dtree[dcode].Freq *
-                (5L+extra_dbits[dcode]);
-        }
-        out_length >>= 3;
-        Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
-               s->last_lit, in_length, out_length,
-               100L - out_length*100L/in_length));
-        if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
-    }
-#endif
-    return (s->last_lit == s->lit_bufsize-1);
-    /* We avoid equality with lit_bufsize because of wraparound at 64K
-     * on 16 bit machines and because stored blocks are restricted to
-     * 64K-1 bytes.
-     */
-}
-
-/* ===========================================================================
- * Send the block data compressed using the given Huffman trees
- */
-local void compress_block(s, ltree, dtree)
-    deflate_state *s;
-    ct_data *ltree; /* literal tree */
-    ct_data *dtree; /* distance tree */
-{
-    unsigned dist;      /* distance of matched string */
-    int lc;             /* match length or unmatched char (if dist == 0) */
-    unsigned lx = 0;    /* running index in l_buf */
-    unsigned code;      /* the code to send */
-    int extra;          /* number of extra bits to send */
-
-    if (s->last_lit != 0) do {
-        dist = s->d_buf[lx];
-        lc = s->l_buf[lx++];
-        if (dist == 0) {
-            send_code(s, lc, ltree); /* send a literal byte */
-            Tracecv(isgraph(lc), (stderr," '%c' ", lc));
-        } else {
-            /* Here, lc is the match length - MIN_MATCH */
-            code = _length_code[lc];
-            send_code(s, code+LITERALS+1, ltree); /* send the length code */
-            extra = extra_lbits[code];
-            if (extra != 0) {
-                lc -= base_length[code];
-                send_bits(s, lc, extra);       /* send the extra length bits */
-            }
-            dist--; /* dist is now the match distance - 1 */
-            code = d_code(dist);
-            Assert (code < D_CODES, "bad d_code");
-
-            send_code(s, code, dtree);       /* send the distance code */
-            extra = extra_dbits[code];
-            if (extra != 0) {
-                dist -= base_dist[code];
-                send_bits(s, dist, extra);   /* send the extra distance bits */
-            }
-        } /* literal or match pair ? */
-
-        /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
-        Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow");
-
-    } while (lx < s->last_lit);
-
-    send_code(s, END_BLOCK, ltree);
-    s->last_eob_len = ltree[END_BLOCK].Len;
-}
-
-/* ===========================================================================
- * Set the data type to ASCII or BINARY, using a crude approximation:
- * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise.
- * IN assertion: the fields freq of dyn_ltree are set and the total of all
- * frequencies does not exceed 64K (to fit in an int on 16 bit machines).
- */
-local void set_data_type(s)
-    deflate_state *s;
-{
-    int n = 0;
-    unsigned ascii_freq = 0;
-    unsigned bin_freq = 0;
-    while (n < 7)        bin_freq += s->dyn_ltree[n++].Freq;
-    while (n < 128)    ascii_freq += s->dyn_ltree[n++].Freq;
-    while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq;
-    s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII);
-}
-
-/* ===========================================================================
- * Reverse the first len bits of a code, using straightforward code (a faster
- * method would use a table)
- * IN assertion: 1 <= len <= 15
- */
-local unsigned bi_reverse(code, len)
-    unsigned code; /* the value to invert */
-    int len;       /* its bit length */
-{
-    register unsigned res = 0;
-    do {
-        res |= code & 1;
-        code >>= 1, res <<= 1;
-    } while (--len > 0);
-    return res >> 1;
-}
-
-/* ===========================================================================
- * Flush the bit buffer, keeping at most 7 bits in it.
- */
-local void bi_flush(s)
-    deflate_state *s;
-{
-    if (s->bi_valid == 16) {
-        put_short(s, s->bi_buf);
-        s->bi_buf = 0;
-        s->bi_valid = 0;
-    } else if (s->bi_valid >= 8) {
-        put_byte(s, (Byte)s->bi_buf);
-        s->bi_buf >>= 8;
-        s->bi_valid -= 8;
-    }
-}
-
-/* ===========================================================================
- * Flush the bit buffer and align the output on a byte boundary
- */
-local void bi_windup(s)
-    deflate_state *s;
-{
-    if (s->bi_valid > 8) {
-        put_short(s, s->bi_buf);
-    } else if (s->bi_valid > 0) {
-        put_byte(s, (Byte)s->bi_buf);
-    }
-    s->bi_buf = 0;
-    s->bi_valid = 0;
-#ifdef DEBUG
-    s->bits_sent = (s->bits_sent+7) & ~7;
-#endif
-}
-
-/* ===========================================================================
- * Copy a stored block, storing first the length and its
- * one's complement if requested.
- */
-local void copy_block(s, buf, len, header)
-    deflate_state *s;
-    charf    *buf;    /* the input data */
-    unsigned len;     /* its length */
-    int      header;  /* true if block header must be written */
-{
-    bi_windup(s);        /* align on byte boundary */
-    s->last_eob_len = 8; /* enough lookahead for inflate */
-
-    if (header) {
-        put_short(s, (ush)len);   
-        put_short(s, (ush)~len);
-#ifdef DEBUG
-        s->bits_sent += 2*16;
-#endif
-    }
-#ifdef DEBUG
-    s->bits_sent += (ulg)len<<3;
-#endif
-    while (len--) {
-        put_byte(s, *buf++);
-    }
-}
diff --git a/Lib/zlib/trees.h b/Lib/zlib/trees.h
deleted file mode 100644
index 72facf900..000000000
--- a/Lib/zlib/trees.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* header created automatically with -DGEN_TREES_H */
-
-local const ct_data static_ltree[L_CODES+2] = {
-{{ 12},{  8}}, {{140},{  8}}, {{ 76},{  8}}, {{204},{  8}}, {{ 44},{  8}},
-{{172},{  8}}, {{108},{  8}}, {{236},{  8}}, {{ 28},{  8}}, {{156},{  8}},
-{{ 92},{  8}}, {{220},{  8}}, {{ 60},{  8}}, {{188},{  8}}, {{124},{  8}},
-{{252},{  8}}, {{  2},{  8}}, {{130},{  8}}, {{ 66},{  8}}, {{194},{  8}},
-{{ 34},{  8}}, {{162},{  8}}, {{ 98},{  8}}, {{226},{  8}}, {{ 18},{  8}},
-{{146},{  8}}, {{ 82},{  8}}, {{210},{  8}}, {{ 50},{  8}}, {{178},{  8}},
-{{114},{  8}}, {{242},{  8}}, {{ 10},{  8}}, {{138},{  8}}, {{ 74},{  8}},
-{{202},{  8}}, {{ 42},{  8}}, {{170},{  8}}, {{106},{  8}}, {{234},{  8}},
-{{ 26},{  8}}, {{154},{  8}}, {{ 90},{  8}}, {{218},{  8}}, {{ 58},{  8}},
-{{186},{  8}}, {{122},{  8}}, {{250},{  8}}, {{  6},{  8}}, {{134},{  8}},
-{{ 70},{  8}}, {{198},{  8}}, {{ 38},{  8}}, {{166},{  8}}, {{102},{  8}},
-{{230},{  8}}, {{ 22},{  8}}, {{150},{  8}}, {{ 86},{  8}}, {{214},{  8}},
-{{ 54},{  8}}, {{182},{  8}}, {{118},{  8}}, {{246},{  8}}, {{ 14},{  8}},
-{{142},{  8}}, {{ 78},{  8}}, {{206},{  8}}, {{ 46},{  8}}, {{174},{  8}},
-{{110},{  8}}, {{238},{  8}}, {{ 30},{  8}}, {{158},{  8}}, {{ 94},{  8}},
-{{222},{  8}}, {{ 62},{  8}}, {{190},{  8}}, {{126},{  8}}, {{254},{  8}},
-{{  1},{  8}}, {{129},{  8}}, {{ 65},{  8}}, {{193},{  8}}, {{ 33},{  8}},
-{{161},{  8}}, {{ 97},{  8}}, {{225},{  8}}, {{ 17},{  8}}, {{145},{  8}},
-{{ 81},{  8}}, {{209},{  8}}, {{ 49},{  8}}, {{177},{  8}}, {{113},{  8}},
-{{241},{  8}}, {{  9},{  8}}, {{137},{  8}}, {{ 73},{  8}}, {{201},{  8}},
-{{ 41},{  8}}, {{169},{  8}}, {{105},{  8}}, {{233},{  8}}, {{ 25},{  8}},
-{{153},{  8}}, {{ 89},{  8}}, {{217},{  8}}, {{ 57},{  8}}, {{185},{  8}},
-{{121},{  8}}, {{249},{  8}}, {{  5},{  8}}, {{133},{  8}}, {{ 69},{  8}},
-{{197},{  8}}, {{ 37},{  8}}, {{165},{  8}}, {{101},{  8}}, {{229},{  8}},
-{{ 21},{  8}}, {{149},{  8}}, {{ 85},{  8}}, {{213},{  8}}, {{ 53},{  8}},
-{{181},{  8}}, {{117},{  8}}, {{245},{  8}}, {{ 13},{  8}}, {{141},{  8}},
-{{ 77},{  8}}, {{205},{  8}}, {{ 45},{  8}}, {{173},{  8}}, {{109},{  8}},
-{{237},{  8}}, {{ 29},{  8}}, {{157},{  8}}, {{ 93},{  8}}, {{221},{  8}},
-{{ 61},{  8}}, {{189},{  8}}, {{125},{  8}}, {{253},{  8}}, {{ 19},{  9}},
-{{275},{  9}}, {{147},{  9}}, {{403},{  9}}, {{ 83},{  9}}, {{339},{  9}},
-{{211},{  9}}, {{467},{  9}}, {{ 51},{  9}}, {{307},{  9}}, {{179},{  9}},
-{{435},{  9}}, {{115},{  9}}, {{371},{  9}}, {{243},{  9}}, {{499},{  9}},
-{{ 11},{  9}}, {{267},{  9}}, {{139},{  9}}, {{395},{  9}}, {{ 75},{  9}},
-{{331},{  9}}, {{203},{  9}}, {{459},{  9}}, {{ 43},{  9}}, {{299},{  9}},
-{{171},{  9}}, {{427},{  9}}, {{107},{  9}}, {{363},{  9}}, {{235},{  9}},
-{{491},{  9}}, {{ 27},{  9}}, {{283},{  9}}, {{155},{  9}}, {{411},{  9}},
-{{ 91},{  9}}, {{347},{  9}}, {{219},{  9}}, {{475},{  9}}, {{ 59},{  9}},
-{{315},{  9}}, {{187},{  9}}, {{443},{  9}}, {{123},{  9}}, {{379},{  9}},
-{{251},{  9}}, {{507},{  9}}, {{  7},{  9}}, {{263},{  9}}, {{135},{  9}},
-{{391},{  9}}, {{ 71},{  9}}, {{327},{  9}}, {{199},{  9}}, {{455},{  9}},
-{{ 39},{  9}}, {{295},{  9}}, {{167},{  9}}, {{423},{  9}}, {{103},{  9}},
-{{359},{  9}}, {{231},{  9}}, {{487},{  9}}, {{ 23},{  9}}, {{279},{  9}},
-{{151},{  9}}, {{407},{  9}}, {{ 87},{  9}}, {{343},{  9}}, {{215},{  9}},
-{{471},{  9}}, {{ 55},{  9}}, {{311},{  9}}, {{183},{  9}}, {{439},{  9}},
-{{119},{  9}}, {{375},{  9}}, {{247},{  9}}, {{503},{  9}}, {{ 15},{  9}},
-{{271},{  9}}, {{143},{  9}}, {{399},{  9}}, {{ 79},{  9}}, {{335},{  9}},
-{{207},{  9}}, {{463},{  9}}, {{ 47},{  9}}, {{303},{  9}}, {{175},{  9}},
-{{431},{  9}}, {{111},{  9}}, {{367},{  9}}, {{239},{  9}}, {{495},{  9}},
-{{ 31},{  9}}, {{287},{  9}}, {{159},{  9}}, {{415},{  9}}, {{ 95},{  9}},
-{{351},{  9}}, {{223},{  9}}, {{479},{  9}}, {{ 63},{  9}}, {{319},{  9}},
-{{191},{  9}}, {{447},{  9}}, {{127},{  9}}, {{383},{  9}}, {{255},{  9}},
-{{511},{  9}}, {{  0},{  7}}, {{ 64},{  7}}, {{ 32},{  7}}, {{ 96},{  7}},
-{{ 16},{  7}}, {{ 80},{  7}}, {{ 48},{  7}}, {{112},{  7}}, {{  8},{  7}},
-{{ 72},{  7}}, {{ 40},{  7}}, {{104},{  7}}, {{ 24},{  7}}, {{ 88},{  7}},
-{{ 56},{  7}}, {{120},{  7}}, {{  4},{  7}}, {{ 68},{  7}}, {{ 36},{  7}},
-{{100},{  7}}, {{ 20},{  7}}, {{ 84},{  7}}, {{ 52},{  7}}, {{116},{  7}},
-{{  3},{  8}}, {{131},{  8}}, {{ 67},{  8}}, {{195},{  8}}, {{ 35},{  8}},
-{{163},{  8}}, {{ 99},{  8}}, {{227},{  8}}
-};
-
-local const ct_data static_dtree[D_CODES] = {
-{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},
-{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},
-{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},
-{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},
-{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},
-{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
-};
-
-const uch _dist_code[DIST_CODE_LEN] = {
- 0,  1,  2,  3,  4,  4,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8,
- 8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10,
-10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
-13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 16, 17,
-18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
-23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
-27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
-27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
-};
-
-const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {
- 0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 12, 12,
-13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
-17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
-19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
-22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
-23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
-27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
-};
-
-local const int base_length[LENGTH_CODES] = {
-0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
-64, 80, 96, 112, 128, 160, 192, 224, 0
-};
-
-local const int base_dist[D_CODES] = {
-    0,     1,     2,     3,     4,     6,     8,    12,    16,    24,
-   32,    48,    64,    96,   128,   192,   256,   384,   512,   768,
- 1024,  1536,  2048,  3072,  4096,  6144,  8192, 12288, 16384, 24576
-};
-
diff --git a/Lib/zlib/uncompr.c b/Lib/zlib/uncompr.c
deleted file mode 100644
index d10332137..000000000
--- a/Lib/zlib/uncompr.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* uncompr.c -- decompress a memory buffer
- * Copyright (C) 1995-1998 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* @(#) $Id$ */
-
-#include "zlib.h"
-
-/* ===========================================================================
-     Decompresses the source buffer into the destination buffer.  sourceLen is
-   the byte length of the source buffer. Upon entry, destLen is the total
-   size of the destination buffer, which must be large enough to hold the
-   entire uncompressed data. (The size of the uncompressed data must have
-   been saved previously by the compressor and transmitted to the decompressor
-   by some mechanism outside the scope of this compression library.)
-   Upon exit, destLen is the actual size of the compressed buffer.
-     This function can be used to decompress a whole file at once if the
-   input file is mmap'ed.
-
-     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
-   enough memory, Z_BUF_ERROR if there was not enough room in the output
-   buffer, or Z_DATA_ERROR if the input data was corrupted.
-*/
-int ZEXPORT uncompress (dest, destLen, source, sourceLen)
-    Bytef *dest;
-    uLongf *destLen;
-    const Bytef *source;
-    uLong sourceLen;
-{
-    z_stream stream;
-    int err;
-
-    stream.next_in = (Bytef*)source;
-    stream.avail_in = (uInt)sourceLen;
-    /* Check for source > 64K on 16-bit machine: */
-    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
-
-    stream.next_out = dest;
-    stream.avail_out = (uInt)*destLen;
-    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
-
-    stream.zalloc = (alloc_func)0;
-    stream.zfree = (free_func)0;
-
-    err = inflateInit(&stream);
-    if (err != Z_OK) return err;
-
-    err = inflate(&stream, Z_FINISH);
-    if (err != Z_STREAM_END) {
-        inflateEnd(&stream);
-        return err == Z_OK ? Z_BUF_ERROR : err;
-    }
-    *destLen = stream.total_out;
-
-    err = inflateEnd(&stream);
-    return err;
-}
diff --git a/Lib/zlib/zconf.h b/Lib/zlib/zconf.h
deleted file mode 100644
index 6d450fc79..000000000
--- a/Lib/zlib/zconf.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-1998 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* @(#) $Id$ */
-
-#ifndef _ZCONF_H
-#define _ZCONF_H
-
-/*
- * If you *really* need a unique prefix for all types and library functions,
- * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
- */
-#ifdef Z_PREFIX
-#  define deflateInit_	z_deflateInit_
-#  define deflate	z_deflate
-#  define deflateEnd	z_deflateEnd
-#  define inflateInit_ 	z_inflateInit_
-#  define inflate	z_inflate
-#  define inflateEnd	z_inflateEnd
-#  define deflateInit2_	z_deflateInit2_
-#  define deflateSetDictionary z_deflateSetDictionary
-#  define deflateCopy	z_deflateCopy
-#  define deflateReset	z_deflateReset
-#  define deflateParams	z_deflateParams
-#  define inflateInit2_	z_inflateInit2_
-#  define inflateSetDictionary z_inflateSetDictionary
-#  define inflateSync	z_inflateSync
-#  define inflateSyncPoint z_inflateSyncPoint
-#  define inflateReset	z_inflateReset
-#  define compress	z_compress
-#  define compress2	z_compress2
-#  define uncompress	z_uncompress
-#  define adler32	z_adler32
-#  define crc32		z_crc32
-#  define get_crc_table z_get_crc_table
-
-#  define Byte		z_Byte
-#  define uInt		z_uInt
-#  define uLong		z_uLong
-#  define Bytef	        z_Bytef
-#  define charf		z_charf
-#  define intf		z_intf
-#  define uIntf		z_uIntf
-#  define uLongf	z_uLongf
-#  define voidpf	z_voidpf
-#  define voidp		z_voidp
-#endif
-
-#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
-#  define WIN32
-#endif
-#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
-#  ifndef __32BIT__
-#    define __32BIT__
-#  endif
-#endif
-#if defined(__MSDOS__) && !defined(MSDOS)
-#  define MSDOS
-#endif
-
-/*
- * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
- * than 64k bytes at a time (needed on systems with 16-bit int).
- */
-#if defined(MSDOS) && !defined(__32BIT__)
-#  define MAXSEG_64K
-#endif
-#ifdef MSDOS
-#  define UNALIGNED_OK
-#endif
-
-#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32))  && !defined(STDC)
-#  define STDC
-#endif
-#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
-#  ifndef STDC
-#    define STDC
-#  endif
-#endif
-
-#ifndef STDC
-#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
-#    define const
-#  endif
-#endif
-
-/* Some Mac compilers merge all .h files incorrectly: */
-#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
-#  define NO_DUMMY_DECL
-#endif
-
-/* Old Borland C incorrectly complains about missing returns: */
-#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
-#  define NEED_DUMMY_RETURN
-#endif
-
-
-/* Maximum value for memLevel in deflateInit2 */
-#ifndef MAX_MEM_LEVEL
-#  ifdef MAXSEG_64K
-#    define MAX_MEM_LEVEL 8
-#  else
-#    define MAX_MEM_LEVEL 9
-#  endif
-#endif
-
-/* Maximum value for windowBits in deflateInit2 and inflateInit2.
- * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
- * created by gzip. (Files created by minigzip can still be extracted by
- * gzip.)
- */
-#ifndef MAX_WBITS
-#  define MAX_WBITS   15 /* 32K LZ77 window */
-#endif
-
-/* The memory requirements for deflate are (in bytes):
-            (1 << (windowBits+2)) +  (1 << (memLevel+9))
- that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)
- plus a few kilobytes for small objects. For example, if you want to reduce
- the default memory requirements from 256K to 128K, compile with
-     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
- Of course this will generally degrade compression (there's no free lunch).
-
-   The memory requirements for inflate are (in bytes) 1 << windowBits
- that is, 32K for windowBits=15 (default value) plus a few kilobytes
- for small objects.
-*/
-
-                        /* Type declarations */
-
-#ifndef OF /* function prototypes */
-#  ifdef STDC
-#    define OF(args)  args
-#  else
-#    define OF(args)  ()
-#  endif
-#endif
-
-/* The following definitions for FAR are needed only for MSDOS mixed
- * model programming (small or medium model with some far allocations).
- * This was tested only with MSC; for other MSDOS compilers you may have
- * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,
- * just define FAR to be empty.
- */
-#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
-   /* MSC small or medium model */
-#  define SMALL_MEDIUM
-#  ifdef _MSC_VER
-#    define FAR _far
-#  else
-#    define FAR far
-#  endif
-#endif
-#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
-#  ifndef __32BIT__
-#    define SMALL_MEDIUM
-#    define FAR _far
-#  endif
-#endif
-
-/* Compile with -DZLIB_DLL for Windows DLL support */
-#if defined(ZLIB_DLL)
-#  if defined(_WINDOWS) || defined(WINDOWS)
-#    ifdef FAR
-#      undef FAR
-#    endif
-#    include 
-#    define ZEXPORT  WINAPI
-#    ifdef WIN32
-#      define ZEXPORTVA  WINAPIV
-#    else
-#      define ZEXPORTVA  FAR _cdecl _export
-#    endif
-#  endif
-#  if defined (__BORLANDC__)
-#    if (__BORLANDC__ >= 0x0500) && defined (WIN32)
-#      include 
-#      define ZEXPORT __declspec(dllexport) WINAPI
-#      define ZEXPORTRVA __declspec(dllexport) WINAPIV
-#    else
-#      if defined (_Windows) && defined (__DLL__)
-#        define ZEXPORT _export
-#        define ZEXPORTVA _export
-#      endif
-#    endif
-#  endif
-#endif
-
-#if defined (__BEOS__)
-#  if defined (ZLIB_DLL)
-#    define ZEXTERN extern __declspec(dllexport)
-#  else
-#    define ZEXTERN extern __declspec(dllimport)
-#  endif
-#endif
-
-#ifndef ZEXPORT
-#  define ZEXPORT
-#endif
-#ifndef ZEXPORTVA
-#  define ZEXPORTVA
-#endif
-#ifndef ZEXTERN
-#  define ZEXTERN extern
-#endif
-
-#ifndef FAR
-#   define FAR
-#endif
-
-#if !defined(MACOS) && !defined(TARGET_OS_MAC)
-typedef unsigned char  Byte;  /* 8 bits */
-#endif
-typedef unsigned int   uInt;  /* 16 bits or more */
-typedef unsigned long  uLong; /* 32 bits or more */
-
-#ifdef SMALL_MEDIUM
-   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
-#  define Bytef Byte FAR
-#else
-   typedef Byte  FAR Bytef;
-#endif
-typedef char  FAR charf;
-typedef int   FAR intf;
-typedef uInt  FAR uIntf;
-typedef uLong FAR uLongf;
-
-#ifdef STDC
-   typedef void FAR *voidpf;
-   typedef void     *voidp;
-#else
-   typedef Byte FAR *voidpf;
-   typedef Byte     *voidp;
-#endif
-
-#ifdef HAVE_UNISTD_H
-#  include  /* for off_t */
-#  include     /* for SEEK_* and off_t */
-#  define z_off_t  off_t
-#endif
-#ifndef SEEK_SET
-#  define SEEK_SET        0       /* Seek from beginning of file.  */
-#  define SEEK_CUR        1       /* Seek from current position.  */
-#  define SEEK_END        2       /* Set file pointer to EOF plus "offset" */
-#endif
-#ifndef z_off_t
-#  define  z_off_t long
-#endif
-
-/* MVS linker does not support external names larger than 8 bytes */
-#if defined(__MVS__)
-#   pragma map(deflateInit_,"DEIN")
-#   pragma map(deflateInit2_,"DEIN2")
-#   pragma map(deflateEnd,"DEEND")
-#   pragma map(inflateInit_,"ININ")
-#   pragma map(inflateInit2_,"ININ2")
-#   pragma map(inflateEnd,"INEND")
-#   pragma map(inflateSync,"INSY")
-#   pragma map(inflateSetDictionary,"INSEDI")
-#   pragma map(inflate_blocks,"INBL")
-#   pragma map(inflate_blocks_new,"INBLNE")
-#   pragma map(inflate_blocks_free,"INBLFR")
-#   pragma map(inflate_blocks_reset,"INBLRE")
-#   pragma map(inflate_codes_free,"INCOFR")
-#   pragma map(inflate_codes,"INCO")
-#   pragma map(inflate_fast,"INFA")
-#   pragma map(inflate_flush,"INFLU")
-#   pragma map(inflate_mask,"INMA")
-#   pragma map(inflate_set_dictionary,"INSEDI2")
-#   pragma map(inflate_copyright,"INCOPY")
-#   pragma map(inflate_trees_bits,"INTRBI")
-#   pragma map(inflate_trees_dynamic,"INTRDY")
-#   pragma map(inflate_trees_fixed,"INTRFI")
-#   pragma map(inflate_trees_free,"INTRFR")
-#endif
-
-#endif /* _ZCONF_H */
diff --git a/Lib/zlib/zlib.3 b/Lib/zlib/zlib.3
deleted file mode 100644
index 25c8495d2..000000000
--- a/Lib/zlib/zlib.3
+++ /dev/null
@@ -1,107 +0,0 @@
-.TH ZLIB 3 "9 July 1998"
-.SH NAME
-zlib \- compression/decompression library
-.SH SYNOPSIS
-[see
-.I zlib.h
-for full description]
-.SH DESCRIPTION
-The
-.I zlib
-library is a general purpose data compression library.
-The code is thread safe.
-It provides in-memory compression and decompression functions,
-including integrity checks of the uncompressed data.
-This version of the library supports only one compression method (deflation)
-but other algorithms will be added later and will have the same stream interface.
-.LP
-Compression can be done in a single step if the buffers are large enough
-(for example if an input file is mmap'ed),
-or can be done by repeated calls of the compression function.
-In the latter case,
-the application must provide more input and/or consume the output
-(providing more output space) before each call.
-.LP
-The library also supports reading and writing files in
-.I gzip
-(.gz) format
-with an interface similar to that of stdio.
-.LP
-The library does not install any signal handler. The decoder checks
-the consistency of the compressed data, so the library should never
-crash even in case of corrupted input.
-.LP
-All functions of the compression library are documented in the file
-.IR zlib.h.
-The distribution source includes examples of use of the library
-the files
-.I example.c
-and
-.IR minigzip.c .
-.LP
-A Java implementation of
-.IR zlib
-is available in the Java Development Kit 1.1
-.IP
-http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html
-.LP
-A Perl interface to
-.IR zlib ,
-written by Paul Marquess (pmarquess@bfsec.bt.co.uk)
-is available at CPAN (Comprehensive Perl Archive Network) sites,
-such as:
-.IP
-ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
-.LP
-A Python interface to
-.IR zlib
-written by A.M. Kuchling 
-is available from the Python Software Association sites, such as:
-.IP
-ftp://ftp.python.org/pub/python/contrib/Encoding/zlib*.tar.gz
-.SH "SEE ALSO"
-Questions about zlib should be sent to:
-.IP
-zlib@quest.jpl.nasa.gov
-or, if this fails, to the author addresses given below.
-The zlib home page is:
-.IP
-http://www.cdrom.com/pub/infozip/zlib/
-.LP
-The data format used by the zlib library is described by RFC
-(Request for Comments) 1950 to 1952 in the files: 
-.IP
-ftp://ds.internic.net/rfc/rfc1950.txt (zlib format)
-.br
-rfc1951.txt (deflate format)
-.br
-rfc1952.txt (gzip format)
-.LP
-These documents are also available in other formats from:
-.IP
-ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
-.SH AUTHORS
-Version 1.1.3
-Copyright (C) 1995-1998 Jean-loup Gailly (jloup@gzip.org)
-and Mark Adler (madler@alumni.caltech.edu).
-.LP
-This software is provided "as-is,"
-without any express or implied warranty.
-In no event will the authors be held liable for any damages
-arising from the use of this software.
-See the distribution directory with respect to requirements
-governing redistribution.
-The deflate format used by
-.I zlib
-was defined by Phil Katz.
-The deflate and
-.I zlib
-specifications were written by L. Peter Deutsch.
-Thanks to all the people who reported problems and suggested various
-improvements in
-.IR zlib ;
-who are too numerous to cite here.
-.LP
-UNIX manual page by R. P. C. Rodgers,
-U.S. National Library of Medicine (rodgers@nlm.nih.gov).
-.\" end of man page
diff --git a/Lib/zlib/zlib.h b/Lib/zlib/zlib.h
deleted file mode 100644
index 49f56b43b..000000000
--- a/Lib/zlib/zlib.h
+++ /dev/null
@@ -1,893 +0,0 @@
-/* zlib.h -- interface of the 'zlib' general purpose compression library
-  version 1.1.3, July 9th, 1998
-
-  Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-  Jean-loup Gailly        Mark Adler
-  jloup@gzip.org          madler@alumni.caltech.edu
-
-
-  The data format used by the zlib library is described by RFCs (Request for
-  Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
-  (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
-*/
-
-#ifndef _ZLIB_H
-#define _ZLIB_H
-
-#include "zconf.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define ZLIB_VERSION "1.1.3"
-
-/* 
-     The 'zlib' compression library provides in-memory compression and
-  decompression functions, including integrity checks of the uncompressed
-  data.  This version of the library supports only one compression method
-  (deflation) but other algorithms will be added later and will have the same
-  stream interface.
-
-     Compression can be done in a single step if the buffers are large
-  enough (for example if an input file is mmap'ed), or can be done by
-  repeated calls of the compression function.  In the latter case, the
-  application must provide more input and/or consume the output
-  (providing more output space) before each call.
-
-     The library also supports reading and writing files in gzip (.gz) format
-  with an interface similar to that of stdio.
-
-     The library does not install any signal handler. The decoder checks
-  the consistency of the compressed data, so the library should never
-  crash even in case of corrupted input.
-*/
-
-typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
-typedef void   (*free_func)  OF((voidpf opaque, voidpf address));
-
-struct internal_state;
-
-typedef struct z_stream_s {
-    Bytef    *next_in;  /* next input byte */
-    uInt     avail_in;  /* number of bytes available at next_in */
-    uLong    total_in;  /* total nb of input bytes read so far */
-
-    Bytef    *next_out; /* next output byte should be put there */
-    uInt     avail_out; /* remaining free space at next_out */
-    uLong    total_out; /* total nb of bytes output so far */
-
-    char     *msg;      /* last error message, NULL if no error */
-    struct internal_state FAR *state; /* not visible by applications */
-
-    alloc_func zalloc;  /* used to allocate the internal state */
-    free_func  zfree;   /* used to free the internal state */
-    voidpf     opaque;  /* private data object passed to zalloc and zfree */
-
-    int     data_type;  /* best guess about the data type: ascii or binary */
-    uLong   adler;      /* adler32 value of the uncompressed data */
-    uLong   reserved;   /* reserved for future use */
-} z_stream;
-
-typedef z_stream FAR *z_streamp;
-
-/*
-   The application must update next_in and avail_in when avail_in has
-   dropped to zero. It must update next_out and avail_out when avail_out
-   has dropped to zero. The application must initialize zalloc, zfree and
-   opaque before calling the init function. All other fields are set by the
-   compression library and must not be updated by the application.
-
-   The opaque value provided by the application will be passed as the first
-   parameter for calls of zalloc and zfree. This can be useful for custom
-   memory management. The compression library attaches no meaning to the
-   opaque value.
-
-   zalloc must return Z_NULL if there is not enough memory for the object.
-   If zlib is used in a multi-threaded application, zalloc and zfree must be
-   thread safe.
-
-   On 16-bit systems, the functions zalloc and zfree must be able to allocate
-   exactly 65536 bytes, but will not be required to allocate more than this
-   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
-   pointers returned by zalloc for objects of exactly 65536 bytes *must*
-   have their offset normalized to zero. The default allocation function
-   provided by this library ensures this (see zutil.c). To reduce memory
-   requirements and avoid any allocation of 64K objects, at the expense of
-   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
-
-   The fields total_in and total_out can be used for statistics or
-   progress reports. After compression, total_in holds the total size of
-   the uncompressed data and may be saved for use in the decompressor
-   (particularly if the decompressor wants to decompress everything in
-   a single step).
-*/
-
-                        /* constants */
-
-#define Z_NO_FLUSH      0
-#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
-#define Z_SYNC_FLUSH    2
-#define Z_FULL_FLUSH    3
-#define Z_FINISH        4
-/* Allowed flush values; see deflate() below for details */
-
-#define Z_OK            0
-#define Z_STREAM_END    1
-#define Z_NEED_DICT     2
-#define Z_ERRNO        (-1)
-#define Z_STREAM_ERROR (-2)
-#define Z_DATA_ERROR   (-3)
-#define Z_MEM_ERROR    (-4)
-#define Z_BUF_ERROR    (-5)
-#define Z_VERSION_ERROR (-6)
-/* Return codes for the compression/decompression functions. Negative
- * values are errors, positive values are used for special but normal events.
- */
-
-#define Z_NO_COMPRESSION         0
-#define Z_BEST_SPEED             1
-#define Z_BEST_COMPRESSION       9
-#define Z_DEFAULT_COMPRESSION  (-1)
-/* compression levels */
-
-#define Z_FILTERED            1
-#define Z_HUFFMAN_ONLY        2
-#define Z_DEFAULT_STRATEGY    0
-/* compression strategy; see deflateInit2() below for details */
-
-#define Z_BINARY   0
-#define Z_ASCII    1
-#define Z_UNKNOWN  2
-/* Possible values of the data_type field */
-
-#define Z_DEFLATED   8
-/* The deflate compression method (the only one supported in this version) */
-
-#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
-
-#define zlib_version zlibVersion()
-/* for compatibility with versions < 1.0.2 */
-
-                        /* basic functions */
-
-ZEXTERN const char * ZEXPORT zlibVersion OF((void));
-/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
-   If the first character differs, the library code actually used is
-   not compatible with the zlib.h header file used by the application.
-   This check is automatically made by deflateInit and inflateInit.
- */
-
-/* 
-ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
-
-     Initializes the internal stream state for compression. The fields
-   zalloc, zfree and opaque must be initialized before by the caller.
-   If zalloc and zfree are set to Z_NULL, deflateInit updates them to
-   use default allocation functions.
-
-     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
-   1 gives best speed, 9 gives best compression, 0 gives no compression at
-   all (the input data is simply copied a block at a time).
-   Z_DEFAULT_COMPRESSION requests a default compromise between speed and
-   compression (currently equivalent to level 6).
-
-     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
-   enough memory, Z_STREAM_ERROR if level is not a valid compression level,
-   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
-   with the version assumed by the caller (ZLIB_VERSION).
-   msg is set to null if there is no error message.  deflateInit does not
-   perform any compression: this will be done by deflate().
-*/
-
-
-ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
-/*
-    deflate compresses as much data as possible, and stops when the input
-  buffer becomes empty or the output buffer becomes full. It may introduce some
-  output latency (reading input without producing any output) except when
-  forced to flush.
-
-    The detailed semantics are as follows. deflate performs one or both of the
-  following actions:
-
-  - Compress more input starting at next_in and update next_in and avail_in
-    accordingly. If not all input can be processed (because there is not
-    enough room in the output buffer), next_in and avail_in are updated and
-    processing will resume at this point for the next call of deflate().
-
-  - Provide more output starting at next_out and update next_out and avail_out
-    accordingly. This action is forced if the parameter flush is non zero.
-    Forcing flush frequently degrades the compression ratio, so this parameter
-    should be set only when necessary (in interactive applications).
-    Some output may be provided even if flush is not set.
-
-  Before the call of deflate(), the application should ensure that at least
-  one of the actions is possible, by providing more input and/or consuming
-  more output, and updating avail_in or avail_out accordingly; avail_out
-  should never be zero before the call. The application can consume the
-  compressed output when it wants, for example when the output buffer is full
-  (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
-  and with zero avail_out, it must be called again after making room in the
-  output buffer because there might be more output pending.
-
-    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
-  flushed to the output buffer and the output is aligned on a byte boundary, so
-  that the decompressor can get all input data available so far. (In particular
-  avail_in is zero after the call if enough output space has been provided
-  before the call.)  Flushing may degrade compression for some compression
-  algorithms and so it should be used only when necessary.
-
-    If flush is set to Z_FULL_FLUSH, all output is flushed as with
-  Z_SYNC_FLUSH, and the compression state is reset so that decompression can
-  restart from this point if previous compressed data has been damaged or if
-  random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
-  the compression.
-
-    If deflate returns with avail_out == 0, this function must be called again
-  with the same value of the flush parameter and more output space (updated
-  avail_out), until the flush is complete (deflate returns with non-zero
-  avail_out).
-
-    If the parameter flush is set to Z_FINISH, pending input is processed,
-  pending output is flushed and deflate returns with Z_STREAM_END if there
-  was enough output space; if deflate returns with Z_OK, this function must be
-  called again with Z_FINISH and more output space (updated avail_out) but no
-  more input data, until it returns with Z_STREAM_END or an error. After
-  deflate has returned Z_STREAM_END, the only possible operations on the
-  stream are deflateReset or deflateEnd.
-  
-    Z_FINISH can be used immediately after deflateInit if all the compression
-  is to be done in a single step. In this case, avail_out must be at least
-  0.1% larger than avail_in plus 12 bytes.  If deflate does not return
-  Z_STREAM_END, then it must be called again as described above.
-
-    deflate() sets strm->adler to the adler32 checksum of all input read
-  so far (that is, total_in bytes).
-
-    deflate() may update data_type if it can make a good guess about
-  the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
-  binary. This field is only for information purposes and does not affect
-  the compression algorithm in any manner.
-
-    deflate() returns Z_OK if some progress has been made (more input
-  processed or more output produced), Z_STREAM_END if all input has been
-  consumed and all output has been produced (only when flush is set to
-  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
-  if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
-  (for example avail_in or avail_out was zero).
-*/
-
-
-ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
-/*
-     All dynamically allocated data structures for this stream are freed.
-   This function discards any unprocessed input and does not flush any
-   pending output.
-
-     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
-   stream state was inconsistent, Z_DATA_ERROR if the stream was freed
-   prematurely (some input or output was discarded). In the error case,
-   msg may be set but then points to a static string (which must not be
-   deallocated).
-*/
-
-
-/* 
-ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
-
-     Initializes the internal stream state for decompression. The fields
-   next_in, avail_in, zalloc, zfree and opaque must be initialized before by
-   the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
-   value depends on the compression method), inflateInit determines the
-   compression method from the zlib header and allocates all data structures
-   accordingly; otherwise the allocation will be deferred to the first call of
-   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to
-   use default allocation functions.
-
-     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
-   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
-   version assumed by the caller.  msg is set to null if there is no error
-   message. inflateInit does not perform any decompression apart from reading
-   the zlib header if present: this will be done by inflate().  (So next_in and
-   avail_in may be modified, but next_out and avail_out are unchanged.)
-*/
-
-
-ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
-/*
-    inflate decompresses as much data as possible, and stops when the input
-  buffer becomes empty or the output buffer becomes full. It may some
-  introduce some output latency (reading input without producing any output)
-  except when forced to flush.
-
-  The detailed semantics are as follows. inflate performs one or both of the
-  following actions:
-
-  - Decompress more input starting at next_in and update next_in and avail_in
-    accordingly. If not all input can be processed (because there is not
-    enough room in the output buffer), next_in is updated and processing
-    will resume at this point for the next call of inflate().
-
-  - Provide more output starting at next_out and update next_out and avail_out
-    accordingly.  inflate() provides as much output as possible, until there
-    is no more input data or no more space in the output buffer (see below
-    about the flush parameter).
-
-  Before the call of inflate(), the application should ensure that at least
-  one of the actions is possible, by providing more input and/or consuming
-  more output, and updating the next_* and avail_* values accordingly.
-  The application can consume the uncompressed output when it wants, for
-  example when the output buffer is full (avail_out == 0), or after each
-  call of inflate(). If inflate returns Z_OK and with zero avail_out, it
-  must be called again after making room in the output buffer because there
-  might be more output pending.
-
-    If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
-  output as possible to the output buffer. The flushing behavior of inflate is
-  not specified for values of the flush parameter other than Z_SYNC_FLUSH
-  and Z_FINISH, but the current implementation actually flushes as much output
-  as possible anyway.
-
-    inflate() should normally be called until it returns Z_STREAM_END or an
-  error. However if all decompression is to be performed in a single step
-  (a single call of inflate), the parameter flush should be set to
-  Z_FINISH. In this case all pending input is processed and all pending
-  output is flushed; avail_out must be large enough to hold all the
-  uncompressed data. (The size of the uncompressed data may have been saved
-  by the compressor for this purpose.) The next operation on this stream must
-  be inflateEnd to deallocate the decompression state. The use of Z_FINISH
-  is never required, but can be used to inform inflate that a faster routine
-  may be used for the single inflate() call.
-
-     If a preset dictionary is needed at this point (see inflateSetDictionary
-  below), inflate sets strm-adler to the adler32 checksum of the
-  dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise 
-  it sets strm->adler to the adler32 checksum of all output produced
-  so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
-  an error code as described below. At the end of the stream, inflate()
-  checks that its computed adler32 checksum is equal to that saved by the
-  compressor and returns Z_STREAM_END only if the checksum is correct.
-
-    inflate() returns Z_OK if some progress has been made (more input processed
-  or more output produced), Z_STREAM_END if the end of the compressed data has
-  been reached and all uncompressed output has been produced, Z_NEED_DICT if a
-  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
-  corrupted (input stream not conforming to the zlib format or incorrect
-  adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
-  (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
-  enough memory, Z_BUF_ERROR if no progress is possible or if there was not
-  enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
-  case, the application may then call inflateSync to look for a good
-  compression block.
-*/
-
-
-ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
-/*
-     All dynamically allocated data structures for this stream are freed.
-   This function discards any unprocessed input and does not flush any
-   pending output.
-
-     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
-   was inconsistent. In the error case, msg may be set but then points to a
-   static string (which must not be deallocated).
-*/
-
-                        /* Advanced functions */
-
-/*
-    The following functions are needed only in some special applications.
-*/
-
-/*   
-ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
-                                     int  level,
-                                     int  method,
-                                     int  windowBits,
-                                     int  memLevel,
-                                     int  strategy));
-
-     This is another version of deflateInit with more compression options. The
-   fields next_in, zalloc, zfree and opaque must be initialized before by
-   the caller.
-
-     The method parameter is the compression method. It must be Z_DEFLATED in
-   this version of the library.
-
-     The windowBits parameter is the base two logarithm of the window size
-   (the size of the history buffer).  It should be in the range 8..15 for this
-   version of the library. Larger values of this parameter result in better
-   compression at the expense of memory usage. The default value is 15 if
-   deflateInit is used instead.
-
-     The memLevel parameter specifies how much memory should be allocated
-   for the internal compression state. memLevel=1 uses minimum memory but
-   is slow and reduces compression ratio; memLevel=9 uses maximum memory
-   for optimal speed. The default value is 8. See zconf.h for total memory
-   usage as a function of windowBits and memLevel.
-
-     The strategy parameter is used to tune the compression algorithm. Use the
-   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
-   filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
-   string match).  Filtered data consists mostly of small values with a
-   somewhat random distribution. In this case, the compression algorithm is
-   tuned to compress them better. The effect of Z_FILTERED is to force more
-   Huffman coding and less string matching; it is somewhat intermediate
-   between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects
-   the compression ratio but not the correctness of the compressed output even
-   if it is not set appropriately.
-
-      deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
-   memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
-   method). msg is set to null if there is no error message.  deflateInit2 does
-   not perform any compression: this will be done by deflate().
-*/
-                            
-ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
-                                             const Bytef *dictionary,
-                                             uInt  dictLength));
-/*
-     Initializes the compression dictionary from the given byte sequence
-   without producing any compressed output. This function must be called
-   immediately after deflateInit, deflateInit2 or deflateReset, before any
-   call of deflate. The compressor and decompressor must use exactly the same
-   dictionary (see inflateSetDictionary).
-
-     The dictionary should consist of strings (byte sequences) that are likely
-   to be encountered later in the data to be compressed, with the most commonly
-   used strings preferably put towards the end of the dictionary. Using a
-   dictionary is most useful when the data to be compressed is short and can be
-   predicted with good accuracy; the data can then be compressed better than
-   with the default empty dictionary.
-
-     Depending on the size of the compression data structures selected by
-   deflateInit or deflateInit2, a part of the dictionary may in effect be
-   discarded, for example if the dictionary is larger than the window size in
-   deflate or deflate2. Thus the strings most likely to be useful should be
-   put at the end of the dictionary, not at the front.
-
-     Upon return of this function, strm->adler is set to the Adler32 value
-   of the dictionary; the decompressor may later use this value to determine
-   which dictionary has been used by the compressor. (The Adler32 value
-   applies to the whole dictionary even if only a subset of the dictionary is
-   actually used by the compressor.)
-
-     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
-   parameter is invalid (such as NULL dictionary) or the stream state is
-   inconsistent (for example if deflate has already been called for this stream
-   or if the compression method is bsort). deflateSetDictionary does not
-   perform any compression: this will be done by deflate().
-*/
-
-ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
-                                    z_streamp source));
-/*
-     Sets the destination stream as a complete copy of the source stream.
-
-     This function can be useful when several compression strategies will be
-   tried, for example when there are several ways of pre-processing the input
-   data with a filter. The streams that will be discarded should then be freed
-   by calling deflateEnd.  Note that deflateCopy duplicates the internal
-   compression state which can be quite large, so this strategy is slow and
-   can consume lots of memory.
-
-     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
-   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
-   (such as zalloc being NULL). msg is left unchanged in both source and
-   destination.
-*/
-
-ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
-/*
-     This function is equivalent to deflateEnd followed by deflateInit,
-   but does not free and reallocate all the internal compression state.
-   The stream will keep the same compression level and any other attributes
-   that may have been set by deflateInit2.
-
-      deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
-   stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
-				      int level,
-				      int strategy));
-/*
-     Dynamically update the compression level and compression strategy.  The
-   interpretation of level and strategy is as in deflateInit2.  This can be
-   used to switch between compression and straight copy of the input data, or
-   to switch to a different kind of input data requiring a different
-   strategy. If the compression level is changed, the input available so far
-   is compressed with the old level (and may be flushed); the new level will
-   take effect only at the next call of deflate().
-
-     Before the call of deflateParams, the stream state must be set as for
-   a call of deflate(), since the currently available input may have to
-   be compressed and flushed. In particular, strm->avail_out must be non-zero.
-
-     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
-   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
-   if strm->avail_out was zero.
-*/
-
-/*   
-ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
-                                     int  windowBits));
-
-     This is another version of inflateInit with an extra parameter. The
-   fields next_in, avail_in, zalloc, zfree and opaque must be initialized
-   before by the caller.
-
-     The windowBits parameter is the base two logarithm of the maximum window
-   size (the size of the history buffer).  It should be in the range 8..15 for
-   this version of the library. The default value is 15 if inflateInit is used
-   instead. If a compressed stream with a larger window size is given as
-   input, inflate() will return with the error code Z_DATA_ERROR instead of
-   trying to allocate a larger window.
-
-      inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
-   memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
-   memLevel). msg is set to null if there is no error message.  inflateInit2
-   does not perform any decompression apart from reading the zlib header if
-   present: this will be done by inflate(). (So next_in and avail_in may be
-   modified, but next_out and avail_out are unchanged.)
-*/
-
-ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
-                                             const Bytef *dictionary,
-                                             uInt  dictLength));
-/*
-     Initializes the decompression dictionary from the given uncompressed byte
-   sequence. This function must be called immediately after a call of inflate
-   if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
-   can be determined from the Adler32 value returned by this call of
-   inflate. The compressor and decompressor must use exactly the same
-   dictionary (see deflateSetDictionary).
-
-     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
-   parameter is invalid (such as NULL dictionary) or the stream state is
-   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
-   expected one (incorrect Adler32 value). inflateSetDictionary does not
-   perform any decompression: this will be done by subsequent calls of
-   inflate().
-*/
-
-ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
-/* 
-    Skips invalid compressed data until a full flush point (see above the
-  description of deflate with Z_FULL_FLUSH) can be found, or until all
-  available input is skipped. No output is provided.
-
-    inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
-  if no more input was provided, Z_DATA_ERROR if no flush point has been found,
-  or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
-  case, the application may save the current current value of total_in which
-  indicates where valid compressed data was found. In the error case, the
-  application may repeatedly call inflateSync, providing more input each time,
-  until success or end of the input data.
-*/
-
-ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
-/*
-     This function is equivalent to inflateEnd followed by inflateInit,
-   but does not free and reallocate all the internal decompression state.
-   The stream will keep attributes that may have been set by inflateInit2.
-
-      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
-   stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-
-                        /* utility functions */
-
-/*
-     The following utility functions are implemented on top of the
-   basic stream-oriented functions. To simplify the interface, some
-   default options are assumed (compression level and memory usage,
-   standard memory allocation functions). The source code of these
-   utility functions can easily be modified if you need special options.
-*/
-
-ZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,
-                                 const Bytef *source, uLong sourceLen));
-/*
-     Compresses the source buffer into the destination buffer.  sourceLen is
-   the byte length of the source buffer. Upon entry, destLen is the total
-   size of the destination buffer, which must be at least 0.1% larger than
-   sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the
-   compressed buffer.
-     This function can be used to compress a whole file at once if the
-   input file is mmap'ed.
-     compress returns Z_OK if success, Z_MEM_ERROR if there was not
-   enough memory, Z_BUF_ERROR if there was not enough room in the output
-   buffer.
-*/
-
-ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
-                                  const Bytef *source, uLong sourceLen,
-                                  int level));
-/*
-     Compresses the source buffer into the destination buffer. The level
-   parameter has the same meaning as in deflateInit.  sourceLen is the byte
-   length of the source buffer. Upon entry, destLen is the total size of the
-   destination buffer, which must be at least 0.1% larger than sourceLen plus
-   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
-
-     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
-   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
-   Z_STREAM_ERROR if the level parameter is invalid.
-*/
-
-ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
-                                   const Bytef *source, uLong sourceLen));
-/*
-     Decompresses the source buffer into the destination buffer.  sourceLen is
-   the byte length of the source buffer. Upon entry, destLen is the total
-   size of the destination buffer, which must be large enough to hold the
-   entire uncompressed data. (The size of the uncompressed data must have
-   been saved previously by the compressor and transmitted to the decompressor
-   by some mechanism outside the scope of this compression library.)
-   Upon exit, destLen is the actual size of the compressed buffer.
-     This function can be used to decompress a whole file at once if the
-   input file is mmap'ed.
-
-     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
-   enough memory, Z_BUF_ERROR if there was not enough room in the output
-   buffer, or Z_DATA_ERROR if the input data was corrupted.
-*/
-
-
-typedef voidp gzFile;
-
-ZEXTERN gzFile ZEXPORT gzopen  OF((const char *path, const char *mode));
-/*
-     Opens a gzip (.gz) file for reading or writing. The mode parameter
-   is as in fopen ("rb" or "wb") but can also include a compression level
-   ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
-   Huffman only compression as in "wb1h". (See the description
-   of deflateInit2 for more information about the strategy parameter.)
-
-     gzopen can be used to read a file which is not in gzip format; in this
-   case gzread will directly read from the file without decompression.
-
-     gzopen returns NULL if the file could not be opened or if there was
-   insufficient memory to allocate the (de)compression state; errno
-   can be checked to distinguish the two cases (if errno is zero, the
-   zlib error is Z_MEM_ERROR).  */
-
-ZEXTERN gzFile ZEXPORT gzdopen  OF((int fd, const char *mode));
-/*
-     gzdopen() associates a gzFile with the file descriptor fd.  File
-   descriptors are obtained from calls like open, dup, creat, pipe or
-   fileno (in the file has been previously opened with fopen).
-   The mode parameter is as in gzopen.
-     The next call of gzclose on the returned gzFile will also close the
-   file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
-   descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
-     gzdopen returns NULL if there was insufficient memory to allocate
-   the (de)compression state.
-*/
-
-ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
-/*
-     Dynamically update the compression level or strategy. See the description
-   of deflateInit2 for the meaning of these parameters.
-     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
-   opened for writing.
-*/
-
-ZEXTERN int ZEXPORT    gzread  OF((gzFile file, voidp buf, unsigned len));
-/*
-     Reads the given number of uncompressed bytes from the compressed file.
-   If the input file was not in gzip format, gzread copies the given number
-   of bytes into the buffer.
-     gzread returns the number of uncompressed bytes actually read (0 for
-   end of file, -1 for error). */
-
-ZEXTERN int ZEXPORT    gzwrite OF((gzFile file, 
-				   const voidp buf, unsigned len));
-/*
-     Writes the given number of uncompressed bytes into the compressed file.
-   gzwrite returns the number of uncompressed bytes actually written
-   (0 in case of error).
-*/
-
-ZEXTERN int ZEXPORTVA   gzprintf OF((gzFile file, const char *format, ...));
-/*
-     Converts, formats, and writes the args to the compressed file under
-   control of the format string, as in fprintf. gzprintf returns the number of
-   uncompressed bytes actually written (0 in case of error).
-*/
-
-ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
-/*
-      Writes the given null-terminated string to the compressed file, excluding
-   the terminating null character.
-      gzputs returns the number of characters written, or -1 in case of error.
-*/
-
-ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
-/*
-      Reads bytes from the compressed file until len-1 characters are read, or
-   a newline character is read and transferred to buf, or an end-of-file
-   condition is encountered.  The string is then terminated with a null
-   character.
-      gzgets returns buf, or Z_NULL in case of error.
-*/
-
-ZEXTERN int ZEXPORT    gzputc OF((gzFile file, int c));
-/*
-      Writes c, converted to an unsigned char, into the compressed file.
-   gzputc returns the value that was written, or -1 in case of error.
-*/
-
-ZEXTERN int ZEXPORT    gzgetc OF((gzFile file));
-/*
-      Reads one byte from the compressed file. gzgetc returns this byte
-   or -1 in case of end of file or error.
-*/
-
-ZEXTERN int ZEXPORT    gzflush OF((gzFile file, int flush));
-/*
-     Flushes all pending output into the compressed file. The parameter
-   flush is as in the deflate() function. The return value is the zlib
-   error number (see function gzerror below). gzflush returns Z_OK if
-   the flush parameter is Z_FINISH and all output could be flushed.
-     gzflush should be called only when strictly necessary because it can
-   degrade compression.
-*/
-
-ZEXTERN z_off_t ZEXPORT    gzseek OF((gzFile file,
-				      z_off_t offset, int whence));
-/* 
-      Sets the starting position for the next gzread or gzwrite on the
-   given compressed file. The offset represents a number of bytes in the
-   uncompressed data stream. The whence parameter is defined as in lseek(2);
-   the value SEEK_END is not supported.
-     If the file is opened for reading, this function is emulated but can be
-   extremely slow. If the file is opened for writing, only forward seeks are
-   supported; gzseek then compresses a sequence of zeroes up to the new
-   starting position.
-
-      gzseek returns the resulting offset location as measured in bytes from
-   the beginning of the uncompressed stream, or -1 in case of error, in
-   particular if the file is opened for writing and the new starting position
-   would be before the current position.
-*/
-
-ZEXTERN int ZEXPORT    gzrewind OF((gzFile file));
-/*
-     Rewinds the given file. This function is supported only for reading.
-
-   gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
-*/
-
-ZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));
-/*
-     Returns the starting position for the next gzread or gzwrite on the
-   given compressed file. This position represents a number of bytes in the
-   uncompressed data stream.
-
-   gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
-*/
-
-ZEXTERN int ZEXPORT gzeof OF((gzFile file));
-/*
-     Returns 1 when EOF has previously been detected reading the given
-   input stream, otherwise zero.
-*/
-
-ZEXTERN int ZEXPORT    gzclose OF((gzFile file));
-/*
-     Flushes all pending output if necessary, closes the compressed file
-   and deallocates all the (de)compression state. The return value is the zlib
-   error number (see function gzerror below).
-*/
-
-ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
-/*
-     Returns the error message for the last error which occurred on the
-   given compressed file. errnum is set to zlib error number. If an
-   error occurred in the file system and not in the compression library,
-   errnum is set to Z_ERRNO and the application may consult errno
-   to get the exact error code.
-*/
-
-                        /* checksum functions */
-
-/*
-     These functions are not related to compression but are exported
-   anyway because they might be useful in applications using the
-   compression library.
-*/
-
-ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
-
-/*
-     Update a running Adler-32 checksum with the bytes buf[0..len-1] and
-   return the updated checksum. If buf is NULL, this function returns
-   the required initial value for the checksum.
-   An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
-   much faster. Usage example:
-
-     uLong adler = adler32(0L, Z_NULL, 0);
-
-     while (read_buffer(buffer, length) != EOF) {
-       adler = adler32(adler, buffer, length);
-     }
-     if (adler != original_adler) error();
-*/
-
-ZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));
-/*
-     Update a running crc with the bytes buf[0..len-1] and return the updated
-   crc. If buf is NULL, this function returns the required initial value
-   for the crc. Pre- and post-conditioning (one's complement) is performed
-   within this function so it shouldn't be done by the application.
-   Usage example:
-
-     uLong crc = crc32(0L, Z_NULL, 0);
-
-     while (read_buffer(buffer, length) != EOF) {
-       crc = crc32(crc, buffer, length);
-     }
-     if (crc != original_crc) error();
-*/
-
-
-                        /* various hacks, don't look :) */
-
-/* deflateInit and inflateInit are macros to allow checking the zlib version
- * and the compiler's view of z_stream:
- */
-ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
-                                     const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
-                                     const char *version, int stream_size));
-ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,
-                                      int windowBits, int memLevel,
-                                      int strategy, const char *version,
-                                      int stream_size));
-ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,
-                                      const char *version, int stream_size));
-#define deflateInit(strm, level) \
-        deflateInit_((strm), (level),       ZLIB_VERSION, sizeof(z_stream))
-#define inflateInit(strm) \
-        inflateInit_((strm),                ZLIB_VERSION, sizeof(z_stream))
-#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
-        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
-                      (strategy),           ZLIB_VERSION, sizeof(z_stream))
-#define inflateInit2(strm, windowBits) \
-        inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
-
-
-#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
-    struct internal_state {int dummy;}; /* hack for buggy compilers */
-#endif
-
-ZEXTERN const char   * ZEXPORT zError           OF((int err));
-ZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp z));
-ZEXTERN const uLongf * ZEXPORT get_crc_table    OF((void));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _ZLIB_H */
diff --git a/Lib/zlib/zutil.c b/Lib/zlib/zutil.c
deleted file mode 100644
index b3de4e883..000000000
--- a/Lib/zlib/zutil.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/* zutil.c -- target dependent utility functions for the compression library
- * Copyright (C) 1995-1998 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-/* @(#) $Id$ */
-
-#include "zutil.h"
-
-struct internal_state      {int dummy;}; /* for buggy compilers */
-
-#ifndef STDC
-extern void exit OF((int));
-#endif
-
-const char *z_errmsg[10] = {
-"need dictionary",     /* Z_NEED_DICT       2  */
-"stream end",          /* Z_STREAM_END      1  */
-"",                    /* Z_OK              0  */
-"file error",          /* Z_ERRNO         (-1) */
-"stream error",        /* Z_STREAM_ERROR  (-2) */
-"data error",          /* Z_DATA_ERROR    (-3) */
-"insufficient memory", /* Z_MEM_ERROR     (-4) */
-"buffer error",        /* Z_BUF_ERROR     (-5) */
-"incompatible version",/* Z_VERSION_ERROR (-6) */
-""};
-
-
-const char * ZEXPORT zlibVersion()
-{
-    return ZLIB_VERSION;
-}
-
-#ifdef DEBUG
-
-#  ifndef verbose
-#    define verbose 0
-#  endif
-int z_verbose = verbose;
-
-void z_error (m)
-    char *m;
-{
-    fprintf(stderr, "%s\n", m);
-    exit(1);
-}
-#endif
-
-/* exported to allow conversion of error code to string for compress() and
- * uncompress()
- */
-const char * ZEXPORT zError(err)
-    int err;
-{
-    return ERR_MSG(err);
-}
-
-
-#ifndef HAVE_MEMCPY
-
-void zmemcpy(dest, source, len)
-    Bytef* dest;
-    const Bytef* source;
-    uInt  len;
-{
-    if (len == 0) return;
-    do {
-        *dest++ = *source++; /* ??? to be unrolled */
-    } while (--len != 0);
-}
-
-int zmemcmp(s1, s2, len)
-    const Bytef* s1;
-    const Bytef* s2;
-    uInt  len;
-{
-    uInt j;
-
-    for (j = 0; j < len; j++) {
-        if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
-    }
-    return 0;
-}
-
-void zmemzero(dest, len)
-    Bytef* dest;
-    uInt  len;
-{
-    if (len == 0) return;
-    do {
-        *dest++ = 0;  /* ??? to be unrolled */
-    } while (--len != 0);
-}
-#endif
-
-#ifdef __TURBOC__
-#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__)
-/* Small and medium model in Turbo C are for now limited to near allocation
- * with reduced MAX_WBITS and MAX_MEM_LEVEL
- */
-#  define MY_ZCALLOC
-
-/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
- * and farmalloc(64K) returns a pointer with an offset of 8, so we
- * must fix the pointer. Warning: the pointer must be put back to its
- * original form in order to free it, use zcfree().
- */
-
-#define MAX_PTR 10
-/* 10*64K = 640K */
-
-local int next_ptr = 0;
-
-typedef struct ptr_table_s {
-    voidpf org_ptr;
-    voidpf new_ptr;
-} ptr_table;
-
-local ptr_table table[MAX_PTR];
-/* This table is used to remember the original form of pointers
- * to large buffers (64K). Such pointers are normalized with a zero offset.
- * Since MSDOS is not a preemptive multitasking OS, this table is not
- * protected from concurrent access. This hack doesn't work anyway on
- * a protected system like OS/2. Use Microsoft C instead.
- */
-
-voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
-{
-    voidpf buf = opaque; /* just to make some compilers happy */
-    ulg bsize = (ulg)items*size;
-
-    /* If we allocate less than 65520 bytes, we assume that farmalloc
-     * will return a usable pointer which doesn't have to be normalized.
-     */
-    if (bsize < 65520L) {
-        buf = farmalloc(bsize);
-        if (*(ush*)&buf != 0) return buf;
-    } else {
-        buf = farmalloc(bsize + 16L);
-    }
-    if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
-    table[next_ptr].org_ptr = buf;
-
-    /* Normalize the pointer to seg:0 */
-    *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
-    *(ush*)&buf = 0;
-    table[next_ptr++].new_ptr = buf;
-    return buf;
-}
-
-void  zcfree (voidpf opaque, voidpf ptr)
-{
-    int n;
-    if (*(ush*)&ptr != 0) { /* object < 64K */
-        farfree(ptr);
-        return;
-    }
-    /* Find the original pointer */
-    for (n = 0; n < next_ptr; n++) {
-        if (ptr != table[n].new_ptr) continue;
-
-        farfree(table[n].org_ptr);
-        while (++n < next_ptr) {
-            table[n-1] = table[n];
-        }
-        next_ptr--;
-        return;
-    }
-    ptr = opaque; /* just to make some compilers happy */
-    Assert(0, "zcfree: ptr not found");
-}
-#endif
-#endif /* __TURBOC__ */
-
-
-#if defined(M_I86) && !defined(__32BIT__)
-/* Microsoft C in 16-bit mode */
-
-#  define MY_ZCALLOC
-
-#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
-#  define _halloc  halloc
-#  define _hfree   hfree
-#endif
-
-voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
-{
-    if (opaque) opaque = 0; /* to make compiler happy */
-    return _halloc((long)items, size);
-}
-
-void  zcfree (voidpf opaque, voidpf ptr)
-{
-    if (opaque) opaque = 0; /* to make compiler happy */
-    _hfree(ptr);
-}
-
-#endif /* MSC */
-
-
-#ifndef MY_ZCALLOC /* Any system without a special alloc function */
-
-#ifndef STDC
-extern voidp  calloc OF((uInt items, uInt size));
-extern void   free   OF((voidpf ptr));
-#endif
-
-voidpf zcalloc (opaque, items, size)
-    voidpf opaque;
-    unsigned items;
-    unsigned size;
-{
-    if (opaque) items += size - size; /* make compiler happy */
-    return (voidpf)calloc(items, size);
-}
-
-void  zcfree (opaque, ptr)
-    voidpf opaque;
-    voidpf ptr;
-{
-    free(ptr);
-    if (opaque) return; /* make compiler happy */
-}
-
-#endif /* MY_ZCALLOC */
diff --git a/Lib/zlib/zutil.h b/Lib/zlib/zutil.h
deleted file mode 100644
index 6f2cb97ca..000000000
--- a/Lib/zlib/zutil.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995-1998 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-/* @(#) $Id$ */
-
-#ifndef _Z_UTIL_H
-#define _Z_UTIL_H
-
-#include "zlib.h"
-
-#ifdef STDC
-#  include 
-#  include 
-#  include 
-#endif
-#ifdef NO_ERRNO_H
-    extern int errno;
-#else
-#   include 
-#endif
-
-#ifndef local
-#  define local static
-#endif
-/* compile with -Dlocal if your debugger can't find static symbols */
-
-typedef unsigned char  uch;
-typedef uch FAR uchf;
-typedef unsigned short ush;
-typedef ush FAR ushf;
-typedef unsigned long  ulg;
-
-extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
-/* (size given to avoid silly warnings with Visual C++) */
-
-#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
-
-#define ERR_RETURN(strm,err) \
-  return (strm->msg = (char*)ERR_MSG(err), (err))
-/* To be used only when the state is known to be valid */
-
-        /* common constants */
-
-#ifndef DEF_WBITS
-#  define DEF_WBITS MAX_WBITS
-#endif
-/* default windowBits for decompression. MAX_WBITS is for compression only */
-
-#if MAX_MEM_LEVEL >= 8
-#  define DEF_MEM_LEVEL 8
-#else
-#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
-#endif
-/* default memLevel */
-
-#define STORED_BLOCK 0
-#define STATIC_TREES 1
-#define DYN_TREES    2
-/* The three kinds of block type */
-
-#define MIN_MATCH  3
-#define MAX_MATCH  258
-/* The minimum and maximum match lengths */
-
-#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
-
-        /* target dependencies */
-
-#ifdef MSDOS
-#  define OS_CODE  0x00
-#  if defined(__TURBOC__) || defined(__BORLANDC__)
-#    if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
-       /* Allow compilation with ANSI keywords only enabled */
-       void _Cdecl farfree( void *block );
-       void *_Cdecl farmalloc( unsigned long nbytes );
-#    else
-#     include 
-#    endif
-#  else /* MSC or DJGPP */
-#    include 
-#  endif
-#endif
-
-#ifdef OS2
-#  define OS_CODE  0x06
-#endif
-
-#ifdef WIN32 /* Window 95 & Windows NT */
-#  define OS_CODE  0x0b
-#endif
-
-#if defined(VAXC) || defined(VMS)
-#  define OS_CODE  0x02
-#  define F_OPEN(name, mode) \
-     fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
-#endif
-
-#ifdef AMIGA
-#  define OS_CODE  0x01
-#endif
-
-#if defined(ATARI) || defined(atarist)
-#  define OS_CODE  0x05
-#endif
-
-#if defined(MACOS) || defined(TARGET_OS_MAC)
-#  define OS_CODE  0x07
-#  if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
-#    include  /* for fdopen */
-#  else
-#    ifndef fdopen
-#      define fdopen(fd,mode) NULL /* No fdopen() */
-#    endif
-#  endif
-#endif
-
-#ifdef __50SERIES /* Prime/PRIMOS */
-#  define OS_CODE  0x0F
-#endif
-
-#ifdef TOPS20
-#  define OS_CODE  0x0a
-#endif
-
-#if defined(_BEOS_) || defined(RISCOS)
-#  define fdopen(fd,mode) NULL /* No fdopen() */
-#endif
-
-#if (defined(_MSC_VER) && (_MSC_VER > 600))
-#  define fdopen(fd,type)  _fdopen(fd,type)
-#endif
-
-
-        /* Common defaults */
-
-#ifndef OS_CODE
-#  define OS_CODE  0x03  /* assume Unix */
-#endif
-
-#ifndef F_OPEN
-#  define F_OPEN(name, mode) fopen((name), (mode))
-#endif
-
-         /* functions */
-
-#ifdef HAVE_STRERROR
-   extern char *strerror OF((int));
-#  define zstrerror(errnum) strerror(errnum)
-#else
-#  define zstrerror(errnum) ""
-#endif
-
-#if defined(pyr)
-#  define NO_MEMCPY
-#endif
-#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
- /* Use our own functions for small and medium model with MSC <= 5.0.
-  * You may have to use the same strategy for Borland C (untested).
-  * The __SC__ check is for Symantec.
-  */
-#  define NO_MEMCPY
-#endif
-#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
-#  define HAVE_MEMCPY
-#endif
-#ifdef HAVE_MEMCPY
-#  ifdef SMALL_MEDIUM /* MSDOS small or medium model */
-#    define zmemcpy _fmemcpy
-#    define zmemcmp _fmemcmp
-#    define zmemzero(dest, len) _fmemset(dest, 0, len)
-#  else
-#    define zmemcpy memcpy
-#    define zmemcmp memcmp
-#    define zmemzero(dest, len) memset(dest, 0, len)
-#  endif
-#else
-   extern void zmemcpy  OF((Bytef* dest, const Bytef* source, uInt len));
-   extern int  zmemcmp  OF((const Bytef* s1, const Bytef* s2, uInt len));
-   extern void zmemzero OF((Bytef* dest, uInt len));
-#endif
-
-/* Diagnostic functions */
-#ifdef DEBUG
-#  include 
-   extern int z_verbose;
-   extern void z_error    OF((char *m));
-#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}
-#  define Trace(x) {if (z_verbose>=0) fprintf x ;}
-#  define Tracev(x) {if (z_verbose>0) fprintf x ;}
-#  define Tracevv(x) {if (z_verbose>1) fprintf x ;}
-#  define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
-#  define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
-#else
-#  define Assert(cond,msg)
-#  define Trace(x)
-#  define Tracev(x)
-#  define Tracevv(x)
-#  define Tracec(c,x)
-#  define Tracecv(c,x)
-#endif
-
-
-typedef uLong (ZEXPORT *check_func) OF((uLong check, const Bytef *buf,
-				       uInt len));
-voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
-void   zcfree  OF((voidpf opaque, voidpf ptr));
-
-#define ZALLOC(strm, items, size) \
-           (*((strm)->zalloc))((strm)->opaque, (items), (size))
-#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
-#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
-
-#endif /* _Z_UTIL_H */
diff --git a/Tools/Areas/Makefile.am b/Tools/Areas/Makefile.am
deleted file mode 100644
index 2dbe5de6f..000000000
--- a/Tools/Areas/Makefile.am
+++ /dev/null
@@ -1,37 +0,0 @@
-#---------------------------------------------------------------------------
-# Makefile
-#
-# Written by Curtis Olson, started January 1998.
-#
-# Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#
-# $Id$
-#---------------------------------------------------------------------------
-
-
-bin_PROGRAMS = areas
-
-areas_SOURCES = area.cxx area.hxx main.cxx
-
-areas_LDADD = \
-	$(top_builddir)/Lib/Bucket/libBucket.a \
-	$(base_LIBS)
-
-INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib
-
-
-#---------------------------------------------------------------------------
diff --git a/Tools/Areas/area.cxx b/Tools/Areas/area.cxx
deleted file mode 100644
index 169829e9e..000000000
--- a/Tools/Areas/area.cxx
+++ /dev/null
@@ -1,155 +0,0 @@
-// area.c -- routines to assist with inserting "areas" into FG terrain
-//
-// Written by Curtis Olson, started March 1998.
-//
-// Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-//
-
-
-#include 
-#include 
-
-#include 
-
-#include "area.hxx"
-
-
-// calc new x, y for a rotation
-double rot_x(double x, double y, double theta) {
-    return ( x * cos(theta) + y * sin(theta) );
-}
-
-
-// calc new x, y for a rotation
-double rot_y(double x, double y, double theta) {
-    return ( -x * sin(theta) + y * cos(theta) );
-}
-
-
-// calc new lon/lat given starting lon/lat, and offset radial, and
-// distance.  NOTE: distance is specified in meters (and converted
-// internally to radians)
-point2d calc_lon_lat( point2d orig, point2d offset ) {
-    point2d result;
-
-    offset.dist *= METER_TO_NM * NM_TO_RAD;
-
-    result.lat = asin( sin(orig.lat) * cos(offset.dist) + 
-		       cos(orig.lat) * sin(offset.dist) * cos(offset.theta) );
-
-    if ( cos(result.lat) < FG_EPSILON ) {
-        result.lon = orig.lon;      // endpoint a pole
-    } else {
-        result.lon = 
-	    fmod(orig.lon - asin( sin(offset.theta) * sin(offset.dist) / 
-				  cos(result.lat) ) + FG_PI, FG_2PI) - FG_PI;
-    }
-
-    return(result);
-}
-
-
-point2d cart_to_polar_2d(point2d in) {
-    point2d result;
-    result.dist = sqrt( in.x * in.x + in.y * in.y );
-    result.theta = atan2(in.y, in.x);    
-
-    return(result);
-}
-
-
-void batch_cart_to_polar_2d(point2d *in, point2d *out, int size) {
-    int i;
-
-    for ( i = 0; i < size; i++ ) {
-	out[i] = cart_to_polar_2d( in[i] );
-    }
-}
-
-
-// given a set of 2d coordinates relative to a center point, and the
-// lon, lat of that center point, as well as a potential orientation
-// angle, generate the corresponding lon and lat of the original 2d
-// verticies.
-void make_area(point2d orig, point2d *cart, point2d *result, 
-	       int size, double angle ) {
-    point2d rad[size];
-    int i;
-
-    // convert to polar coordinates
-    batch_cart_to_polar_2d(cart, rad, size);
-    for ( i = 0; i < size; i++ ) {
-	printf("(%.2f, %.2f)\n", rad[i].dist, rad[i].theta);
-    }
-    printf("\n");
-
-    // rotate by specified angle
-    for ( i = 0; i < size; i++ ) {
-	rad[i].theta += angle;
-	while ( rad[i].theta > FG_2PI ) {
-	    rad[i].theta -= FG_2PI;
-	}
-	printf("(%.2f, %.2f)\n", rad[i].dist, rad[i].theta);
-    }
-    printf("\n");
-
-    for ( i = 0; i < size; i++ ) {
-	result[i] = calc_lon_lat(orig, rad[i]);
-	printf("(%.8f, %.8f)\n", result[i].lon, result[i].lat);
-    }
-    printf("\n");
-}
-
-
-// generate an area for a runway
-void gen_runway_area( double lon, double lat, double heading, 
-		      double length, double width,
-		      point2d *result, int *count) 
-{
-    point2d cart[4];
-    point2d orig;
-    double l, w;
-    int i;
-
-    orig.lon = lon;
-    orig.lat = lat;
-    l = (length / 2.0) + (length * 0.1);
-    w = (width / 2.0) + (width * 0.1);
-
-    // generate untransformed runway area vertices
-    cart[0].x =  l; cart[0].y =  w;
-    cart[1].x =  l; cart[1].y = -w;
-    cart[2].x = -l; cart[2].y = -w;
-    cart[3].x = -l; cart[3].y =  w;
-    for ( i = 0; i < 4; i++ ) {
-	printf("(%.2f, %.2f)\n", cart[i].x, cart[i].y);
-    }
-    printf("\n");
-
-    make_area(orig, cart, result, 4, heading);
-
-    for ( i = 0; i < 4; i++ ) {
-	printf("(%.8f, %.8f)\n", result[i].lon, result[i].lat);
-    }
-    printf("\n");
-
-    *count = 4;
-}
-
-
diff --git a/Tools/Areas/area.hxx b/Tools/Areas/area.hxx
deleted file mode 100644
index 5396dc3a5..000000000
--- a/Tools/Areas/area.hxx
+++ /dev/null
@@ -1,51 +0,0 @@
-// area.h -- routines to assist with inserting "areas" into FG terrain
-//
-// Written by Curtis Olson, started February 1998.
-//
-// Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-//
-
-
-#ifndef _AREA_H
-#define _AREA_H
-
-
-typedef struct {
-    union {
-	double x;
-	double dist;
-	double lon;
-    };
-    union {
-	double y;
-	double theta;
-	double lat;
-    };
-} point2d;
-
-
-// generate an area for a runway
-void gen_runway_area( double lon, double lat, double heading, 
-		      double length, double width,
-		      point2d *result, int *count );
-
-
-#endif // _AREA_H
-
-
diff --git a/Tools/Areas/main.cxx b/Tools/Areas/main.cxx
deleted file mode 100644
index 58c517254..000000000
--- a/Tools/Areas/main.cxx
+++ /dev/null
@@ -1,127 +0,0 @@
-// main.c -- main loop
-//
-// Written by Curtis Olson, started March 1998.
-//
-// Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-//
-
-
-#ifdef HAVE_CONFIG_H
-#include 
-#endif
-
-#ifdef HAVE_STDLIB_H
-#include 
-#endif
-
-#include 
-#include 
-
-#include "area.hxx"
-
-#include 
-#include 
-
-
-int main( int argc, char **argv ) {
-    fgBUCKET b;
-    point2d nodes[4];
-    FILE *fd;
-    char base[256], path[256], command[256], file[256], exfile[256];
-    double lon, lat, elevation, heading;
-    double length, width;
-    long int index;
-    int i, count;
-
-    if ( argc != 2 ) {
-	printf("Usage %s \n", argv[0]);
-	exit(0);
-    }
-
-    // P13 (Globe, AZ)
-    // lon = -110.6642442;
-    // lat = 33.3528903;
-    // heading = 102.0 * DEG_TO_RAD;
-    // length = 1769;
-    // width = 23;
-
-    // KANE
-    lon = -93.2113889;
-    lat = 45.145;
-    elevation = 912 * FEET_TO_METER;
-    heading = 270.0 * DEG_TO_RAD;
-    length = 1220;
-    width = 23;
-
-    gen_runway_area( lon * DEG_TO_RAD, lat * DEG_TO_RAD, 
-		     heading, length, width, nodes, &count );
-
-    fgBucketFind(lon, lat, &b);
-    printf( "Bucket = lon,lat = %d,%d  x,y index = %d,%d\n", 
-	    b.lon, b.lat, b.x, b.y);
-
-    index = fgBucketGenIndex(&b);
-    fgBucketGenBasePath(&b, base);
-    sprintf(path, "%s/Scenery/%s", argv[1], base);
-    sprintf(command, "mkdir -p %s\n", path);
-    system(command);
-    
-    sprintf(exfile, "%s/%ld.node.ex", path, index);
-    sprintf(file, "%s/%ld.poly", path, index);
-    printf( "extra node file = %s\n", exfile);
-    printf( "poly file = %s\n", file);
-
-    // output extra nodes
-    if ( (fd = fopen(exfile, "w")) == NULL ) {
-        printf("Cannot open file: %s\n", exfile);
-        exit(-1);
-    }
-
-    fprintf(fd, "%d 2 0 0\n", count);
-    for ( i = 0; i < count; i++ ) {
-	fprintf( fd, "%d %.2f %.2f %.2f\n", i + 1, 
-		 nodes[i].lon * RAD_TO_ARCSEC, nodes[i].lat * RAD_TO_ARCSEC, 
-		 elevation);
-    }
-    fclose(fd);
-
-    // output poly
-    if ( (fd = fopen(file, "w")) == NULL ) {
-        printf("Cannot open file: %s\n", file);
-        exit(-1);
-    }
-
-    // output empty node list
-    fprintf(fd, "0 2 0 0\n");
-
-    // output segments
-    fprintf(fd, "%d 0\n", count);
-    for ( i = 0; i < count - 1; i++ ) {
-	fprintf( fd, "%d %d %d\n", i + 1, i + 1, i + 2 );
-    }
-    fprintf( fd, "%d %d %d\n", count, count, 1 );
-
-    // output hole center
-    fprintf( fd, "1\n");
-    fprintf( fd, "1 %.2f %.2f\n", lon * 3600.0, lat * 3600);
-
-    fclose(fd);
-}
-
-
diff --git a/Tools/Construct/Array/Makefile.am b/Tools/Construct/Array/Makefile.am
deleted file mode 100644
index 01ad7dc14..000000000
--- a/Tools/Construct/Array/Makefile.am
+++ /dev/null
@@ -1,19 +0,0 @@
-noinst_LIBRARIES = libArray.a
-
-libArray_a_SOURCES = array.cxx array.hxx
-
-noinst_PROGRAMS = testarray
-
-testarray_SOURCES = testarray.cxx
-
-testarray_LDADD = \
-	$(top_builddir)/Tools/Construct/Array/libArray.a \
-	$(top_builddir)/Lib/Bucket/libBucket.a \
-	$(top_builddir)/Lib/Math/libMath.a \
-	$(top_builddir)/Lib/Misc/libMisc.a \
-	$(top_builddir)/Lib/zlib/libz.a
-
-INCLUDES += \
-	-I$(top_builddir) \
-	-I$(top_builddir)/Lib \
-	-I$(top_builddir)/Tools/Construct
diff --git a/Tools/Construct/Array/array.cxx b/Tools/Construct/Array/array.cxx
deleted file mode 100644
index c1345f049..000000000
--- a/Tools/Construct/Array/array.cxx
+++ /dev/null
@@ -1,577 +0,0 @@
-// array.cxx -- Array management class
-//
-// Written by Curtis Olson, started March 1998.
-//
-// Copyright (C) 1998 - 1999  Curtis L. Olson  - curt@flightgear.org
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifdef HAVE_CONFIG_H
-#  include 
-#endif
-
-#include 
-
-// #include     // isspace()
-// #include    // atoi()
-// #include      // rint()
-// #include 
-// #include 
-// #ifdef HAVE_SYS_STAT_H
-// #  include  // stat()
-// #endif
-// #ifdef FG_HAVE_STD_INCLUDES
-// #  include 
-// #else
-// #  include 
-// #endif
-// #ifdef HAVE_UNISTD_H
-// # include    // stat()
-// #endif
-
-#include STL_STRING
-
-#include 
-#include 
-#include 
-#include 
-
-#include "array.hxx"
-
-FG_USING_STD(string);
-
-
-FGArray::FGArray( void ) {
-    // cout << "class FGArray CONstructor called." << endl;
-    in_data = new float[ARRAY_SIZE_1][ARRAY_SIZE_1];
-    // out_data = new float[ARRAY_SIZE_1][ARRAY_SIZE_1];
-}
-
-
-FGArray::FGArray( const string &file ) {
-    // cout << "class FGArray CONstructor called." << endl;
-    in_data = new float[ARRAY_SIZE_1][ARRAY_SIZE_1];
-    // out_data = new float[ARRAY_SIZE_1][ARRAY_SIZE_1];
-
-    FGArray::open(file);
-}
-
-
-// open an Array file
-int
-FGArray::open( const string& file ) {
-    // open input file (or read from stdin)
-    if ( file ==  "-" ) {
-	cout << "  Opening array data pipe from stdin" << endl;
-	// fd = stdin;
-	// fd = gzdopen(STDIN_FILENO, "r");
-	cout << "  Not yet ported ..." << endl;
-	return 0;
-    } else {
-	in = new fg_gzifstream( file );
-	if ( ! in->is_open() ) {
-	    cout << "  Cannot open " << file << endl;
-	    return 0;
-	}
-	cout << "  Opening array data file: " << file << endl;
-    }
-
-    return 1;
-}
-
-
-// close an Array file
-int
-FGArray::close() {
-    // the fg_gzifstream doesn't seem to have a close()
-
-    delete in;
-
-    return 1;
-}
-
-
-// parse Array file, pass in the bucket so we can make up values when
-// the file wasn't found.
-int
-FGArray::parse( FGBucket& b ) {
-    if ( in->is_open() ) {
-	// file open, parse
-	*in >> originx >> originy;
-	*in >> cols >> col_step;
-	*in >> rows >> row_step;
-
-	cout << "    origin  = " << originx << "  " << originy << endl;
-	cout << "    cols = " << cols << "  rows = " << rows << endl;
-	cout << "    col_step = " << col_step 
-	     << "  row_step = " << row_step <> in_data[i][j];
-	    }
-	}
-
-	cout << "    Done parsing\n";
-    } else {
-	// file not open (not found?), fill with zero'd data
-
-	originx = ( b.get_center_lon() - 0.5 * b.get_width() ) * 3600.0;
-	originy = ( b.get_center_lat() - 0.5 * b.get_height() ) * 3600.0;
-
-	double max_x = ( b.get_center_lon() + 0.5 * b.get_width() ) * 3600.0;
-	double max_y = ( b.get_center_lat() + 0.5 * b.get_height() ) * 3600.0;
-
-	cols = 3;
-	col_step = (max_x - originx) / (cols - 1);
-	rows = 3;
-	row_step = (max_y - originy) / (rows - 1);
-
-	cout << "    origin  = " << originx << "  " << originy << endl;
-	cout << "    cols = " << cols << "  rows = " << rows << endl;
-	cout << "    col_step = " << col_step 
-	     << "  row_step = " << row_step < error_sq ) {
-		    good_fit = false;
-		}
-		
-		end++;
-	    }
-
-	    if ( !good_fit ) {
-		// error exceeded the threshold, back up
-		end -= 2;  // back "end" up to the last good enough fit
-		n--;       // back "n" up appropriately too
-	    } else {
-		// we popped out of the above loop while still within
-		// the error threshold, so we must be at the end of
-		// the data set
-		end--;
-	    }
-	    
-	    least_squares(x, y, n, &m, &b);
-	    // ave_error = least_squares_error(x, y, n, m, b);
-	    max_error = least_squares_max_error(x, y, n, m, b);
-
-	    /*
-	    printf("\n");
-	    printf("%d - %d  ave error = %.2f  max error = %.2f  y = %.2f*x + %.2f\n", 
-		   start, end, ave_error, max_error, m, b);
-	    printf("\n");
-
-	    fprintf(fit1, "%.2f %.2f\n", x[0], m * x[0] + b);
-	    fprintf(fit1, "%.2f %.2f\n", x[end-start], m * x[end-start] + b);
-	    */
-
-	    if ( start > colmin ) {
-		// skip this for the first line segment
-		cury = m * x[0] + b;
-		add_fit_node( start, row, (lasty + cury) / 2 );
-		// fprintf(fit, "%.2f %.2f\n", x[0], (lasty + cury) / 2);
-	    }
-
-	    lasty = m * x[end-start] + b;
-	    start = end;
-	}
-
-	/*
-	fclose(fit);
-	fclose(fit1);
-
-	dem = fopen("gnuplot.dat", "w");
-	for ( j = 0; j < ARRAY_SIZE_1; j++) {
-	    fprintf(dem, "%.2f %.2f\n", 0.0 + ( j * col_step ), 
-		    in_data[j][row]);
-	} 
-	fclose(dem);
-	*/
-
-	// NOTICE, this is for testing only.  This instance of
-        // output_nodes should be removed.  It should be called only
-        // once at the end once all the nodes have been generated.
-	// newmesh_output_nodes(&nm, "mesh.node");
-	// printf("Please hit return: "); gets(junk);
-    }
-
-    // outputmesh_output_nodes(fg_root, p);
-
-    // return fit nodes + 4 corners
-    return node_list.size() + 4;
-}
-
-
-// return the current altitude based on grid data.  We should rewrite
-// this to interpolate exact values, but for now this is good enough
-double FGArray::interpolate_altitude( double lon, double lat ) const {
-    // we expect incoming (lon,lat) to be in arcsec for now
-
-    double xlocal, ylocal, dx, dy, zA, zB, elev;
-    int x1, x2, x3, y1, y2, y3;
-    float z1, z2, z3;
-    int xindex, yindex;
-
-    /* determine if we are in the lower triangle or the upper triangle 
-       ______
-       |   /|
-       |  / |
-       | /  |
-       |/   |
-       ------
-
-       then calculate our end points
-     */
-
-    xlocal = (lon - originx) / col_step;
-    ylocal = (lat - originy) / row_step;
-
-    xindex = (int)(xlocal);
-    yindex = (int)(ylocal);
-
-    // printf("xindex = %d  yindex = %d\n", xindex, yindex);
-
-    if ( xindex + 1 == cols ) {
-	xindex--;
-    }
-
-    if ( yindex + 1 == rows ) {
-	yindex--;
-    }
-
-    if ( (xindex < 0) || (xindex + 1 >= cols) ||
-	 (yindex < 0) || (yindex + 1 >= rows) ) {
-	cout << "WARNING: Attempt to interpolate value outside of array!!!" 
-	     << endl;
-	return 0;
-    }
-
-    dx = xlocal - xindex;
-    dy = ylocal - yindex;
-
-    if ( dx > dy ) {
-	// lower triangle
-	// printf("  Lower triangle\n");
-
-	x1 = xindex; 
-	y1 = yindex; 
-	z1 = in_data[x1][y1];
-
-	x2 = xindex + 1; 
-	y2 = yindex; 
-	z2 = in_data[x2][y2];
-				  
-	x3 = xindex + 1; 
-	y3 = yindex + 1; 
-	z3 = in_data[x3][y3];
-
-	// printf("  dx = %.2f  dy = %.2f\n", dx, dy);
-	// printf("  (x1,y1,z1) = (%d,%d,%d)\n", x1, y1, z1);
-	// printf("  (x2,y2,z2) = (%d,%d,%d)\n", x2, y2, z2);
-	// printf("  (x3,y3,z3) = (%d,%d,%d)\n", x3, y3, z3);
-
-	zA = dx * (z2 - z1) + z1;
-	zB = dx * (z3 - z1) + z1;
-	
-	// printf("  zA = %.2f  zB = %.2f\n", zA, zB);
-
-	if ( dx > FG_EPSILON ) {
-	    elev = dy * (zB - zA) / dx + zA;
-	} else {
-	    elev = zA;
-	}
-    } else {
-	// upper triangle
-	// printf("  Upper triangle\n");
-
-	x1 = xindex; 
-	y1 = yindex; 
-	z1 = in_data[x1][y1];
-
-	x2 = xindex; 
-	y2 = yindex + 1; 
-	z2 = in_data[x2][y2];
-				  
-	x3 = xindex + 1; 
-	y3 = yindex + 1; 
-	z3 = in_data[x3][y3];
-
-	// printf("  dx = %.2f  dy = %.2f\n", dx, dy);
-	// printf("  (x1,y1,z1) = (%d,%d,%d)\n", x1, y1, z1);
-	// printf("  (x2,y2,z2) = (%d,%d,%d)\n", x2, y2, z2);
-	// printf("  (x3,y3,z3) = (%d,%d,%d)\n", x3, y3, z3);
- 
-	zA = dy * (z2 - z1) + z1;
-	zB = dy * (z3 - z1) + z1;
-	
-	// printf("  zA = %.2f  zB = %.2f\n", zA, zB );
-	// printf("  xB - xA = %.2f\n", col_step * dy / row_step);
-
-	if ( dy > FG_EPSILON ) {
-	    elev = dx * (zB - zA) / dy    + zA;
-	} else {
-	    elev = zA;
-	}
-    }
-
-    return(elev);
-}
-
-
-#if 0
-// Write out a node file that can be used by the "triangle" program.
-// Check for an optional "index.node.ex" file in case there is a .poly
-// file to go along with this node file.  Include these nodes first
-// since they are referenced by position from the .poly file.
-void FGArray::outputmesh_output_nodes( const string& fg_root, FGBucket& p )
-{
-    double exnodes[MAX_EX_NODES][3];
-    struct stat stat_buf;
-    string dir, file;
-    char exfile[256];
-#ifdef WIN32
-    char tmp_path[256];
-#endif
-    string command;
-    FILE *fd;
-    int colmin, colmax, rowmin, rowmax;
-    int i, j, count, excount, result;
-
-    // determine dimensions
-    colmin = p.get_x() * ( (cols - 1) / 8);
-    colmax = colmin + ( (cols - 1) / 8);
-    rowmin = p.get_y() * ( (rows - 1) / 8);
-    rowmax = rowmin + ( (rows - 1) / 8);
-    cout << "  dumping region = " << colmin << "," << rowmin << " to " <<
-	colmax << "," << rowmax << "\n";
-
-    // generate the base directory
-    string base_path = p.gen_base_path();
-    cout << "  fg_root = " << fg_root << "  Base Path = " << base_path << endl;
-    dir = fg_root + "/Scenery/" + base_path;
-    cout << "  Dir = " << dir << endl;
-    
-    // stat() directory and create if needed
-    errno = 0;
-    result = stat(dir.c_str(), &stat_buf);
-    if ( result != 0 && errno == ENOENT ) {
-	cout << "  Creating directory\n";
-
-	command = "mkdir -p " + dir + "\n";
-	system( command.c_str() );
-    } else {
-	// assume directory exists
-    }
-
-    // get index and generate output file name
-    file = dir + "/" + p.gen_index_str() + ".node";
-
-    // get (optional) extra node file name (in case there is matching
-    // .poly file.
-    exfile = file + ".ex";
-
-    // load extra nodes if they exist
-    excount = 0;
-    if ( (fd = fopen(exfile, "r")) != NULL ) {
-	int junki;
-	fscanf(fd, "%d %d %d %d", &excount, &junki, &junki, &junki);
-
-	if ( excount > MAX_EX_NODES - 1 ) {
-	    printf("Error, too many 'extra' nodes, increase array size\n");
-	    exit(-1);
-	} else {
-	    printf("    Expecting %d 'extra' nodes\n", excount);
-	}
-
-	for ( i = 1; i <= excount; i++ ) {
-	    fscanf(fd, "%d %lf %lf %lf\n", &junki, 
-		   &exnodes[i][0], &exnodes[i][1], &exnodes[i][2]);
-	    printf("(extra) %d %.2f %.2f %.2f\n", 
-		    i, exnodes[i][0], exnodes[i][1], exnodes[i][2]);
-	}
-	fclose(fd);
-    }
-
-    printf("Creating node file:  %s\n", file);
-    fd = fopen(file, "w");
-
-    // first count regular nodes to generate header
-    count = 0;
-    for ( j = rowmin; j <= rowmax; j++ ) {
-	for ( i = colmin; i <= colmax; i++ ) {
-	    if ( out_data[i][j] > -9000.0 ) {
-		count++;
-	    }
-	}
-	// printf("    count = %d\n", count);
-    }
-    fprintf(fd, "%d 2 1 0\n", count + excount);
-
-    // now write out extra node data
-    for ( i = 1; i <= excount; i++ ) {
-	fprintf(fd, "%d %.2f %.2f %.2f\n", 
-		i, exnodes[i][0], exnodes[i][1], exnodes[i][2]);
-    }
-
-    // write out actual node data
-    count = excount + 1;
-    for ( j = rowmin; j <= rowmax; j++ ) {
-	for ( i = colmin; i <= colmax; i++ ) {
-	    if ( out_data[i][j] > -9000.0 ) {
-		fprintf(fd, "%d %.2f %.2f %.2f\n", 
-			count++, 
-			originx + (double)i * col_step, 
-			originy + (double)j * row_step,
-			out_data[i][j]);
-	    }
-	}
-	// printf("    count = %d\n", count);
-    }
-
-    fclose(fd);
-}
-#endif
-
-
-FGArray::~FGArray( void ) {
-    // printf("class FGArray DEstructor called.\n");
-    delete [] in_data;
-    // delete [] out_data;
-}
-
-
diff --git a/Tools/Construct/Array/array.hxx b/Tools/Construct/Array/array.hxx
deleted file mode 100644
index cab678ac8..000000000
--- a/Tools/Construct/Array/array.hxx
+++ /dev/null
@@ -1,123 +0,0 @@
-// array.hxx -- Array management class
-//
-// Written by Curtis Olson, started March 1998.
-//
-// Copyright (C) 1998 - 1999  Curtis L. Olson  - curt@flightgear.org
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// $Id$
-
-
-#ifndef _ARRAY_HXX
-#define _ARRAY_HXX
-
-
-#ifndef __cplusplus                                                          
-# error This library requires C++
-#endif                                   
-
-
-#include 
-
-#include 
-
-#include 
-#include 
-#include 
-
-#include 
- -FG_USING_STD(vector); - - -#define ARRAY_SIZE 1200 -#define ARRAY_SIZE_1 1201 - - -class FGArray { - -private: - - // file pointer for input - // gzFile fd; - fg_gzifstream *in; - - // coordinates (in arc seconds) of south west corner - double originx, originy; - - // number of columns and rows - int cols, rows; - - // Distance between column and row data points (in arc seconds) - double col_step, row_step; - - // pointers to the actual grid data allocated here - float (*in_data)[ARRAY_SIZE_1]; - // float (*out_data)[ARRAY_SIZE_1]; - - // output nodes - point_list corner_list; - point_list node_list; - -public: - - // Constructor - FGArray( void ); - FGArray( const string& file ); - - // Destructor - ~FGArray( void ); - - // open an Array file (use "-" if input is coming from stdin) - int open ( const string& file ); - - // close a Array file - int close(); - - // parse a Array file - int parse( FGBucket& b ); - - // Use least squares to fit a simpler data set to dem data. - // Return the number of fitted nodes - int fit( double error ); - - // add a node to the output corner node list - void add_corner_node( int i, int j, double val ); - - // add a node to the output fitted node list - void add_fit_node( int i, int j, double val ); - - // return the current altitude based on grid data. We should - // rewrite this to interpolate exact values, but for now this is - // good enough - double interpolate_altitude( double lon, double lat ) const; - - // Informational methods - inline double get_originx() const { return originx; } - inline double get_originy() const { return originy; } - inline int get_cols() const { return cols; } - inline int get_rows() const { return rows; } - inline double get_col_step() const { return col_step; } - inline double get_row_step() const { return row_step; } - - inline point_list get_corner_node_list() const { return corner_list; } - inline point_list get_fit_node_list() const { return node_list; } -}; - - -#endif // _ARRAY_HXX - - diff --git a/Tools/Construct/Array/testarray.cxx b/Tools/Construct/Array/testarray.cxx deleted file mode 100644 index 1a0a4d55c..000000000 --- a/Tools/Construct/Array/testarray.cxx +++ /dev/null @@ -1,33 +0,0 @@ -#include - -#include "array.hxx" - -main(int argc, char **argv) { - double lon, lat; - - if ( argc != 2 ) { - cout << "Usage: " << argv[0] << " work_dir" << endl; - exit(-1); - } - - string work_dir = argv[1]; - - lon = -146.248360; lat = 61.133950; // PAVD (Valdez, AK) - lon = -110.664244; lat = 33.352890; // P13 - - FGBucket b( lon, lat ); - string base = b.gen_base_path(); - string path = work_dir + "/Scenery/" + base; - - string arrayfile = path + "/" + b.gen_index_str() + ".dem"; - cout << "arrayfile = " << arrayfile << endl; - - FGArray a(arrayfile); - a.parse( b ); - - lon *= 3600; - lat *= 3600; - cout << " " << a.interpolate_altitude(lon, lat) << endl; - - a.fit( 100 ); -} diff --git a/Tools/Construct/Clipper/Makefile.am b/Tools/Construct/Clipper/Makefile.am deleted file mode 100644 index 8d0745b0c..000000000 --- a/Tools/Construct/Clipper/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -noinst_LIBRARIES = libClipper.a - -libClipper_a_SOURCES = clipper.cxx clipper.hxx - -noinst_PROGRAMS = testclipper - -testclipper_SOURCES = testclipper.cxx - -testclipper_LDADD = \ - $(top_builddir)/Tools/Construct/Clipper/libClipper.a \ - $(top_builddir)/Tools/Construct/Triangulate/libTriangulate.a \ - $(top_builddir)/Tools/Lib/Polygon/libPolygon.a \ - $(top_builddir)/Lib/Debug/libDebug.a \ - $(top_builddir)/Lib/Misc/libMisc.a \ - $(top_builddir)/Lib/zlib/libz.a \ - -lgfc -lgpc - -INCLUDES += -I$(top_builddir) \ - -I$(top_builddir)/Lib \ - -I$(top_builddir)/Tools/Lib \ - -I$(top_builddir)/Tools/Construct diff --git a/Tools/Construct/Clipper/clipper.cxx b/Tools/Construct/Clipper/clipper.cxx deleted file mode 100644 index 6f51394dc..000000000 --- a/Tools/Construct/Clipper/clipper.cxx +++ /dev/null @@ -1,439 +0,0 @@ -// clipper.cxx -- top level routines to take a series of arbitrary areas and -// produce a tight fitting puzzle pieces that combine to make a -// tile -// -// Written by Curtis Olson, started February 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - - -#include -#include -#include -#include - -#include "clipper.hxx" - - -// Constructor -FGClipper::FGClipper( void ) { -} - - -// Destructor -FGClipper::~FGClipper( void ) { -} - - -// Initialize Clipper (allocate and/or connect structures) -bool FGClipper::init() { - // v_list.num_vertices = 0; - // v_list.vertex = new gpc_vertex[FG_MAX_VERTICES];; - - for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) { - polys_in.polys[i].clear(); - } - - return true; -} - - -// Load a polygon definition file -bool FGClipper::load_polys(const string& path) { - string poly_name; - AreaType poly_type = DefaultArea; - int contours, count, i, j; - int hole_flag; - double startx, starty, x, y, lastx, lasty; - - FG_LOG( FG_CLIPPER, FG_INFO, "Loading " << path << " ..." ); - - fg_gzifstream in( path ); - - if ( !in ) { - FG_LOG( FG_CLIPPER, FG_ALERT, "Cannot open file: " << path ); - exit(-1); - } - - // gpc_polygon *poly = new gpc_polygon; - // poly->num_contours = 0; - // poly->contour = NULL; - FGPolygon poly; - - Point3D p; - in >> skipcomment; - while ( !in.eof() ) { - in >> poly_name; - cout << "poly name = " << poly_name << endl; - poly_type = get_area_type( poly_name ); - cout << "poly type (int) = " << (int)poly_type << endl; - in >> contours; - cout << "num contours = " << contours << endl; - - poly.erase(); - - for ( i = 0; i < contours; ++i ) { - in >> count; - - if ( count < 3 ) { - FG_LOG( FG_CLIPPER, FG_ALERT, - "Polygon with less than 3 data points." ); - exit(-1); - } - - in >> hole_flag; - - in >> startx; - in >> starty; - p = Point3D(startx, starty, 0.0); - poly.add_node( i, p ); - FG_LOG( FG_CLIPPER, FG_BULK, "0 = " - << startx << ", " << starty ); - - for ( j = 1; j < count - 1; ++j ) { - in >> x; - in >> y; - p = Point3D( x, y, 0.0 ); - poly.add_node( i, p ); - FG_LOG( FG_CLIPPER, FG_BULK, j << " = " << x << ", " << y ); - } - - in >> lastx; - in >> lasty; - - if ( (fabs(startx - lastx) < FG_EPSILON) - && (fabs(starty - lasty) < FG_EPSILON) ) { - // last point same as first, discard - } else { - p = Point3D( lastx, lasty, 0.0 ); - poly.add_node( i, p ); - FG_LOG( FG_CLIPPER, FG_BULK, count - 1 << " = " - << lastx << ", " << lasty ); - } - - // gpc_add_contour( poly, &v_list, hole_flag ); - } - - in >> skipcomment; - } - - int area = (int)poly_type; - - // if ( area == OceanArea ) { - // TEST - Ignore - // } else - - if ( area < FG_MAX_AREA_TYPES ) { - polys_in.polys[area].push_back(poly); - } else { - FG_LOG( FG_CLIPPER, FG_ALERT, "Polygon type out of range = " - << (int)poly_type); - exit(-1); - } - - // FILE *ofp= fopen("outfile", "w"); - // gpc_write_polygon(ofp, &polys.landuse); - - return true; -} - - -// remove any slivers from in polygon and move them to out polygon. -void FGClipper::move_slivers( FGPolygon& in, FGPolygon& out ) { - cout << "Begin move slivers" << endl; - // traverse each contour of the polygon and attempt to identify - // likely slivers - - out.erase(); - - double angle_cutoff = 10.0 * DEG_TO_RAD; - double area_cutoff = 0.00001; - double min_angle; - double area; - - point_list contour; - int hole_flag; - - // process contours in reverse order so deleting a contour doesn't - // foul up our sequence - for ( int i = in.contours() - 1; i >= 0; --i ) { - cout << "contour " << i << endl; - - min_angle = in.minangle_contour( i ); - area = in.area_contour( i ); - - cout << " min_angle (rad) = " - << min_angle << endl; - cout << " min_angle (deg) = " - << min_angle * 180.0 / FG_PI << endl; - cout << " area = " << area << endl; - - if ( ((min_angle < angle_cutoff) && (area < area_cutoff)) || - ( area < area_cutoff / 10.0) ) - { - cout << " WE THINK IT'S A SLIVER!" << endl; - - // check if this is a hole - hole_flag = in.get_hole_flag( i ); - - if ( hole_flag ) { - // just delete/eliminate/remove sliver holes - cout << "just deleting a sliver hole" << endl; - in.delete_contour( i ); - } else { - // move sliver contour to out polygon - contour = in.get_contour( i ); - in.delete_contour( i ); - out.add_contour( contour, hole_flag ); - } - } - } -} - - -// for each sliver contour, see if a union with another polygon yields -// a polygon with no increased contours (i.e. the sliver is adjacent -// and can be merged.) If so, replace the clipped polygon with the -// new polygon that has the sliver merged in. -void FGClipper::merge_slivers( FGPolyList& clipped, FGPolygon& slivers ) { - FGPolygon poly, result, sliver; - point_list contour; - int original_contours, result_contours; - bool done; - - for ( int i = 0; i < slivers.contours(); ++i ) { - cout << "Merging sliver = " << i << endl; - - // make the sliver polygon - contour = slivers.get_contour( i ); - sliver.erase(); - sliver.add_contour( contour, 0 ); - done = false; - - for ( int area = 0; area < FG_MAX_AREA_TYPES && !done; ++area ) { - cout << " testing area = " << area << " with " - << clipped.polys[area].size() << " polys" << endl; - for ( int j = 0; - j < (int)clipped.polys[area].size() && !done; - ++j ) - { - cout << " polygon = " << j << endl; - - poly = clipped.polys[area][j]; - original_contours = poly.contours(); - result = polygon_union( poly, sliver ); - result_contours = result.contours(); - - if ( original_contours == result_contours ) { - cout << " FOUND a poly to merge the sliver with" << endl; - clipped.polys[area][j] = result; - done = true; - // poly.write("orig"); - // sliver.write("sliver"); - // result.write("result"); - // cout << "press return: "; - // string input; - // cin >> input; - } else { - cout << " poly not a match" << endl; - cout << " original = " << original_contours - << " result = " << result_contours << endl; - cout << " sliver = " << endl; - for ( int k = 0; k < (int)contour.size(); ++k ) { - cout << " " << contour[k].x() << ", " - << contour[k].y() << endl; - } - } - } - } - if ( !done ) { - cout << "no suitable polys found for sliver merge" << endl; - } - } -} - - -// Do actually clipping work -bool FGClipper::clip_all(const point2d& min, const point2d& max) { - FGPolygon accum, result_union, tmp; - FGPolygon result_diff, slivers, remains; - // gpcpoly_iterator current, last; - - FG_LOG( FG_CLIPPER, FG_INFO, "Running master clipper" ); - - accum.erase(); - - cout << " (" << min.x << "," << min.y << ") (" - << max.x << "," << max.y << ")" << endl; - - // set up clipping tile - polys_in.safety_base.erase(); - polys_in.safety_base.add_node( 0, Point3D(min.x, min.y, 0.0) ); - polys_in.safety_base.add_node( 0, Point3D(max.x, min.y, 0.0) ); - polys_in.safety_base.add_node( 0, Point3D(max.x, max.y, 0.0) ); - polys_in.safety_base.add_node( 0, Point3D(min.x, max.y, 0.0) ); - - // int count = 0; - // process polygons in priority order - for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) { - cout << "num polys of type (" << i << ") = " - << polys_in.polys[i].size() << endl; - // current = polys_in.polys[i].begin(); - // last = polys_in.polys[i].end(); - // for ( ; current != last; ++current ) { - for( int j = 0; j < (int)polys_in.polys[i].size(); ++j ) { - FGPolygon current = polys_in.polys[i][j]; - FG_LOG( FG_CLIPPER, FG_DEBUG, get_area_name( (AreaType)i ) - << " = " << current.contours() ); - -#ifdef EXTRA_SAFETY_CLIP - // clip to base tile - tmp = polygon_int( current, polys_in.safety_base ); -#else - tmp = current; -#endif - - // clip current polygon against previous higher priority - // stuff - - // result_diff = new gpc_polygon; - // result_diff->num_contours = 0; - // result_diff->contour = NULL; - - if ( accum.contours() == 0 ) { - result_diff = tmp; - result_union = tmp; - } else { - // cout << "DIFF: tmp.num_contours = " << tmp.num_contours - // << " accum.num_contours = " << accum.num_contours - // << endl; - // tmp output accum - - // FILE *ofp= fopen("tmp-debug", "w"); - // gpc_write_polygon(ofp, 1, &tmp); - // fclose(ofp); - - // ofp= fopen("accum-debug", "w"); - // gpc_write_polygon(ofp, 1, &accum); - // fclose(ofp); - - result_diff = polygon_diff( tmp, accum); - result_union = polygon_union( tmp, accum); - } - - /* - cout << "original contours = " << tmp.num_contours << endl; - - for ( int j = 0; j < tmp.num_contours; j++ ) { - for (int k = 0;k < tmp.contour[j].num_vertices;k++ ) { - cout << tmp.contour[j].vertex[k].x << "," - << tmp.contour[j].vertex[k].y << endl; - } - } - - cout << "clipped contours = " << result_diff->num_contours << endl; - - for ( int j = 0; j < result_diff->num_contours; j++ ) { - for (int k = 0;k < result_diff->contour[j].num_vertices;k++ ) { - cout << result_diff->contour[j].vertex[k].x << "," - << result_diff->contour[j].vertex[k].y << endl; - } - } - */ - - // only add to output list if the clip left us with a polygon - if ( result_diff.contours() > 0 ) { - // move slivers from result_diff polygon to slivers polygon - move_slivers(result_diff, slivers); - cout << " After sliver move:" << endl; - cout << " result_diff = " << result_diff.contours() << endl; - cout << " slivers = " << slivers.contours() << endl; - - // merge any slivers with previously clipped - // neighboring polygons - if ( slivers.contours() > 0 ) { - merge_slivers(polys_clipped, slivers); - } - - // add the sliverless result polygon (from after the - // move_slivers) to the clipped polys list - if ( result_diff.contours() > 0 ) { - polys_clipped.polys[i].push_back(result_diff); - } - - // char filename[256]; - // sprintf(filename, "next-result-%02d", count++); - // FILE *tmpfp= fopen(filename, "w"); - // gpc_write_polygon(tmpfp, 1, result_diff); - // fclose(tmpfp); - } - accum = result_union; - } - } - - // finally, what ever is left over goes to ocean - - // clip to accum against original base tile - // remains = new gpc_polygon; - // remains->num_contours = 0; - // remains->contour = NULL; - remains = polygon_diff( polys_in.safety_base, accum ); - - if ( remains.contours() > 0 ) { - cout << "remains contours = " << remains.contours() << endl; - // move slivers from remains polygon to slivers polygon - move_slivers(remains, slivers); - cout << " After sliver move:" << endl; - cout << " remains = " << remains.contours() << endl; - cout << " slivers = " << slivers.contours() << endl; - - // merge any slivers with previously clipped - // neighboring polygons - if ( slivers.contours() > 0 ) { - merge_slivers(polys_clipped, slivers); - } - - if ( remains.contours() > 0 ) { - polys_clipped.polys[(int)OceanArea].push_back(remains); - } - } - -#if 0 - FILE *ofp; - - // tmp output accum - if ( accum.num_contours ) { - ofp = fopen("accum", "w"); - gpc_write_polygon(ofp, 1, &accum); - fclose(ofp); - } - - // tmp output safety_base - if ( remains->num_contours ) { - ofp= fopen("remains", "w"); - gpc_write_polygon(ofp, 1, remains); - fclose(ofp); - } -#endif - - return true; -} - - diff --git a/Tools/Construct/Clipper/clipper.hxx b/Tools/Construct/Clipper/clipper.hxx deleted file mode 100644 index def0fbbac..000000000 --- a/Tools/Construct/Clipper/clipper.hxx +++ /dev/null @@ -1,117 +0,0 @@ -// clipper.hxx -- top level routines to take a series of arbitrary areas and -// produce a tight fitting puzzle pieces that combine to make a -// tile -// -// Written by Curtis Olson, started February 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - - -#ifndef _CLIPPER_HXX -#define _CLIPPER_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#if 0 -// include Generic Polygon Clipping Library -// -// http://www.cs.man.ac.uk/aig/staff/alan/software/ -// -extern "C" { -#include -} -#endif - -#include
-#include - -#include STL_STRING -#include - -FG_USING_STD(string); -FG_USING_STD(vector); - - -// typedef vector < gpc_polygon * > gpcpoly_container; -// typedef gpcpoly_container::iterator gpcpoly_iterator; -// typedef gpcpoly_container::const_iterator const_gpcpoly_iterator; - - -#define FG_MAX_AREA_TYPES 20 -#define EXTRA_SAFETY_CLIP -// #define FG_MAX_VERTICES 100000 - - -class FGPolyList { -public: - poly_list polys[FG_MAX_AREA_TYPES]; - FGPolygon safety_base; -}; - - -class FGClipper { - -private: - - // gpc_vertex_list v_list; - // static gpc_polygon poly; - FGPolyList polys_in, polys_clipped; - -public: - - // Constructor - FGClipper( void ); - - // Destructor - ~FGClipper( void ); - - // Initialize Clipper (allocate and/or connect structures) - bool init(); - - // Load a polygon definition file - bool load_polys(const string& path); - - // remove any slivers from in polygon and move them to out - // polygon. - void move_slivers( FGPolygon& in, FGPolygon& out ); - - // for each sliver contour, see if a union with another polygon - // yields a polygon with no increased contours (i.e. the sliver is - // adjacent and can be merged.) If so, replace the clipped - // polygon with the new polygon that has the sliver merged in. - void merge_slivers( FGPolyList& clipped, FGPolygon& slivers ); - - // Do actually clipping work - bool clip_all(const point2d& min, const point2d& max); - - // return output poly list - inline FGPolyList get_polys_clipped() const { return polys_clipped; } -}; - - -#endif // _CLIPPER_HXX - - diff --git a/Tools/Construct/Clipper/testclipper.cxx b/Tools/Construct/Clipper/testclipper.cxx deleted file mode 100644 index 6170e4573..000000000 --- a/Tools/Construct/Clipper/testclipper.cxx +++ /dev/null @@ -1,110 +0,0 @@ -// main.cxx -- sample use of the clipper lib -// -// Written by Curtis Olson, started February 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - - -#include -#include - -#include "clipper.hxx" - - -int main( int argc, char **argv ) { - point2d global_min, global_max; - - fglog().setLogLevels( FG_ALL, FG_DEBUG ); - - global_min.x = global_min.y = 200; - global_max.y = global_max.x = -200; - - FGClipper clipper; - clipper.init(); - - if ( argc < 2 ) { - FG_LOG( FG_CLIPPER, FG_ALERT, "Usage: " << argv[0] - << " file1 file2 ..." ); - exit(-1); - } - - // process all specified polygon files - for ( int i = 1; i < argc; i++ ) { - string full_path = argv[i]; - - // determine bucket for this polygon - int pos = full_path.rfind("/"); - string file_name = full_path.substr(pos + 1); - cout << "file name = " << file_name << endl; - - pos = file_name.find("."); - string base_name = file_name.substr(0, pos); - cout << "base_name = " << base_name << endl; - - long int index; - sscanf( base_name.c_str(), "%ld", &index); - FGBucket b(index); - cout << "bucket = " << b << endl; - - // calculate bucket dimensions - point2d c, min, max; - - c.x = b.get_center_lon(); - c.y = b.get_center_lat(); - double span = bucket_span(c.y); - - if ( (c.y >= -89.0) && (c.y < 89.0) ) { - min.x = c.x - span / 2.0; - max.x = c.x + span / 2.0; - min.y = c.y - FG_HALF_BUCKET_SPAN; - max.y = c.y + FG_HALF_BUCKET_SPAN; - } else if ( c.y < -89.0) { - min.x = -90.0; - max.x = -89.0; - min.y = -180.0; - max.y = 180.0; - } else if ( c.y >= 89.0) { - min.x = 89.0; - max.x = 90.0; - min.y = -180.0; - max.y = 180.0; - } else { - FG_LOG ( FG_GENERAL, FG_ALERT, - "Out of range latitude in clip_and_write_poly() = " - << c.y ); - } - - if ( min.x < global_min.x ) global_min.x = min.x; - if ( min.y < global_min.y ) global_min.y = min.y; - if ( max.x > global_max.x ) global_max.x = max.x; - if ( max.y > global_max.y ) global_max.y = max.y; - - // finally, load the polygon(s) from this file - clipper.load_polys( full_path ); - } - - // do the clipping - clipper.clip_all(global_min, global_max); - - FG_LOG( FG_CLIPPER, FG_INFO, "finished main" ); - - return 0; -} - diff --git a/Tools/Construct/Combine/Makefile.am b/Tools/Construct/Combine/Makefile.am deleted file mode 100644 index c8c640202..000000000 --- a/Tools/Construct/Combine/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -noinst_LIBRARIES = libCombine.a - -libCombine_a_SOURCES = genfans.cxx genfans.hxx - -INCLUDES += \ - -I$(top_builddir) \ - -I$(top_builddir)/Lib \ - -I$(top_builddir)/Tools/Lib \ - -I$(top_builddir)/Tools/Construct diff --git a/Tools/Construct/Combine/genfans.cxx b/Tools/Construct/Combine/genfans.cxx deleted file mode 100644 index 78f0e7075..000000000 --- a/Tools/Construct/Combine/genfans.cxx +++ /dev/null @@ -1,244 +0,0 @@ -// genfans.cxx -- Combine individual triangles into more optimal fans. -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include "genfans.hxx" - - -// make sure the list is expanded at least to hold "n" and then push -// "i" onto the back of the "n" list. -void FGGenFans::add_and_expand( reverse_list& by_node, int n, int i ) { - int_list empty; - - int size = (int)by_node.size(); - if ( size > n ) { - // ok - } else { - // cout << "capacity = " << by_node.capacity() << endl; - // cout << "size = " << size << " n = " << n - // << " need to push = " << n - size + 1 << endl; - for ( int i = 0; i < n - size + 1; ++i ) { - by_node.push_back(empty); - } - } - - by_node[n].push_back(i); -} - - -// given an input triangle, shuffle nodes so that "center" is the -// first node, but maintain winding order. -static FGTriEle canonify( const FGTriEle& t, int center ) { - if ( t.get_n1() == center ) { - // already ok - return t; - } else if ( t.get_n2() == center ) { - return FGTriEle( t.get_n2(), t.get_n3(), t.get_n1(), 0.0 ); - } else if ( t.get_n3() == center ) { - return FGTriEle( t.get_n3(), t.get_n1(), t.get_n2(), 0.0 ); - } else { - cout << "ERROR, index doesn't refer to this triangle!!!" << endl; - exit(-1); - } -} - -// returns a list of triangle indices -static int_list make_best_fan( const triele_list& master_tris, - const int center, const int_list& local_tris ) -{ - int_list best_result; - - // try starting with each of local_tris to find the best fan - // arrangement - for ( int start = 0; start < (int)local_tris.size(); ++start ) { - // cout << "trying with first triangle = " << local_tris[start] << endl; - - int_list tmp_result; - tmp_result.clear(); - - FGTriEle current_tri; - FGTriEle test; - current_tri = canonify( master_tris[local_tris[start]], center ); - tmp_result.push_back( local_tris[start] ); - - // follow the ring - int next = -1; - bool matches = true; - while ( (next != start) && matches ) { - // find next triangle in ring - matches = false; - for ( int i = 0; i < (int)local_tris.size(); ++i ) { - test = canonify( master_tris[local_tris[i]], center ); - if ( current_tri.get_n3() == test.get_n2() ) { - if ( i != start ) { - // cout << " next triangle = " << local_tris[i] << endl; - current_tri = test; - tmp_result.push_back( local_tris[i] ); - matches = true; - next = i; - break; - } - } - } - } - - if ( tmp_result.size() == local_tris.size() ) { - // we found a complete usage, no need to go on - // cout << "we found a complete usage, no need to go on" << endl; - best_result = tmp_result; - break; - } else if ( tmp_result.size() > best_result.size() ) { - // we found a better way to fan - // cout << "we found a better fan arrangement" << endl; - best_result = tmp_result; - } - } - - return best_result; -} - - -static bool in_fan(int index, const int_list& fan ) { - const_int_list_iterator current = fan.begin(); - const_int_list_iterator last = fan.end(); - - for ( ; current != last; ++current ) { - if ( index == *current ) { - return true; - } - } - - return false; -} - - -// recursive build fans from triangle list -fan_list FGGenFans::greedy_build( triele_list tris ) { - cout << "starting greedy build of fans" << endl; - - fans.clear(); - - while ( ! tris.empty() ) { - // cout << "building reverse_list" << endl; - reverse_list by_node; - by_node.clear(); - - // traverse the triangle list and for each node, build a list of - // triangles that attach to it. - - for ( int i = 0; i < (int)tris.size(); ++i ) { - int n1 = tris[i].get_n1(); - int n2 = tris[i].get_n2(); - int n3 = tris[i].get_n3(); - - add_and_expand( by_node, n1, i ); - add_and_expand( by_node, n2, i ); - add_and_expand( by_node, n3, i ); - } - - // find the node in the tris list that attaches to the most - // triangles - - // cout << "find most connected node" << endl; - - int_list biggest_group; - reverse_list_iterator r_current = by_node.begin(); - reverse_list_iterator r_last = by_node.end(); - int index = 0; - int counter = 0; - for ( ; r_current != r_last; ++r_current ) { - if ( r_current->size() > biggest_group.size() ) { - biggest_group = *r_current; - index = counter; - } - ++counter; - } - // cout << "triangle pool = " << tris.size() << endl; - // cout << "biggest_group = " << biggest_group.size() << endl; - // cout << "center node = " << index << endl; - - // make the best fan we can out of this group - // cout << "before make_best_fan()" << endl; - int_list best_fan = make_best_fan( tris, index, biggest_group ); - // cout << "after make_best_fan()" << endl; - - // generate point form of best_fan - int_list node_list; - node_list.clear(); - - int_list_iterator i_start = best_fan.begin(); - int_list_iterator i_current = i_start; - int_list_iterator i_last = best_fan.end(); - for ( ; i_current != i_last; ++i_current ) { - FGTriEle t = canonify( tris[*i_current], index ); - if ( i_start == i_current ) { - node_list.push_back( t.get_n1() ); - node_list.push_back( t.get_n2() ); - } - node_list.push_back( t.get_n3() ); - } - // cout << "best list size = " << node_list.size() << endl; - - // add this fan to the fan list - fans.push_back( node_list ); - - // delete the triangles in best_fan out of tris and repeat - triele_list_iterator t_current = tris.begin(); - triele_list_iterator t_last = tris.end(); - counter = 0; - while ( t_current != t_last ) { - if ( in_fan(counter, best_fan) ) { - // cout << "erasing " - // << t_current->get_n1() << "," - // << t_current->get_n2() << "," - // << t_current->get_n3() - // << " from master tri pool" - // << endl; - tris.erase( t_current ); - } else { - ++t_current; - } - ++counter; - } - } - - cout << "end of greedy build of fans" << endl; - cout << "average fan size = " << ave_size() << endl; - - return fans; -} - - -// report average fan size -double FGGenFans::ave_size() { - double sum = 0.0; - - fan_list_iterator current = fans.begin(); - fan_list_iterator last = fans.end(); - for ( ; current != last; ++current ) { - sum += current->size(); - } - - return sum / (double)fans.size(); -} - - diff --git a/Tools/Construct/Combine/genfans.hxx b/Tools/Construct/Combine/genfans.hxx deleted file mode 100644 index c5eb0a214..000000000 --- a/Tools/Construct/Combine/genfans.hxx +++ /dev/null @@ -1,80 +0,0 @@ -// genfans.hxx -- Combine individual triangles into more optimal fans. -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _GENFANS_HXX -#define _GENFANS_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include - -#include
-#include - -FG_USING_STD(vector); - - -typedef vector < int_list > fan_list; -typedef fan_list::iterator fan_list_iterator; -typedef fan_list::const_iterator const_fan_list_iterator; - -typedef vector < int_list > reverse_list; -typedef reverse_list::iterator reverse_list_iterator; -typedef reverse_list::const_iterator const_reverse_list_iterator; - - - -class FGGenFans { - -private: - - fan_list fans; - - // make sure the list is expanded at least to hold "n" and then - // push "i" onto the back of the "n" list. - void add_and_expand( reverse_list& by_node, int n, int i ); - -public: - - // Constructor && Destructor - inline FGGenFans() { } - inline ~FGGenFans() { } - - // recursive build fans from triangle list - // fan_list greedy_build( triele_list tris ); - fan_list greedy_build( triele_list tris ); - - // report average fan size - double ave_size(); -}; - - -#endif // _GENFANS_HXX - - diff --git a/Tools/Construct/GenOutput/Makefile.am b/Tools/Construct/GenOutput/Makefile.am deleted file mode 100644 index 28ad535a2..000000000 --- a/Tools/Construct/GenOutput/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -noinst_LIBRARIES = libGenOutput.a - -libGenOutput_a_SOURCES = genobj.cxx genobj.hxx - -INCLUDES += \ - -I$(top_builddir) \ - -I$(top_builddir)/Lib \ - -I$(top_builddir)/Tools/Lib \ - -I$(top_builddir)/Tools/Construct diff --git a/Tools/Construct/GenOutput/genobj.cxx b/Tools/Construct/GenOutput/genobj.cxx deleted file mode 100644 index 7d3d1e11f..000000000 --- a/Tools/Construct/GenOutput/genobj.cxx +++ /dev/null @@ -1,398 +0,0 @@ -// genobj.hxx -- Generate the flight gear "obj" file format from the -// triangle output -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include - -#include -#include - -#include "genobj.hxx" - - -// calculate the global bounding sphere. Center is the average of the -// points. -void FGGenOutput::calc_gbs( FGConstruct& c ) { - double dist_squared; - double radius_squared = 0; - - gbs_center = Point3D( 0.0 ); - - point_list wgs84_nodes = c.get_wgs84_nodes(); - const_point_list_iterator current = wgs84_nodes.begin(); - const_point_list_iterator last = wgs84_nodes.end(); - - for ( ; current != last; ++current ) { - gbs_center += *current; - } - - gbs_center /= wgs84_nodes.size(); - - current = wgs84_nodes.begin(); - for ( ; current != last; ++current ) { - dist_squared = gbs_center.distance3Dsquared(*current); - if ( dist_squared > radius_squared ) { - radius_squared = dist_squared; - } - } - - gbs_radius = sqrt(radius_squared); -} - - -#define FG_STANDARD_TEXTURE_DIMENSION 1000.0 // meters - -// traverse the specified fan and attempt to calculate "none -// stretching" texture coordinates -int_list FGGenOutput::calc_tex_coords( FGConstruct& c, point_list geod_nodes, - int_list fan ) -{ - // cout << "calculating texture coordinates for a specific fan of size = " - // << fan.size() << endl; - - FGBucket b = c.get_bucket(); - double clat = b.get_center_lat(); - double clat_rad = clat * DEG_TO_RAD; - double cos_lat = cos( clat_rad ); - double local_radius = cos_lat * EQUATORIAL_RADIUS_M; - double local_perimeter = 2.0 * local_radius * FG_PI; - double degree_width = local_perimeter / 360.0; - - // cout << "clat = " << clat << endl; - // cout << "clat (radians) = " << clat_rad << endl; - // cout << "cos(lat) = " << cos_lat << endl; - // cout << "local_radius = " << local_radius << endl; - // cout << "local_perimeter = " << local_perimeter << endl; - // cout << "degree_width = " << degree_width << endl; - - double perimeter = 2.0 * EQUATORIAL_RADIUS_M * FG_PI; - double degree_height = perimeter / 360.0; - // cout << "degree_height = " << degree_height << endl; - - // find min/max of fan - Point3D min, max, p, t; - bool first = true; - - for ( int i = 0; i < (int)fan.size(); ++i ) { - p = geod_nodes[ fan[i] ]; - t.setx( p.x() * ( degree_width / FG_STANDARD_TEXTURE_DIMENSION ) ); - t.sety( p.y() * ( degree_height / FG_STANDARD_TEXTURE_DIMENSION ) ); - - if ( first ) { - min = max = t; - first = false; - } else { - if ( t.x() < min.x() ) { - min.setx( t.x() ); - } - if ( t.y() < min.y() ) { - min.sety( t.y() ); - } - if ( t.x() > max.x() ) { - max.setx( t.x() ); - } - if ( t.y() > max.y() ) { - max.sety( t.y() ); - } - } - } - min.setx( (double)( (int)min.x() - 1 ) ); - min.sety( (double)( (int)min.y() - 1 ) ); - // cout << "found min = " << min << endl; - - // generate tex_list - Point3D shifted_t; - int index; - int_list tex; - tex.clear(); - for ( int i = 0; i < (int)fan.size(); ++i ) { - p = geod_nodes[ fan[i] ]; - t.setx( p.x() * ( degree_width / FG_STANDARD_TEXTURE_DIMENSION ) ); - t.sety( p.y() * ( degree_height / FG_STANDARD_TEXTURE_DIMENSION ) ); - shifted_t = t - min; - if ( shifted_t.x() < FG_EPSILON ) { - shifted_t.setx( 0.0 ); - } - if ( shifted_t.y() < FG_EPSILON ) { - shifted_t.sety( 0.0 ); - } - shifted_t.setz( 0.0 ); - // cout << "shifted_t = " << shifted_t << endl; - index = tex_coords.unique_add( shifted_t ); - tex.push_back( index ); - } - - return tex; -} - - -// build the necessary output structures based on the triangulation -// data -int FGGenOutput::build( FGConstruct& c ) { - FGTriNodes trinodes = c.get_tri_nodes(); - - // copy the geodetic node list into this class - geod_nodes = trinodes.get_node_list(); - - // copy the triangle list into this class - tri_elements = c.get_tri_elements(); - - // build the trifan list - cout << "total triangles = " << tri_elements.size() << endl; - FGGenFans f; - for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) { - triele_list area_tris; - area_tris.erase( area_tris.begin(), area_tris.end() ); - - const_triele_list_iterator t_current = tri_elements.begin(); - const_triele_list_iterator t_last = tri_elements.end(); - for ( ; t_current != t_last; ++t_current ) { - if ( (int)t_current->get_attribute() == i ) { - area_tris.push_back( *t_current ); - } - } - - if ( (int)area_tris.size() > 0 ) { - cout << "generating fans for area = " << i << endl; - fans[i] = f.greedy_build( area_tris ); - } - } - - // build the texture coordinate list and make a parallel structure - // to the fan list for pointers into the texture list - cout << "calculating texture coordinates" << endl; - tex_coords.clear(); - - for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) { - for ( int j = 0; j < (int)fans[i].size(); ++j ) { - int_list t_list = calc_tex_coords( c, geod_nodes, fans[i][j] ); - // cout << fans[i][j].size() << " === " - // << t_list.size() << endl; - textures[i].push_back( t_list ); - } - } - - // calculate the global bounding sphere - calc_gbs( c ); - cout << "center = " << gbs_center << " radius = " << gbs_radius << endl; - - return 1; -} - - -// caclulate the bounding sphere for a list of triangle faces -void FGGenOutput::calc_group_bounding_sphere( FGConstruct& c, - const fan_list& fans, - Point3D *center, double *radius ) -{ - cout << "calculate group bounding sphere for " << fans.size() << " fans." - << endl; - - point_list wgs84_nodes = c.get_wgs84_nodes(); - - // generate a list of unique points from the triangle list - FGTriNodes nodes; - - const_fan_list_iterator f_current = fans.begin(); - const_fan_list_iterator f_last = fans.end(); - for ( ; f_current != f_last; ++f_current ) { - const_int_list_iterator i_current = f_current->begin(); - const_int_list_iterator i_last = f_current->end(); - for ( ; i_current != i_last; ++i_current ) { - Point3D p1 = wgs84_nodes[ *i_current ]; - nodes.unique_add(p1); - } - } - - // find average of point list - *center = Point3D( 0.0 ); - point_list points = nodes.get_node_list(); - // cout << "found " << points.size() << " unique nodes" << endl; - point_list_iterator p_current = points.begin(); - point_list_iterator p_last = points.end(); - for ( ; p_current != p_last; ++p_current ) { - *center += *p_current; - } - *center /= points.size(); - - // find max radius - double dist_squared; - double max_squared = 0; - - p_current = points.begin(); - p_last = points.end(); - for ( ; p_current != p_last; ++p_current ) { - dist_squared = (*center).distance3Dsquared(*p_current); - if ( dist_squared > max_squared ) { - max_squared = dist_squared; - } - } - - *radius = sqrt(max_squared); -} - - -// caclulate the bounding sphere for the specified triangle face -void FGGenOutput::calc_bounding_sphere( FGConstruct& c, const FGTriEle& t, - Point3D *center, double *radius ) -{ - point_list wgs84_nodes = c.get_wgs84_nodes(); - - *center = Point3D( 0.0 ); - - Point3D p1 = wgs84_nodes[ t.get_n1() ]; - Point3D p2 = wgs84_nodes[ t.get_n2() ]; - Point3D p3 = wgs84_nodes[ t.get_n3() ]; - - *center = p1 + p2 + p3; - *center /= 3; - - double dist_squared; - double max_squared = 0; - - dist_squared = (*center).distance3Dsquared(p1); - if ( dist_squared > max_squared ) { - max_squared = dist_squared; - } - - dist_squared = (*center).distance3Dsquared(p2); - if ( dist_squared > max_squared ) { - max_squared = dist_squared; - } - - dist_squared = (*center).distance3Dsquared(p3); - if ( dist_squared > max_squared ) { - max_squared = dist_squared; - } - - *radius = sqrt(max_squared); -} - - -// write out the fgfs scenery file -int FGGenOutput::write( FGConstruct &c ) { - Point3D p; - - string base = c.get_output_base(); - FGBucket b = c.get_bucket(); - - string dir = base + "/Scenery/" + b.gen_base_path(); - string command = "mkdir -p " + dir; - system(command.c_str()); - - string file = dir + "/" + b.gen_index_str(); - cout << "Output file = " << file << endl; - - FILE *fp; - if ( (fp = fopen( file.c_str(), "w" )) == NULL ) { - cout << "ERROR: opening " << file << " for writing!" << endl; - exit(-1); - } - - // write headers - fprintf(fp, "# FGFS Scenery Version %s\n", FG_SCENERY_FILE_FORMAT); - - time_t calendar_time = time(NULL); - struct tm *local_tm; - local_tm = localtime( &calendar_time ); - char time_str[256]; - strftime( time_str, 256, "%a %b %d %H:%M:%S %Z %Y", local_tm); - fprintf(fp, "# Created %s\n", time_str ); - fprintf(fp, "\n"); - - // write global bounding sphere - fprintf(fp, "# gbs %.5f %.5f %.5f %.2f\n", - gbs_center.x(), gbs_center.y(), gbs_center.z(), gbs_radius); - fprintf(fp, "\n"); - - // write nodes - point_list wgs84_nodes = c.get_wgs84_nodes(); - fprintf(fp, "# vertex list\n"); - const_point_list_iterator w_current = wgs84_nodes.begin(); - const_point_list_iterator w_last = wgs84_nodes.end(); - for ( ; w_current != w_last; ++w_current ) { - p = *w_current - gbs_center; - fprintf(fp, "v %.5f %.5f %.5f\n", p.x(), p.y(), p.z()); - } - fprintf(fp, "\n"); - - // write vertex normals - point_list point_normals = c.get_point_normals(); - fprintf(fp, "# vertex normal list\n"); - const_point_list_iterator n_current = point_normals.begin(); - const_point_list_iterator n_last = point_normals.end(); - for ( ; n_current != n_last; ++n_current ) { - p = *n_current; - fprintf(fp, "vn %.5f %.5f %.5f\n", p.x(), p.y(), p.z()); - } - fprintf(fp, "\n"); - - // write texture coordinates - point_list tex_coord_list = tex_coords.get_node_list(); - for ( int i = 0; i < (int)tex_coord_list.size(); ++i ) { - p = tex_coord_list[i]; - fprintf(fp, "vt %.5f %.5f\n", p.x(), p.y()); - } - fprintf(fp, "\n"); - - // write triangles (grouped by type for now) - Point3D center; - double radius; - fprintf(fp, "# triangle groups\n"); - fprintf(fp, "\n"); - - int total_tris = 0; - for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) { - if ( (int)fans[i].size() > 0 ) { - string attr_name = get_area_name( (AreaType)i ); - calc_group_bounding_sphere( c, fans[i], ¢er, &radius ); - cout << "writing " << (int)fans[i].size() << " fans for " - << attr_name << endl; - - fprintf(fp, "# usemtl %s\n", attr_name.c_str() ); - fprintf(fp, "# bs %.4f %.4f %.4f %.2f\n", - center.x(), center.y(), center.z(), radius); - - for ( int j = 0; j < (int)fans[i].size(); ++j ) { - fprintf( fp, "tf" ); - total_tris += fans[i][j].size() - 2; - for ( int k = 0; k < (int)fans[i][j].size(); ++k ) { - fprintf( fp, " %d/%d", fans[i][j][k], textures[i][j][k] ); - } - fprintf( fp, "\n" ); - } - - fprintf( fp, "\n" ); - } - } - cout << "wrote " << total_tris << " tris to output file" << endl; - - fclose(fp); - - command = "gzip --force --best " + file; - system(command.c_str()); - - return 1; -} - - diff --git a/Tools/Construct/GenOutput/genobj.hxx b/Tools/Construct/GenOutput/genobj.hxx deleted file mode 100644 index 8f5b182ce..000000000 --- a/Tools/Construct/GenOutput/genobj.hxx +++ /dev/null @@ -1,111 +0,0 @@ -// genobj.hxx -- Generate the flight gear "obj" file format from the -// triangle output -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _GENOBJ_HXX -#define _GENOBJ_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include STL_STRING - -#include -#include -#include - -#include -#include
-#include
-#include - -FG_USING_STD(string); -FG_USING_STD(vector); - - -typedef vector < int_list > tex_list; -typedef tex_list::iterator tex_list_iterator; -typedef tex_list::const_iterator const_tex_list_iterator; - -class FGGenOutput { - -private: - - // node list in geodetic coordinates - point_list geod_nodes; - - // triangles (by index into point list) - triele_list tri_elements; - - // texture coordinates - FGTriNodes tex_coords; - - // fan list - fan_list fans[FG_MAX_AREA_TYPES]; - - // textures pointer list - tex_list textures[FG_MAX_AREA_TYPES]; - - // global bounding sphere - Point3D gbs_center; - double gbs_radius; - - // calculate the global bounding sphere. Center is the average of - // the points. - void calc_gbs( FGConstruct& c ); - - // caclulate the bounding sphere for a list of triangle faces - void calc_group_bounding_sphere( FGConstruct& c, const fan_list& fans, - Point3D *center, double *radius ); - - // caclulate the bounding sphere for the specified triangle face - void calc_bounding_sphere( FGConstruct& c, const FGTriEle& t, - Point3D *center, double *radius ); - - // traverse the specified fan and attempt to calculate "none - // stretching" texture coordinates - int_list calc_tex_coords( FGConstruct& c, point_list geod_nodes, int_list fan ); - -public: - - // Constructor && Destructor - inline FGGenOutput() { } - inline ~FGGenOutput() { } - - // build the necessary output structures based on the - // triangulation data - int build( FGConstruct& c ); - - // write out the fgfs scenery file - int write( FGConstruct &c ); -}; - - -#endif // _GENOBJ_HXX - - diff --git a/Tools/Construct/Main/Makefile.am b/Tools/Construct/Main/Makefile.am deleted file mode 100644 index 955e9da5e..000000000 --- a/Tools/Construct/Main/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -bin_PROGRAMS = fgfs-construct fgfs-master - -fgfs_construct_SOURCES = \ - construct_types.hxx \ - construct.cxx construct.hxx \ - main.cxx - -fgfs_construct_LDADD = \ - $(top_builddir)/Tools/Construct/Array/libArray.a \ - $(top_builddir)/Tools/Construct/Clipper/libClipper.a \ - $(top_builddir)/Tools/Construct/GenOutput/libGenOutput.a \ - $(top_builddir)/Tools/Construct/Combine/libCombine.a \ - $(top_builddir)/Tools/Construct/Match/libMatch.a \ - $(top_builddir)/Tools/Construct/Triangulate/libTriangulate.a \ - $(top_builddir)/Tools/Lib/Polygon/libPolygon.a \ - $(top_builddir)/Tools/Lib/Triangle/libTriangle.a \ - $(top_builddir)/Lib/Bucket/libBucket.a \ - $(top_builddir)/Lib/Math/libMath.a \ - $(top_builddir)/Lib/Misc/libMisc.a \ - $(top_builddir)/Lib/Debug/libDebug.a \ - $(top_builddir)/Lib/zlib/libz.a \ - -lgpc -lgfc - -fgfs_master_SOURCES = master.cxx - -fgfs_master_LDADD = \ - $(top_builddir)/Lib/Bucket/libBucket.a \ - $(top_builddir)/Lib/Misc/libMisc.a - -INCLUDES += \ - -I$(top_builddir) \ - -I$(top_builddir)/Lib \ - -I$(top_builddir)/Tools/Lib \ - -I$(top_builddir)/Tools/Construct diff --git a/Tools/Construct/Main/construct.cxx b/Tools/Construct/Main/construct.cxx deleted file mode 100644 index 04ced791b..000000000 --- a/Tools/Construct/Main/construct.cxx +++ /dev/null @@ -1,33 +0,0 @@ -// construct.cxx -- Class to manage the primary data used in the -// construction process -// -// Written by Curtis Olson, started May 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include "construct.hxx" - - -// Constructor -FGConstruct::FGConstruct() { } - - -// Destructor -FGConstruct::~FGConstruct() { } diff --git a/Tools/Construct/Main/construct.hxx b/Tools/Construct/Main/construct.hxx deleted file mode 100644 index 44fbd2a26..000000000 --- a/Tools/Construct/Main/construct.hxx +++ /dev/null @@ -1,170 +0,0 @@ -// construct.hxx -- Class to manage the primary data used in the -// construction process -// -// Written by Curtis Olson, started May 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _CONSTRUCT_HXX -#define _CONSTRUCT_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include STL_STRING - -#include - -#include -#include -#include -#include - -FG_USING_STD(string); - - -typedef vector < int_list > belongs_to_list; -typedef belongs_to_list::iterator belongs_to_list_iterator; -typedef belongs_to_list::const_iterator belongs_to_list_tripoly_iterator; - - -class FGConstruct { - -private: - - // minimum interior angle for triangulation - string angle; - - // paths - string work_base; - string output_base; - - // detail level constraints - int min_nodes; - int max_nodes; - - // this bucket - FGBucket bucket; - - // clipped polygons (gpc format) - FGPolyList clipped_polys; - - // raw node list (after triangulation) - FGTriNodes tri_nodes; - - // node list in geodetic coords (with fixed elevation) - point_list geod_nodes; - - // node list in cartesian coords (wgs84 model) - point_list wgs84_nodes; - - // triangle elements (after triangulation) - triele_list tri_elements; - - // edge segments (after triangulation) - FGTriSegments tri_segs; - - // for each node, a list of triangle indices that contain this node - belongs_to_list reverse_ele_lookup; - - // face normal list (for flat shading) - point_list face_normals; - - // normal list (for each point) in cart coords (for smooth - // shading) - point_list point_normals; - -public: - - // Constructor - FGConstruct(); - - // Destructor - ~FGConstruct(); - - // minimum interior angle for triangulation - inline string get_angle() const { return angle; } - inline void set_angle( const string s ) { angle = s; } - - // paths - inline string get_work_base() const { return work_base; } - inline void set_work_base( const string s ) { work_base = s; } - inline string get_output_base() const { return output_base; } - inline void set_output_base( const string s ) { output_base = s; } - - // detail level constraints - inline int get_min_nodes() const { return min_nodes; } - inline void set_min_nodes( const int n ) { min_nodes = n; } - inline int get_max_nodes() const { return max_nodes; } - inline void set_max_nodes( const int n ) { max_nodes = n; } - - // this bucket - inline FGBucket get_bucket() const { return bucket; } - inline void set_bucket( const FGBucket b ) { bucket = b; } - - // clipped polygons - inline FGPolyList get_clipped_polys() const { return clipped_polys; } - inline void set_clipped_polys( FGPolyList p ) { clipped_polys = p; } - - // node list (after triangulation) - inline FGTriNodes get_tri_nodes() const { return tri_nodes; } - inline void set_tri_nodes( FGTriNodes n ) { tri_nodes = n; } - - // triangle elements (after triangulation) - inline triele_list get_tri_elements() const { return tri_elements; } - inline void set_tri_elements( triele_list e ) { tri_elements = e; } - - // edge segments (after triangulation) - inline FGTriSegments get_tri_segs() const { return tri_segs; } - inline void set_tri_segs( FGTriSegments s ) { tri_segs = s; } - - // node list in geodetic coords (with fixed elevation) - inline point_list get_geod_nodes() const { return geod_nodes; } - inline void set_geod_nodes( point_list n ) { geod_nodes = n; } - - // node list in cartesian coords (wgs84 model) - inline point_list get_wgs84_nodes() const { return wgs84_nodes; } - inline void set_wgs84_nodes( point_list n ) { wgs84_nodes = n; } - - // for each node, a list of triangle indices that contain this node - inline belongs_to_list get_reverse_ele_lookup() const { - return reverse_ele_lookup; - } - inline void set_reverse_ele_lookup( belongs_to_list r ) { - reverse_ele_lookup = r; - } - - // face normal list (for flat shading) - inline point_list get_face_normals() const { return face_normals; } - inline void set_face_normals( point_list n ) { face_normals = n; } - - // normal list (for each point) in cart coords (for smooth - // shading) - inline point_list get_point_normals() const { return point_normals; } - inline void set_point_normals( point_list n ) { point_normals = n; } -}; - - -#endif // _CONSTRUCT_HXX diff --git a/Tools/Construct/Main/construct_types.hxx b/Tools/Construct/Main/construct_types.hxx deleted file mode 100644 index f24fd141c..000000000 --- a/Tools/Construct/Main/construct_types.hxx +++ /dev/null @@ -1,59 +0,0 @@ -// construct_types.hxx -- commonly used types in the construction business. -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _CONSTRUCT_TYPES_HXX -#define _CONSTRUCT_TYPES_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include - -#include - -FG_USING_STD(vector); - - -typedef vector < int > int_list; -typedef int_list::iterator int_list_iterator; -typedef int_list::const_iterator const_int_list_iterator; - -typedef vector < Point3D > point_list; -typedef point_list::iterator point_list_iterator; -typedef point_list::const_iterator const_point_list_iterator; - - -class point2d { -public: - double x, y; -}; - - -#endif // _CONSTRUCT_TYPES_HXX - - diff --git a/Tools/Construct/Main/main.cxx b/Tools/Construct/Main/main.cxx deleted file mode 100644 index 9bb417cab..000000000 --- a/Tools/Construct/Main/main.cxx +++ /dev/null @@ -1,612 +0,0 @@ -// main.cxx -- top level construction routines -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include // for directory reading -#include // for directory reading - -#include // set mem allocation limit -#include // set mem allocation limit -#include // set mem allocation limit - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "construct.hxx" - - -// do actual scan of directory and loading of files -int actual_load_polys( const string& dir, FGConstruct& c, FGClipper& clipper ) { - int counter = 0; - string base = c.get_bucket().gen_base_path(); - string tile_str = c.get_bucket().gen_index_str(); - string ext; - - DIR *d; - struct dirent *de; - - if ( (d = opendir( dir.c_str() )) == NULL ) { - cout << "cannot open directory " << dir << "\n"; - return 0; - } - - // load all matching polygon files - string file, f_index, full_path; - int pos; - while ( (de = readdir(d)) != NULL ) { - file = de->d_name; - pos = file.find("."); - f_index = file.substr(0, pos); - - if ( tile_str == f_index ) { - ext = file.substr(pos + 1); - cout << file << " " << f_index << " '" << ext << "'" << endl; - full_path = dir + "/" + file; - if ( (ext == "dem") || (ext == "dem.gz") ) { - // skip - } else { - cout << "ext = '" << ext << "'" << endl; - clipper.load_polys( full_path ); - ++counter; - } - } - } - - return counter; -} - - -// load all 2d polygons matching the specified base path and clip -// against each other to resolve any overlaps -int load_polys( FGConstruct& c ) { - FGClipper clipper; - - string base = c.get_bucket().gen_base_path(); - string poly_path; - int result; - - // initialize clipper - clipper.init(); - - // load airports - poly_path = c.get_work_base() + ".apt" + "/Scenery/" + base; - cout << "poly_path = " << poly_path << endl; - result = actual_load_polys( poly_path, c, clipper ); - cout << " loaded " << result << " polys" << endl; - - // load hydro - poly_path = c.get_work_base() + ".hydro" + "/Scenery/" + base; - cout << "poly_path = " << poly_path << endl; - result = actual_load_polys( poly_path, c, clipper ); - cout << " loaded " << result << " polys" << endl; - - // load land masses - poly_path = c.get_work_base() + ".states" + "/Scenery/" + base; - cout << "poly_path = " << poly_path << endl; - result = actual_load_polys( poly_path, c, clipper ); - cout << " loaded " << result << " polys" << endl; - - // load urban areas - poly_path = c.get_work_base() + ".urban" + "/Scenery/" + base; - cout << "poly_path = " << poly_path << endl; - result = actual_load_polys( poly_path, c, clipper ); - cout << " loaded " << result << " polys" << endl; - - point2d min, max; - min.x = c.get_bucket().get_center_lon() - 0.5 * c.get_bucket().get_width(); - min.y = c.get_bucket().get_center_lat() - 0.5 * c.get_bucket().get_height(); - max.x = c.get_bucket().get_center_lon() + 0.5 * c.get_bucket().get_width(); - max.y = c.get_bucket().get_center_lat() + 0.5 * c.get_bucket().get_height(); - - // do clipping - cout << "clipping polygons" << endl; - clipper.clip_all(min, max); - - // update main data repository - c.set_clipped_polys( clipper.get_polys_clipped() ); - return 1; -} - - -// load regular grid of elevation data (dem based), return list of -// fitted nodes -int load_dem( FGConstruct& c, FGArray& array) { - point_list result; - string base = c.get_bucket().gen_base_path(); - - string dem_path = c.get_work_base() + ".dem" + "/Scenery/" + base - + "/" + c.get_bucket().gen_index_str() + ".dem"; - cout << "dem_path = " << dem_path << endl; - - if ( ! array.open(dem_path) ) { - cout << "ERROR: cannot open " << dem_path << endl; - } - - FGBucket b = c.get_bucket(); - array.parse( b ); - - return 1; -} - - -// fit dem nodes, return number of fitted nodes -int fit_dem(FGArray& array, int error) { - return array.fit( error ); -} - - -// triangulate the data for each polygon ( first time before splitting ) -void first_triangulate( FGConstruct& c, const FGArray& array, - FGTriangle& t ) { - // first we need to consolidate the points of the DEM fit list and - // all the polygons into a more "Triangle" friendly format - - point_list corner_list = array.get_corner_node_list(); - point_list fit_list = array.get_fit_node_list(); - FGPolyList gpc_polys = c.get_clipped_polys(); - - cout << "ready to build node list and polygons" << endl; - t.build( corner_list, fit_list, gpc_polys ); - cout << "done building node list and polygons" << endl; - - cout << "ready to do triangulation" << endl; - t.run_triangulate( c.get_angle(), 1 ); - cout << "finished triangulation" << endl; -} - - -// triangulate the data for each polygon ( second time after splitting -// and reassembling ) -void second_triangulate( FGConstruct& c, FGTriangle& t ) { - t.rebuild( c ); - cout << "done re building node list and polygons" << endl; - - cout << "ready to do second triangulation" << endl; - t.run_triangulate( c.get_angle(), 2 ); - cout << "finished second triangulation" << endl; -} - - -// build the wgs-84 point list (and fix the elevations of the geodetic -// nodes) -static void fix_point_heights( FGConstruct& c, const FGArray& array ) { - point_list geod_nodes; - point_list wgs84_nodes; - - cout << "fixing node heights and generating wgs84 list" << endl; - Point3D geod, radians, cart; - - point_list raw_nodes = c.get_tri_nodes().get_node_list(); - point_list_iterator current = raw_nodes.begin(); - point_list_iterator last = raw_nodes.end(); - - for ( ; current != last; ++current ) { - geod = *current; - - geod.setz( array.interpolate_altitude( geod.x() * 3600.0, - geod.y() * 3600.0 ) ); - - // convert to radians - radians = Point3D( geod.x() * DEG_TO_RAD, - geod.y() * DEG_TO_RAD, - geod.z() ); - - cart = fgGeodToCart(radians); - // cout << cart << endl; - - geod_nodes.push_back(geod); - wgs84_nodes.push_back(cart); - } - - c.set_geod_nodes( geod_nodes ); - c.set_wgs84_nodes( wgs84_nodes ); -} - - -// build the node -> element (triangle) reverse lookup table. there -// is an entry for each point containing a list of all the triangles -// that share that point. -static belongs_to_list gen_node_ele_lookup_table( FGConstruct& c ) { - belongs_to_list reverse_ele_lookup; - reverse_ele_lookup.clear(); - - int_list ele_list; - ele_list.clear(); - - // initialize reverse_ele_lookup structure by creating an empty - // list for each point - point_list wgs84_nodes = c.get_wgs84_nodes(); - const_point_list_iterator w_current = wgs84_nodes.begin(); - const_point_list_iterator w_last = wgs84_nodes.end(); - for ( ; w_current != w_last; ++w_current ) { - reverse_ele_lookup.push_back( ele_list ); - } - - // traverse triangle structure building reverse lookup table - triele_list tri_elements = c.get_tri_elements(); - const_triele_list_iterator current = tri_elements.begin(); - const_triele_list_iterator last = tri_elements.end(); - int counter = 0; - for ( ; current != last; ++current ) { - reverse_ele_lookup[ current->get_n1() ].push_back( counter ); - reverse_ele_lookup[ current->get_n2() ].push_back( counter ); - reverse_ele_lookup[ current->get_n3() ].push_back( counter ); - ++counter; - } - - return reverse_ele_lookup; -} - - -// caclulate the normal for the specified triangle face -static Point3D calc_normal( FGConstruct& c, int i ) { - double v1[3], v2[3], normal[3]; - double temp; - - point_list wgs84_nodes = c.get_wgs84_nodes(); - triele_list tri_elements = c.get_tri_elements(); - - Point3D p1 = wgs84_nodes[ tri_elements[i].get_n1() ]; - Point3D p2 = wgs84_nodes[ tri_elements[i].get_n2() ]; - Point3D p3 = wgs84_nodes[ tri_elements[i].get_n3() ]; - - v1[0] = p2.x() - p1.x(); v1[1] = p2.y() - p1.y(); v1[2] = p2.z() - p1.z(); - v2[0] = p3.x() - p1.x(); v2[1] = p3.y() - p1.y(); v2[2] = p3.z() - p1.z(); - - MAT3cross_product(normal, v1, v2); - MAT3_NORMALIZE_VEC(normal,temp); - - return Point3D( normal[0], normal[1], normal[2] ); -} - - -// build the face normal list -static point_list gen_face_normals( FGConstruct& c ) { - point_list face_normals; - - // traverse triangle structure building the face normal table - - cout << "calculating face normals" << endl; - - triele_list tri_elements = c.get_tri_elements(); - for ( int i = 0; i < (int)tri_elements.size(); i++ ) { - // cout << calc_normal( i ) << endl; - face_normals.push_back( calc_normal( c, i ) ); - } - - return face_normals; -} - - -// calculate the normals for each point in wgs84_nodes -static point_list gen_point_normals( FGConstruct& c ) { - point_list point_normals; - - Point3D normal; - cout << "caculating node normals" << endl; - - point_list wgs84_nodes = c.get_wgs84_nodes(); - belongs_to_list reverse_ele_lookup = c.get_reverse_ele_lookup(); - point_list face_normals = c.get_face_normals(); - - // for each node - for ( int i = 0; i < (int)wgs84_nodes.size(); ++i ) { - int_list tri_list = reverse_ele_lookup[i]; - - int_list_iterator current = tri_list.begin(); - int_list_iterator last = tri_list.end(); - - Point3D average( 0.0 ); - - // for each triangle that shares this node - for ( ; current != last; ++current ) { - normal = face_normals[ *current ]; - average += normal; - // cout << normal << endl; - } - - average /= tri_list.size(); - // cout << "average = " << average << endl; - - point_normals.push_back( average ); - } - - return point_normals; -} - - -// generate the flight gear scenery file -void do_output( FGConstruct& c, FGGenOutput& output ) { - output.build( c ); - output.write( c ); -} - - -// master construction routine -void construct_tile( FGConstruct& c ) { - cout << "Construct tile, bucket = " << c.get_bucket() << endl; - - // fit with ever increasing error tolerance until we produce <= - // 80% of max nodes. We should really have the sim end handle - // arbitrarily complex tiles. - - bool acceptable = false; - bool growing = false; - bool shrinking = false; - - double error = 200.0; - int count = 0; - - // load and clip 2d polygon data - load_polys( c ); - - // load grid of elevation data (dem) - FGArray array; - load_dem( c, array ); - - FGTriangle t; - - while ( ! acceptable ) { - // do a least squares fit of the (dem) data with the given - // error tolerance - array.fit( error ); - - // triangulate the data for each polygon - first_triangulate( c, array, t ); - - acceptable = true; - - count = t.get_out_nodes_size(); - - if ( (count < c.get_min_nodes()) && (error >= 25.0) ) { - // reduce error tolerance until number of points exceeds the - // minimum threshold - cout << "produced too few nodes ..." << endl; - - acceptable = false; - growing = true; - - if ( shrinking ) { - error /= 1.25; - shrinking = false; - } else { - error /= 1.5; - } - cout << "Setting error to " << error << " and retrying fit." - << endl; - } - - if ( count > c.get_max_nodes() ) { - if ( error <= 1000.0 ) { - // increase error tolerance until number of points drops below - // the maximum threshold - cout << "produced too many nodes ..." << endl; - - acceptable = false; - shrinking = true; - - if ( growing ) { - error *= 1.25; - growing = false; - } else { - error *= 1.5; - } - - cout << "Setting error to " << error << " and retrying fit." - << endl; - } else { - // we tried, but can't seem to get down to a - // reasonable number of points even with a huge error - // tolerance. This could be related to the triangle() - // call which might be having trouble with our input - // set. Let's just die hope that our parent can try - // again with a smaller interior triangle angle. - cout << "Error: Too many nodes." << endl; - exit(-1); - } - } - } - - cout << "finished fit with error = " << error << " node count = " - << count << endl; - - // save the results of the triangulation - c.set_tri_nodes( t.get_out_nodes() ); - c.set_tri_elements( t.get_elelist() ); - c.set_tri_segs( t.get_out_segs() ); - - // calculate wgs84 (cartesian) form of node list - fix_point_heights( c, array ); - - // build the node -> element (triangle) reverse lookup table - c.set_reverse_ele_lookup( gen_node_ele_lookup_table( c ) ); - - // build the face normal list - c.set_face_normals( gen_face_normals( c ) ); - - // calculate the normals for each point in wgs84_nodes - c.set_point_normals( gen_point_normals( c ) ); - - // match tile edges with any neighbor tiles that have already been - // generated - FGMatch m; - m.load_neighbor_shared( c ); - m.split_tile( c ); - m.write_shared( c ); - m.assemble_tile( c ); - - // now we must retriangulate the pasted together tile points - second_triangulate( c, t ); - - // save the results of the triangulation - c.set_tri_nodes( t.get_out_nodes() ); - c.set_tri_elements( t.get_elelist() ); - c.set_tri_segs( t.get_out_segs() ); - - // calculate wgs84 (cartesian) form of node list - fix_point_heights( c, array ); - - // generate the output - FGGenOutput output; - do_output( c, output ); -} - - -// display usage and exit -void usage( const string name ) { - cout << "Usage: " << name - << " tile_id" << endl; - cout << "Usage: " << name - << " center_lon center_lat xdist ydist" - << endl; - exit(-1); -} - - -main(int argc, char **argv) { - double lon, lat; - - fglog().setLogLevels( FG_ALL, FG_DEBUG ); - - if ( argc < 4 ) { - usage( argv[0] ); - } - - // set mem allocation limit. Reason: occasionally the triangle() - // routine can blow up and allocate memory forever. We'd like - // this process to die before things get out of hand so we can try - // again with a smaller interior angle limit. - int result; - struct rlimit limit; - limit.rlim_cur = 20000000; - limit.rlim_max = 20000000; - result = setrlimit( RLIMIT_DATA, &limit ); - cout << "result of setting mem limit = " << result << endl; - result = setrlimit( RLIMIT_STACK, &limit ); - cout << "result of setting mem limit = " << result << endl; - result = setrlimit( RLIMIT_CORE, &limit ); - cout << "result of setting mem limit = " << result << endl; - result = setrlimit( RLIMIT_RSS, &limit ); - cout << "result of setting mem limit = " << result << endl; - - // cpu time limit since occassionally the triangulator can go into - // and infinite loop. - limit.rlim_cur = 120; - limit.rlim_max = 120; - result = setrlimit( RLIMIT_CPU, &limit ); - cout << "result of setting mem limit = " << result << endl; - - // main construction data management class - FGConstruct c; - - c.set_angle( argv[1] ); - c.set_work_base( argv[2] ); - c.set_output_base( argv[3] ); - - c.set_min_nodes( 50 ); - c.set_max_nodes( (int)(FG_MAX_NODES * 0.8) ); - - // lon = -146.248360; lat = 61.133950; // PAVD (Valdez, AK) - // lon = -110.664244; lat = 33.352890; // P13 - // lon = -93.211389; lat = 45.145000; // KANE - // lon = -92.486188; lat = 44.590190; // KRGK - // lon = -89.7446823; lat= 29.314495; - // lon = -122.488090; lat = 42.743183; // 64S - // lon = -114.861097; lat = 35.947480; // 61B - // lon = -112.012175; lat = 41.195944; // KOGD - // lon = -90.757128; lat = 46.790212; // WI32 - // lon = -122.220717; lat = 37.721291; // KOAK - // lon = -111.721477; lat = 40.215641; // KPVU - lon = -122.309313; lat = 47.448982; // KSEA - // lon = -148.798131; lat = 63.645099; // AK06 (Danali, AK) - // lon = -92.5; lat = 47.5; // Marsh test (northern MN) - // lon = -111.977773; lat = 40.788388; // KSLC - // lon = -121.914; lat = 42.5655; // TEST (Oregon SW of Crater) - // lon = -76.201239; lat = 36.894606; // KORF (Norfolk, Virginia) - // lon = -147.166; lat = 60.9925; // Hale-bop test - - if ( argc == 5 ) { - // construct a specific tile and exit - - long index = atoi( argv[4] ); - FGBucket b( index ); - c.set_bucket( b ); - construct_tile( c ); - } else if ( argc == 8 ) { - // build all the tiles in an area - - lon = atof( argv[4] ); - lat = atof( argv[5] ); - double xdist = atof( argv[6] ); - double ydist = atof( argv[7] ); - - double min_x = lon - xdist; - double min_y = lat - ydist; - FGBucket b_min( min_x, min_y ); - FGBucket b_max( lon + xdist, lat + ydist ); - - FGBucket b_start(550401L); - bool do_tile = true; - - if ( b_min == b_max ) { - c.set_bucket( b_min ); - construct_tile( c ); - } else { - FGBucket b_cur; - int dx, dy, i, j; - - fgBucketDiff(b_min, b_max, &dx, &dy); - cout << " construction area spans tile boundaries" << endl; - cout << " dx = " << dx << " dy = " << dy << endl; - - for ( j = 0; j <= dy; j++ ) { - for ( i = 0; i <= dx; i++ ) { - b_cur = fgBucketOffset(min_x, min_y, i, j); - - if ( b_cur == b_start ) { - do_tile = true; - } - - if ( do_tile ) { - c.set_bucket( b_cur ); - construct_tile( c ); - } else { - cout << "skipping " << b_cur << endl; - } - } - } - // string answer; cin >> answer; - } - } else { - usage( argv[0] ); - } - - cout << "[Finished successfully]" << endl; -} diff --git a/Tools/Construct/Main/master.cxx b/Tools/Construct/Main/master.cxx deleted file mode 100644 index 86b3bfad1..000000000 --- a/Tools/Construct/Main/master.cxx +++ /dev/null @@ -1,153 +0,0 @@ -// master.cxx -- top level construction routines -// -// Written by Curtis Olson, started May 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include // for system() -#include // for stat() -#include // for stat() - -#include - -#include - -// #include -// #include - -// #include -// #include -// #include -// #include -// #include -// #include - - -// return true if file exists -static bool file_exists( const string& file ) { - struct stat buf; - - if ( stat( file.c_str(), &buf ) == 0 ) { - return true; - } else { - return false; - } -} - - -// check if the specified tile has data defined for it -static bool has_data( const string& path, const FGBucket& b ) { - string dem_file = path + ".dem" + "/Scenery/" + b.gen_base_path() - + "/" + b.gen_index_str() + ".dem"; - if ( file_exists( dem_file ) ) { - return true; - } - - dem_file += ".gz"; - if ( file_exists( dem_file ) ) { - return true; - } - - return false; -} - - -// build the tile and check for success -bool build_tile( const string& work_base, const string& output_base, - const FGBucket& b ) { - string result_file = "result"; - - string command = "./construct " + work_base + " " + output_base + " " - + b.gen_index_str() + " > " + result_file + " 2>&1"; - cout << command << endl; - - system( command.c_str() ); - - FILE *fp = fopen( result_file.c_str(), "r" ); - char line[256]; - while ( fgets( line, 256, fp ) != NULL ) { - string line_str = line; - line_str = line_str.substr(0, line_str.length() - 1); - cout << line_str << endl; - if ( line_str == "[Finished successfully]" ) { - fclose(fp); - return true; - } - } - - fclose(fp); - return false; -} - - -// display usage and exit -void usage( const string name ) { - cout << "Usage: " << name << " " << endl; - exit(-1); -} - - -main(int argc, char **argv) { - double lon, lat; - - if ( argc < 3 ) { - usage( argv[0] ); - } - - string work_base = argv[1]; - string output_base = argv[2]; - - FGBucket tmp1( 0.0, 0.0 ); - - double dy = tmp1.get_height(); - lat = 68.75 + dy * 0.5; - - bool start_lon = true; - lon = -152.9 /* + (1.0/16.0) */; - - while ( lat <= 90.0 ) { - FGBucket tmp2( 0.0, lat ); - double dx = tmp2.get_width(); - - if ( ! start_lon ) { - lon = -180 + dx * 0.5; - } else { - start_lon = false; - } - while ( lon <= 180.0 ) { - FGBucket b( lon, lat ); - cout << "Bucket = " << b << endl; - - if ( has_data( work_base, b ) ) { - if ( ! build_tile( work_base, output_base, b ) ) { - cout << "error building last tile" << endl; - exit(-1); - } - } - - lon += dx; - } - - - lat += dy; - } -} - - diff --git a/Tools/Construct/Makefile.am b/Tools/Construct/Makefile.am deleted file mode 100644 index a2fd3255a..000000000 --- a/Tools/Construct/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -SUBDIRS = \ - Array \ - Triangulate \ - Clipper \ - Combine \ - GenOutput \ - Match \ - Parallel \ - Main - diff --git a/Tools/Construct/Match/Makefile.am b/Tools/Construct/Match/Makefile.am deleted file mode 100644 index aae204ac1..000000000 --- a/Tools/Construct/Match/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -noinst_LIBRARIES = libMatch.a - -libMatch_a_SOURCES = match.cxx match.hxx - -INCLUDES += \ - -I$(top_builddir) \ - -I$(top_builddir)/Lib \ - -I$(top_builddir)/Tools/Lib \ - -I$(top_builddir)/Tools/Construct diff --git a/Tools/Construct/Match/match.cxx b/Tools/Construct/Match/match.cxx deleted file mode 100644 index 47dff929c..000000000 --- a/Tools/Construct/Match/match.cxx +++ /dev/null @@ -1,607 +0,0 @@ -// array.cxx -- Array management class -// -// Written by Curtis Olson, started March 1998. -// -// Copyright (C) 1998 - 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include - -#include "match.hxx" - - - -FGMatch::FGMatch( void ) { -} - - -FGMatch::~FGMatch( void ) { -} - - -// scan the specified share file for the specified information -void FGMatch::scan_share_file( const string& dir, const FGBucket& b, - neighbor_type search, neighbor_type dest ) -{ - string file = dir + "/" + b.gen_base_path() + "/" + b.gen_index_str(); - // cout << "reading shared data from " << file << endl; - - fg_gzifstream in( file ); - if ( !in.is_open() ) { - // cout << "Cannot open file: " << file << endl; - return; - } - - string target; - if ( search == SW_Corner ) { - target = "sw_node"; - } else if ( search == SE_Corner ) { - target = "se_node"; - } else if ( search == NE_Corner ) { - target = "ne_node"; - } else if ( search == NW_Corner ) { - target = "nw_node"; - } else if ( search == NORTH ) { - target = "n_node"; - } else if ( search == SOUTH ) { - target = "s_node"; - } else if ( search == EAST ) { - target = "e_node"; - } else if ( search == WEST ) { - target = "w_node"; - } - - string key; - Point3D node, normal; - while ( in ) { - in >> key; - in >> node; - if ( key == target ) { - // cout << key << " " << node << endl; - in >> key; - in >> normal; - - if ( dest == SW_Corner ) { - sw_node = node; - sw_normal = normal; - sw_flag = true; - } else if ( dest == SE_Corner ) { - se_node = node; - se_normal = normal; - se_flag = true; - } else if ( dest == NE_Corner ) { - ne_node = node; - ne_normal = normal; - ne_flag = true; - } else if ( dest == NW_Corner ) { - nw_node = node; - nw_normal = normal; - nw_flag = true; - } else if ( dest == NORTH ) { - north_nodes.push_back(node); - north_normals.push_back(normal); - north_flag = true; - } else if ( dest == SOUTH ) { - south_nodes.push_back(node); - south_normals.push_back(normal); - south_flag = true; - } else if ( dest == EAST ) { - east_nodes.push_back(node); - east_normals.push_back(normal); - east_flag = true; - } else if ( dest == WEST ) { - west_nodes.push_back(node); - west_normals.push_back(normal); - west_flag = true; - } - } else if ( (target == "n_node") && (key == "n_null") ) { - south_flag = true; - } else if ( (target == "s_node") && (key == "s_null") ) { - north_flag = true; - } else if ( (target == "e_node") && (key == "e_null") ) { - west_flag = true; - } else if ( (target == "w_node") && (key == "w_null") ) { - east_flag = true; - } - } -} - - -// try to find info for the specified shared component -void FGMatch::load_shared( const FGConstruct& c, neighbor_type n ) { - FGBucket b = c.get_bucket(); - - double clon = b.get_center_lon(); - double clat = b.get_center_lat(); - - string base = c.get_work_base() + ".shared/Scenery/"; - - FGBucket cb; - - if ( n == SW_Corner ) { - // cout << "searching for SW corner data" << endl; - cb = fgBucketOffset(clon, clat, -1, 0); - scan_share_file( base, cb, SE_Corner, n ); - cb = fgBucketOffset(clon, clat, -1, -1); - scan_share_file( base, cb, NE_Corner, n ); - cb = fgBucketOffset(clon, clat, 0, -1); - scan_share_file( base, cb, NW_Corner, n ); - } else if ( n == SE_Corner ) { - // cout << "searching for SE corner data" << endl; - cb = fgBucketOffset(clon, clat, 0, -1); - scan_share_file( base, cb, NE_Corner, n ); - cb = fgBucketOffset(clon, clat, 1, -1); - scan_share_file( base, cb, NW_Corner, n ); - cb = fgBucketOffset(clon, clat, 1, 0); - scan_share_file( base, cb, SW_Corner, n ); - } else if ( n == NE_Corner ) { - // cout << "searching for NE corner data" << endl; - cb = fgBucketOffset(clon, clat, 1, 0); - scan_share_file( base, cb, NW_Corner, n ); - cb = fgBucketOffset(clon, clat, 1, 1); - scan_share_file( base, cb, SW_Corner, n ); - cb = fgBucketOffset(clon, clat, 0, 1); - scan_share_file( base, cb, SE_Corner, n ); - } else if ( n == NW_Corner ) { - // cout << "searching for NW corner data" << endl; - cb = fgBucketOffset(clon, clat, 0, 1); - scan_share_file( base, cb, SW_Corner, n ); - cb = fgBucketOffset(clon, clat, -1, 1); - scan_share_file( base, cb, SE_Corner, n ); - cb = fgBucketOffset(clon, clat, -1, 0); - scan_share_file( base, cb, NE_Corner, n ); - } else if ( n == NORTH ) { - // cout << "searching for NORTH edge data" << endl; - cb = fgBucketOffset(clon, clat, 0, 1); - scan_share_file( base, cb, SOUTH, n ); - } else if ( n == SOUTH ) { - // cout << "searching for SOUTH edge data" << endl; - cb = fgBucketOffset(clon, clat, 0, -1); - scan_share_file( base, cb, NORTH, n ); - } else if ( n == EAST ) { - // cout << "searching for EAST edge data" << endl; - cb = fgBucketOffset(clon, clat, 1, 0); - scan_share_file( base, cb, WEST, n ); - } else if ( n == WEST ) { - // cout << "searching for WEST edge data" << endl; - cb = fgBucketOffset(clon, clat, -1, 0); - scan_share_file( base, cb, EAST, n ); - } -} - - -// load any previously existing shared data from all neighbors (if -// shared data for a component exists set that components flag to true -void FGMatch::load_neighbor_shared( FGConstruct& c ) { - cout << "Loading existing shared data from neighbor tiles" << endl; - - // start with all flags false - sw_flag = se_flag = ne_flag = nw_flag = false; - north_flag = south_flag = east_flag = west_flag = false; - - load_shared( c, SW_Corner ); - load_shared( c, SE_Corner ); - load_shared( c, NE_Corner ); - load_shared( c, NW_Corner ); - - north_nodes.clear(); - south_nodes.clear(); - east_nodes.clear(); - west_nodes.clear(); - - load_shared( c, NORTH ); - load_shared( c, SOUTH ); - load_shared( c, EAST ); - load_shared( c, WEST ); -} - - -// split up the tile between the shared edge points, normals, and -// segments and the body. This must be done after calling -// load_neighbor_data() and will ignore any shared data from the -// current tile that already exists from a neighbor. -void FGMatch::split_tile( FGConstruct& c ) { - - cout << "Extracting (shared) edge nodes and normals" << endl; - - // calculate tile boundaries - point2d min, max; - FGBucket b = c.get_bucket(); - min.x = b.get_center_lon() - 0.5 * b.get_width(); - min.y = b.get_center_lat() - 0.5 * b.get_height(); - max.x = b.get_center_lon() + 0.5 * b.get_width(); - max.y = b.get_center_lat() + 0.5 * b.get_height(); - - // separate nodes and normals into components - - body_nodes.clear(); - - point_list nodes = c.get_geod_nodes(); - point_list point_normals = c.get_point_normals(); - - for ( int i = 0; i < (int)nodes.size(); ++i ) { - Point3D node = nodes[i]; - Point3D normal = point_normals[i]; - - if ( (fabs(node.y() - min.y) < FG_EPSILON) && - (fabs(node.x() - min.x) < FG_EPSILON) ) { - if ( ! sw_flag ) { - sw_node = node; - sw_normal = normal; - } - } else if ( (fabs(node.y() - min.y) < FG_EPSILON) && - (fabs(node.x() - max.x) < FG_EPSILON) ) { - if ( ! se_flag ) { - se_node = node; - se_normal = normal; - } - } else if ( (fabs(node.y() - max.y) < FG_EPSILON) && - (fabs(node.x() - max.x) < FG_EPSILON)) { - if ( ! ne_flag ) { - ne_node = node; - ne_normal = normal; - } - } else if ( (fabs(node.y() - max.y) < FG_EPSILON) && - (fabs(node.x() - min.x) < FG_EPSILON) ) { - if ( ! nw_flag ) { - nw_node = node; - nw_normal = normal; - } - } else if ( fabs(node.x() - min.x) < FG_EPSILON ) { - if ( ! west_flag ) { - west_nodes.push_back( node ); - west_normals.push_back( normal ); - } - } else if ( fabs(node.x() - max.x) < FG_EPSILON ) { - if ( ! east_flag ) { - east_nodes.push_back( node ); - east_normals.push_back( normal ); - } - } else if ( fabs(node.y() - min.y) < FG_EPSILON ) { - if ( ! south_flag ) { - south_nodes.push_back( node ); - south_normals.push_back( normal ); - } - } else if ( fabs(node.y() - max.y) < FG_EPSILON ) { - if ( ! north_flag ) { - north_nodes.push_back( node ); - north_normals.push_back( normal ); - } - } else { - body_nodes.push_back( node ); - body_normals.push_back( normal ); - } - } - - // separate area edge segment into components - cout << "Extracting (shared) area edge segments" << endl; - - FGTriSeg seg; - Point3D p1, p2; - triseg_list seg_list = c.get_tri_segs().get_seg_list(); - triseg_list_iterator current = seg_list.begin(); - triseg_list_iterator last = seg_list.end(); - - for ( ; current != last; ++current ) { - seg = *current; - p1 = nodes[ seg.get_n1() ]; - p2 = nodes[ seg.get_n2() ]; - - if ( fabs(p1.y() - p2.y()) < FG_EPSILON ) { - // check if horizontal - if ( fabs(p1.y() - max.y) < FG_EPSILON ) { - north_segs.push_back( seg ); - } else if ( fabs(p1.y() - min.y) < FG_EPSILON ) { - south_segs.push_back( seg ); - } else { - body_segs.push_back( seg ); - } - } else if ( fabs(p1.x() - p2.x()) < FG_EPSILON ) { - // check if vertical - if ( fabs(p1.x() - max.x) < FG_EPSILON ) { - east_segs.push_back( seg ); - } else if ( fabs(p1.x() - min.x) < FG_EPSILON ) { - west_segs.push_back( seg ); - } else { - body_segs.push_back( seg ); - } - } else { - body_segs.push_back( seg ); - } - } -} - - -// write the new shared edge points, normals, and segments for this -// tile -void FGMatch::write_shared( FGConstruct& c ) { - string base = c.get_work_base(); - FGBucket b = c.get_bucket(); - - string dir = base + ".shared/Scenery/" + b.gen_base_path(); - string command = "mkdir -p " + dir; - string file = dir + "/" + b.gen_index_str(); - cout << "shared data will be written to " << file << endl; - - system(command.c_str()); - -#if 0 - cout << "FLAGS" << endl; - cout << "=====" << endl; - cout << "sw_flag = " << sw_flag << endl; - cout << "se_flag = " << se_flag << endl; - cout << "ne_flag = " << ne_flag << endl; - cout << "nw_flag = " << nw_flag << endl; - cout << "north_flag = " << north_flag << endl; - cout << "south_flag = " << south_flag << endl; - cout << "east_flag = " << east_flag << endl; - cout << "west_flag = " << west_flag << endl; -#endif - - FILE *fp; - if ( (fp = fopen( file.c_str(), "w" )) == NULL ) { - cout << "ERROR: opening " << file << " for writing!" << endl; - exit(-1); - } - - if ( ! sw_flag ) { - fprintf( fp, "sw_node %.6f %.6f %.6f\n", - sw_node.x(), sw_node.y(), sw_node.z() ); - fprintf( fp, "sw_normal %.6f %.6f %.6f\n", - sw_normal.x(), sw_normal.y(), sw_normal.z() ); - } - - if ( ! se_flag ) { - fprintf( fp, "se_node %.6f %.6f %.6f\n", - se_node.x(), se_node.y(), se_node.z() ); - fprintf( fp, "se_normal %.6f %.6f %.6f\n", - se_normal.x(), se_normal.y(), se_normal.z() ); - } - - if ( ! nw_flag ) { - fprintf( fp, "nw_node %.6f %.6f %.6f\n", - nw_node.x(), nw_node.y(), nw_node.z() ); - fprintf( fp, "nw_normal %.6f %.6f %.6f\n", - nw_normal.x(), nw_normal.y(), nw_normal.z() ); - } - - if ( ! ne_flag ) { - fprintf( fp, "ne_node %.6f %.6f %.6f\n", - ne_node.x(), ne_node.y(), ne_node.z() ); - fprintf( fp, "ne_normal %.6f %.6f %.6f\n", - ne_normal.x(), ne_normal.y(), ne_normal.z() ); - } - - if ( ! north_flag ) { - if ( (int)north_nodes.size() == 0 ) { - fprintf( fp, "n_null -999.0 -999.0 -999.0\n" ); - } else { - for ( int i = 0; i < (int)north_nodes.size(); ++i ) { - fprintf( fp, "n_node %.6f %.6f %.6f\n", - north_nodes[i].x(), north_nodes[i].y(), - north_nodes[i].z() ); - fprintf( fp, "n_normal %.6f %.6f %.6f\n", - north_normals[i].x(), north_normals[i].y(), - north_normals[i].z() ); - } - } - } - - if ( ! south_flag ) { - if ( (int)south_nodes.size() == 0 ) { - fprintf( fp, "s_null -999.0 -999.0 -999.0\n" ); - } else { - for ( int i = 0; i < (int)south_nodes.size(); ++i ) { - fprintf( fp, "s_node %.6f %.6f %.6f\n", - south_nodes[i].x(), south_nodes[i].y(), - south_nodes[i].z() ); - fprintf( fp, "s_normal %.6f %.6f %.6f\n", - south_normals[i].x(), south_normals[i].y(), - south_normals[i].z() ); - } - } - } - - if ( ! east_flag ) { - if ( (int)east_nodes.size() == 0 ) { - fprintf( fp, "e_null -999.0 -999.0 -999.0\n" ); - } else { - for ( int i = 0; i < (int)east_nodes.size(); ++i ) { - fprintf( fp, "e_node %.6f %.6f %.6f\n", - east_nodes[i].x(), east_nodes[i].y(), - east_nodes[i].z() ); - fprintf( fp, "e_normal %.6f %.6f %.6f\n", - east_normals[i].x(), east_normals[i].y(), - east_normals[i].z() ); - } - } - } - - if ( ! west_flag ) { - if ( (int)west_nodes.size() == 0 ) { - fprintf( fp, "w_null -999.0 -999.0 -999.0\n" ); - } else { - for ( int i = 0; i < (int)west_nodes.size(); ++i ) { - fprintf( fp, "w_node %.6f %.6f %.6f\n", - west_nodes[i].x(), west_nodes[i].y(), - west_nodes[i].z() ); - fprintf( fp, "w_normal %.6f %.6f %.6f\n", - west_normals[i].x(), west_normals[i].y(), - west_normals[i].z() ); - } - } - } - -#if 0 // not needed - point_list nodes = c.get_geod_nodes(); - Point3D p1, p2; - - for ( int i = 0; i < (int)north_segs.size(); ++i ) { - p1 = nodes[ north_segs[i].get_n1() ]; - p2 = nodes[ north_segs[i].get_n2() ]; - fprintf( fp, "n_seg %.6f %.6f %.6f %.6f\n", - p1.x(), p1.y(), p2.x(), p2.y() ); - } - - for ( int i = 0; i < (int)south_segs.size(); ++i ) { - p1 = nodes[ south_segs[i].get_n1() ]; - p2 = nodes[ south_segs[i].get_n2() ]; - fprintf( fp, "s_seg %.6f %.6f %.6f %.6f\n", - p1.x(), p1.y(), p2.x(), p2.y() ); - } - - for ( int i = 0; i < (int)east_segs.size(); ++i ) { - p1 = nodes[ east_segs[i].get_n1() ]; - p2 = nodes[ east_segs[i].get_n2() ]; - fprintf( fp, "e_seg %.6f %.6f %.6f %.6f\n", - p1.x(), p1.y(), p2.x(), p2.y() ); - } - - for ( int i = 0; i < (int)west_segs.size(); ++i ) { - p1 = nodes[ west_segs[i].get_n1() ]; - p2 = nodes[ west_segs[i].get_n2() ]; - fprintf( fp, "w_seg %.6f %.6f %.6f %.6f\n", - p1.x(), p1.y(), p2.x(), p2.y() ); - } -#endif - - fclose( fp ); - - command = "gzip --force --best " + file; - system(command.c_str()); -} - - -// insert normal into vector, extending it first if needed -void insert_normal( point_list& normals, Point3D n, int i ) { - Point3D empty( 0.0 ); - - // extend vector if needed - while ( i >= (int)normals.size() ) { - normals.push_back( empty ); - } - - normals[i] = n; -} - - -// reassemble the tile pieces (combining the shared data and our own -// data) -void FGMatch::assemble_tile( FGConstruct& c ) { - FGTriNodes new_nodes; - new_nodes.clear(); - - point_list new_normals; - new_normals.clear(); - - FGTriSegments new_segs; - new_segs.clear(); - - // add the corner points - int sw_index = new_nodes.unique_add( sw_node ); - insert_normal( new_normals, sw_normal, sw_index ); - - int se_index = new_nodes.unique_add( se_node ); - insert_normal( new_normals, se_normal, se_index ); - - int ne_index = new_nodes.unique_add( ne_node ); - insert_normal( new_normals, ne_normal, ne_index ); - - int nw_index = new_nodes.unique_add( nw_node ); - insert_normal( new_normals, nw_normal, nw_index ); - - // add the edge points - - int index; - - for ( int i = 0; i < (int)north_nodes.size(); ++i ) { - index = new_nodes.unique_add( north_nodes[i] ); - insert_normal( new_normals, north_normals[i], index ); - } - - for ( int i = 0; i < (int)south_nodes.size(); ++i ) { - index = new_nodes.unique_add( south_nodes[i] ); - insert_normal( new_normals, south_normals[i], index ); - } - - for ( int i = 0; i < (int)east_nodes.size(); ++i ) { - index = new_nodes.unique_add( east_nodes[i] ); - insert_normal( new_normals, east_normals[i], index ); - } - - // cout << "Total west nodes = " << west_nodes.size() << endl; - for ( int i = 0; i < (int)west_nodes.size(); ++i ) { - // cout << "adding west node " << west_nodes[i] << endl; - index = new_nodes.unique_add( west_nodes[i] ); - insert_normal( new_normals, west_normals[i], index ); - } - - // add the body points - for ( int i = 0; i < (int)body_nodes.size(); ++i ) { - index = new_nodes.unique_add( body_nodes[i] ); - insert_normal( new_normals, body_normals[i], index ); - } - - // add the edge segments - new_segs.unique_divide_and_add( new_nodes.get_node_list(), - FGTriSeg(sw_index, se_index) ); - new_segs.unique_divide_and_add( new_nodes.get_node_list(), - FGTriSeg(se_index, ne_index) ); - new_segs.unique_divide_and_add( new_nodes.get_node_list(), - FGTriSeg(ne_index, nw_index) ); - new_segs.unique_divide_and_add( new_nodes.get_node_list(), - FGTriSeg(nw_index, sw_index) ); - - // add the body segments - - point_list geod_nodes = c.get_geod_nodes(); - - FGTriSeg seg; - Point3D p1, p2; - int n1, n2; - - triseg_list_iterator current = body_segs.begin(); - triseg_list_iterator last = body_segs.end(); - - for ( ; current != last; ++current ) { - seg = *current; - - // get the original points (x,y,z) - p1 = geod_nodes[ seg.get_n1() ]; - p2 = geod_nodes[ seg.get_n2() ]; - - // make sure these points are in the new node list (and get - // their new index) - n1 = new_nodes.unique_add( p1 ); - n2 = new_nodes.unique_add( p2 ); - - // add the segment using the new indices - new_segs.unique_divide_and_add( new_nodes.get_node_list(), - FGTriSeg(n1, n2) ); - } - - c.set_tri_nodes( new_nodes ); - c.set_point_normals( new_normals ); - c.set_tri_segs( new_segs ); -} diff --git a/Tools/Construct/Match/match.hxx b/Tools/Construct/Match/match.hxx deleted file mode 100644 index 91c2805ae..000000000 --- a/Tools/Construct/Match/match.hxx +++ /dev/null @@ -1,110 +0,0 @@ -// match.hxx -- Class to help match up tile edges -// -// Written by Curtis Olson, started April 1999. -// -// Copyright (C) 1998 - 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _MATCH_HXX -#define _MATCH_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include - -#include
-#include
- - -class FGMatch { - -private: - - // nodes breakdown - Point3D sw_node, se_node, ne_node, nw_node; - point_list north_nodes, south_nodes, east_nodes, west_nodes; - point_list body_nodes; - - // normals breakdown - Point3D sw_normal, se_normal, ne_normal, nw_normal; - point_list north_normals, south_normals, east_normals, west_normals; - point_list body_normals; - - // flags - bool sw_flag, se_flag, ne_flag, nw_flag; - bool north_flag, south_flag, east_flag, west_flag; - - // segment breakdown - triseg_list north_segs, south_segs, east_segs, west_segs; - triseg_list body_segs; - -public: - - enum neighbor_type { - SW_Corner = 1, - SE_Corner = 2, - NE_Corner = 3, - NW_Corner = 4, - NORTH = 5, - SOUTH = 6, - EAST = 7, - WEST = 8 - }; - - // Constructor - FGMatch( void ); - - // Destructor - ~FGMatch( void ); - - // load any previously existing shared data from all neighbors (if - // shared data for a component exists set that components flag to - // true - void load_neighbor_shared( FGConstruct& c ); - - // scan the specified share file for the specified information - void scan_share_file( const string& dir, const FGBucket& b, - neighbor_type search, neighbor_type dest ); - - // try to find info for the specified shared component - void load_shared( const FGConstruct& c, neighbor_type n ); - - // split up the tile between the shared edge points, normals, and - // segments and the body. This must be done after calling - // load_neighbor_data() and will ignore any shared data from the - // current tile that already exists from a neighbor. - void split_tile( FGConstruct& c ); - - // write the new shared edge points, normals, and segments for - // this tile - void write_shared( FGConstruct& c ); - - // reassemble the tile pieces (combining the shared data and our - // own data) - void assemble_tile( FGConstruct& c ); -}; - - -#endif // _MATCH_HXX diff --git a/Tools/Construct/Parallel/Makefile.am b/Tools/Construct/Parallel/Makefile.am deleted file mode 100644 index a42f80990..000000000 --- a/Tools/Construct/Parallel/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -bin_PROGRAMS = fgfs-tools-server fgfs-tools-client - -fgfs_tools_server_SOURCES = server.cxx - -fgfs_tools_server_LDADD = \ - $(top_builddir)/Lib/Bucket/libBucket.a \ - $(top_builddir)/Lib/Misc/libMisc.a - -fgfs_tools_client_SOURCES = client.cxx - -fgfs_tools_client_LDADD = \ - $(top_builddir)/Lib/Bucket/libBucket.a \ - $(top_builddir)/Lib/Misc/libMisc.a - -INCLUDES += \ - -I$(top_builddir) \ - -I$(top_builddir)/Lib \ - -I$(top_builddir)/Tools/Lib \ - -I$(top_builddir)/Tools/Construct diff --git a/Tools/Construct/Parallel/client.cxx b/Tools/Construct/Parallel/client.cxx deleted file mode 100644 index 2138b971e..000000000 --- a/Tools/Construct/Parallel/client.cxx +++ /dev/null @@ -1,281 +0,0 @@ -/* remote_exec.c -- Written by Curtis Olson */ -/* -- for CSci 5502 */ - - -#ifdef HAVE_CONFIG_H -# include -#endif - -#ifdef HAVE_SYS_PARAM_H -# include // BSD macro definitions -#endif - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include // atoi() -#include // bcopy() - -#include -#include - -#include - - -#define MAXBUF 1024 -#define BUSY_WAIT_TIME 30 - - -string work_base = ""; -string output_base = ""; - - -// check if it is ok to run -void check_master_switch() { - string file = work_base + ".status/MASTER_ON"; - - FILE *fp = fopen( file.c_str(), "r" ); - if ( fp == NULL ) { - cout << "MASTER_ON file not found ... exiting." << endl; - exit(0); - } - - fclose( fp ); -} - - -// check if the host system is free of interactive users -int system_free() { -#ifndef BSD - struct utmp *uptr; - - setutent(); - - while ( (uptr = getutent()) != NULL ) { - // cout << "NULL = " << NULL << " uptr = " << uptr << endl; - // cout << "user = ut_user = " << uptr->ut_user << endl; - // cout << "user = ut_type = " << uptr->ut_type << endl; - if (uptr->ut_type == USER_PROCESS) { - // found someone - endutent(); - return 0; - } - } - - endutent(); -#else -# warning Port me -#endif - - return 1; -} - - -int make_socket (char *host, unsigned short int port) { - int sock; - struct sockaddr_in name; - struct hostent *hp; - - // Create the socket. - sock = socket (PF_INET, SOCK_STREAM, 0); - if (sock < 0) { - perror ("socket"); - exit (EXIT_FAILURE); - } - - // specify address family - name.sin_family = AF_INET; - - // get the hosts official name/info - hp = gethostbyname(host); - - // Connect this socket to the host and the port specified on the - // command line - bcopy(hp->h_addr, &(name.sin_addr.s_addr), hp->h_length); - name.sin_port = htons(port); - - if ( connect(sock, (struct sockaddr *) &name, - sizeof(struct sockaddr_in)) < 0 ) - { - close(sock); - perror("Cannot connect to stream socket"); - return -1; - } - - return sock; -} - - -// connect to the server and get the next task -long int get_next_task( const string& host, int port, long int last_tile ) { - long int tile; - int sock, len; - fd_set ready; - char message[256]; - - // loop till we get a socket connection - while ( (sock = make_socket( host.c_str(), port )) < 0 ) { - // check if the master switch is on - check_master_switch(); - - sleep(1); - } - - // build a command string from the argv[]'s - sprintf(message, "%ld", last_tile); - - // send command and arguments to remote server - if ( write(sock, message, sizeof(message)) < 0 ) { - perror("Cannot write to stream socket"); - } - - // loop until remote program finishes - cout << "querying server for next task ..." << endl; - - FD_ZERO(&ready); - FD_SET(sock, &ready); - - // block until input from sock - select(32, &ready, 0, 0, NULL); - cout << " received reply" << endl; - - if ( FD_ISSET(sock, &ready) ) { - /* input coming from socket */ - if ( (len = read(sock, message, 1024)) > 0 ) { - message[len] = '\0'; - tile = atoi(message); - cout << " tile to construct = " << tile << endl; - close(sock); - return tile; - } else { - close(sock); - return -1; - } - } - - close(sock); - return -1; -} - - -// build the specified tile, return true if contruction completed -// successfully -bool construct_tile( const FGBucket& b, const string& result_file ) { - double angle = 10.0; - bool still_trying = true; - - while ( still_trying ) { - still_trying = false; - char angle_str[256]; - sprintf(angle_str, "%.0f", angle); - string command = "fgfs-construct "; - command += angle_str; - command += " " + work_base + " " + output_base + " " - + b.gen_index_str() + " > " + result_file + " 2>&1"; - cout << command << endl; - - system( command.c_str() ); - - FILE *fp = fopen( result_file.c_str(), "r" ); - char line[256]; - while ( fgets( line, 256, fp ) != NULL ) { - string line_str = line; - line_str = line_str.substr(0, line_str.length() - 1); - // cout << line_str << endl; - if ( line_str == "[Finished successfully]" ) { - fclose(fp); - return true; - } else if - ( (line_str.substr(0, 31) == "Error: Ran out of precision at") - || (line_str.substr(0, 22) == "Error: Out of memory.") - || (line_str.substr(0, 23) == "Error: Too many nodes.") ) { - if ( angle > 9.0 ) { - angle = 5.0; - still_trying = true; - } else if ( angle > 4.0 ) { - angle = 0.0; - still_trying = true; - } - } - - } - fclose(fp); - - if ( !still_trying && ( angle > 0.0 ) ) { - // build died for some reason ... lets try one last time - // with an interior angle restriction of 0 - angle = 0.0; - still_trying = true; - } - } - return false; -} - - -main(int argc, char *argv[]) { - long int tile, last_tile; - bool rude = false; - bool result; - - // Check usage - if ( argc < 5 ) { - printf("Usage: %s remote_machine port work_base output_base [ -r ]\n", - argv[0]); - exit(1); - } - - string host = argv[1]; - int port = atoi( argv[2] ); - work_base = argv[3]; - output_base = argv[4]; - - if ( argc == 6 ) { - string option = argv[5]; - if ( option == "-r" ) { - cout << "Running in RUDE mode!" << endl; - rude = true; - } - } - // get hostname and pid - char hostname[MAXBUF]; - gethostname( hostname, MAXBUF ); - pid_t pid = getpid(); - - char tmp[MAXBUF]; - sprintf(tmp, "result.%s.%d", hostname, pid); - string result_file = work_base + ".status/" + tmp; - - last_tile = 0; - - // check if the master switch is on - check_master_switch(); - - while ( (tile = get_next_task( host, port, last_tile )) >= 0 ) { - result = construct_tile( FGBucket(tile), result_file ); - if ( result ) { - last_tile = tile; - } else { - last_tile = -tile; - } - - // check if the master switch is on - check_master_switch(); - - // niceness policy: This whole process should run niced. But - // additionally, if there is interactive use, we will sleep - // for 60 seconds between each tile to stagger out the load - // and impose less of an impact on the machine. - if ( !system_free() && !rude) { - cout << "System has interactive use, sleeping for " - << BUSY_WAIT_TIME << " seconds..." << endl; - sleep( BUSY_WAIT_TIME ); - } - } -} diff --git a/Tools/Construct/Parallel/fgfs-launch-clients b/Tools/Construct/Parallel/fgfs-launch-clients deleted file mode 100755 index 0eaab1c09..000000000 --- a/Tools/Construct/Parallel/fgfs-launch-clients +++ /dev/null @@ -1,130 +0,0 @@ -#!/bin/sh - -# fgfs-launch-clinets -- script to launch fgfs scenery construction clients -# -# Written by Curtis Olson, started May 1999. -# -# Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id$ - -CLIENT=fgfs-tools-client -HOSTNAME=`uname -n` - -# check usage -if [ $# != 1 ]; then - echo "Usage: $0 base_dir" - exit -else - BASE_DIR=$1 - CLIENT_LIST_RUDE="${BASE_DIR}/clients.rude" - CLIENT_LIST_NICE="${BASE_DIR}/clients.nice" - WORK_BASE="${BASE_DIR}/work" - OUTPUT_DIR="${BASE_DIR}/FlightGear" - LOG_DIR="${BASE_DIR}/work.status" - SERVER_LOG_FILE=${LOG_DIR}/server.log - echo "Base directory is $BASE_DIR" - echo "Client list files are $CLIENT_LIST_RUDE $CLIENT_LIST_NICE" - echo "Work base is $WORK_BASE" - echo "Output base is $OUTPUT_DIR" - echo "Logging to $LOG_FILE" -fi - -SERVER_HOST=`grep "Server launched" $SERVER_LOG_FILE | awk '{ print $5 }'` -if [ "x$SERVER_HOST" = "x" ]; then - echo "Can't find server host name in $SERVER_LOG_FILE" - exit -else - echo "Server hostname is $SERVER_HOST" -fi - -SERVER_PORT=`grep port $SERVER_LOG_FILE | awk '{ print $7 }'` -if [ "x$SERVER_PORT" = "x" ]; then - echo "Can't find server port number in $SERVER_LOG_FILE" - exit -else - echo "Server port number is $SERVER_PORT" -fi - -# check if client binary exists -if type $CLIENT > /dev/null; then - echo "client: `type $CLIENT`" -else - echo "cannot locate $CLIENT" - exit -fi - -# read client lists -if [ -f $CLIENT_LIST_RUDE ]; then - TMP=`cat $CLIENT_LIST_RUDE` - CLIENTS_RUDE=`echo $TMP` -fi -if [ -f $CLIENT_LIST_NICE ]; then - TMP=`cat $CLIENT_LIST_NICE` - CLIENTS_NICE=`echo $TMP` -fi -echo "Rude clients = $CLIENTS_RUDE" -echo "Nice clients = $CLIENTS_NICE" - -# check if log directory exists, and if not, make it -if [ ! -d $LOG_DIR ]; then - mkdir -p $LOG_DIR -fi - -# launch a copy of the client process on each specified machine - -for i in $CLIENTS_RUDE; do - if ping -c 1 -i 5 $i > /dev/null; then - echo "Launching client process on $i" - else - echo "client $i is currently down, skipping" - continue - fi - - LOG_FILE="${LOG_DIR}/client-$i.log" - - # KILL_COMMAND="killall $CLIENT" - # ssh -n $i "$KILL_COMMAND" - - RMT_COMMAND="source ~/.profile; nice $CLIENT $SERVER_HOST $SERVER_PORT $WORK_BASE $OUTPUT_DIR -r" - echo "client command:" - echo "" - echo "$RMT_COMMAND" - echo "" - ssh -n $i "$RMT_COMMAND > $LOG_FILE 2>&1 &" -done - -for i in $CLIENTS_NICE; do - if ping -c 1 -i 5 $i > /dev/null; then - echo "Launching client process on $i" - else - echo "client $i is currently down, skipping" - continue - fi - - LOG_FILE="${LOG_DIR}/client-$i.log" - - # KILL_COMMAND="killall $CLIENT" - # ssh -n $i "$KILL_COMMAND" - - RMT_COMMAND="source ~/.profile; nice $CLIENT $SERVER_HOST $SERVER_PORT $WORK_BASE $OUTPUT_DIR" - echo "client command:" - echo "" - echo "$RMT_COMMAND" - echo "" - ssh -n $i "$RMT_COMMAND > $LOG_FILE 2>&1 &" -done \ No newline at end of file diff --git a/Tools/Construct/Parallel/fgfs-launch-server b/Tools/Construct/Parallel/fgfs-launch-server deleted file mode 100755 index 5dd513d6e..000000000 --- a/Tools/Construct/Parallel/fgfs-launch-server +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/sh - -# fgfs-launch-server -- script to launch fgfs scenery construction server -# -# Written by Curtis Olson, started May 1999. -# -# Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id$ - -SERVER=fgfs-tools-server - -# check usage -if [ $# != 1 ]; then - echo "Usage: $0 base_dir" - exit -else - BASE_DIR=$1 - WORK_BASE="${BASE_DIR}/work" - OUTPUT_DIR="${BASE_DIR}/FlightGear" - MASTER_ON="${WORK_BASE}.status/MASTER_ON" - LOG_DIR="${BASE_DIR}/work.status" - LOG_FILE="${LOG_DIR}/server.log" - echo "Base directory is $BASE_DIR" - echo "Work base is $WORK_BASE" - echo "Output base is $OUTPUT_DIR" - echo "Logging to $LOG_FILE" -fi - -# check if server binary exists -if type $SERVER > /dev/null; then - echo "server: `type $SERVER`" -else - echo "cannot locate $SERVER" - exit -fi - -# check if log directory exists, and if not, make it -if [ ! -d $LOG_DIR ]; then - mkdir -p $LOG_DIR -fi - -# kill any existing copies of the server -killall $SERVER - -# launch the server in the background -SERVER_HOST=`hostname -f` -COMMAND="$SERVER $WORK_BASE $OUTPUT_DIR" -echo "Launching the server with the following options:" -echo "" -echo "$COMMAND" -echo "" -echo "Server launched on host: $SERVER_HOST" > $LOG_FILE -$COMMAND >> $LOG_FILE 2>&1 & - -# grab the PID -SERVER_PID=`echo $!` - -# wait for a moment -sleep 1 - -# grab the port number -SERVER_PORT=`grep port $LOG_FILE | awk '{ print $7 }'` - -# turn on the master switch -echo $SERVER_PORT > $MASTER_ON - -# finish -echo "server is now running in background:" -echo " host = $SERVER_HOST" -echo " pid = $SERVER_PID" -echo " port = $SERVER_PORT" diff --git a/Tools/Construct/Parallel/fgfs-shutdown b/Tools/Construct/Parallel/fgfs-shutdown deleted file mode 100755 index d2791df2a..000000000 --- a/Tools/Construct/Parallel/fgfs-shutdown +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -# fgfs-shutdwon -- script to shutdown all the tile building clients and server -# -# Written by Curtis Olson, started May 1999. -# -# Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id$ - -SERVER=fgfs-tools-server - -# check usage -if [ $# != 1 ]; then - echo "Usage: $0 base_dir" - exit -else - BASE_DIR=$1 - WORK_BASE="${BASE_DIR}/work" - MASTER_ON="${WORK_BASE}.status/MASTER_ON" - echo "Base directory is $BASE_DIR" - echo "Master ON file is $MASTER_ON" -fi - -# remove the MASTER_ON switch so all the clients exit -echo "Removing the master switch file so all the clients will stop" -/bin/rm $MASTER_ON - -# kill the server -echo "Killing the server" -killall $SERVER diff --git a/Tools/Construct/Parallel/server.cxx b/Tools/Construct/Parallel/server.cxx deleted file mode 100644 index fe53a6175..000000000 --- a/Tools/Construct/Parallel/server.cxx +++ /dev/null @@ -1,338 +0,0 @@ -// remote_server.c -- Written by Curtis Olson -// -- for CSci 5502 - - -#include -#include -#include // for stat() -#include - -#include // bind -#include - -#include -#include - -#include -#include - -#include - - -#define MAXBUF 1024 - - -static double lat = 0.0; -static double lon = 0.0; -static double dy = 0.0; -static int pass = 0; -static bool first_time = false; - -int make_socket (unsigned short int* port) { - int sock; - struct sockaddr_in name; - int length; - - // Create the socket. - sock = socket (PF_INET, SOCK_STREAM, 0); - if (sock < 0) { - perror ("socket"); - exit (EXIT_FAILURE); - } - - // Give the socket a name. - name.sin_family = AF_INET; - name.sin_addr.s_addr = INADDR_ANY; - name.sin_port = 0 /* htons (port) */; - name.sin_addr.s_addr = htonl (INADDR_ANY); - if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) { - perror ("bind"); - exit (EXIT_FAILURE); - } - - // Find the assigned port number - length = sizeof(struct sockaddr_in); - if ( getsockname(sock, (struct sockaddr *) &name, &length) ) { - perror("Cannot get socket's port number"); - } - *port = ntohs(name.sin_port); - - return sock; -} - - -// return true if file exists -static bool file_exists( const string& file ) { - struct stat buf; - - if ( stat( file.c_str(), &buf ) == 0 ) { - return true; - } else { - return false; - } -} - - -// check if the specified tile has data defined for it -static bool has_data( const string& path, const FGBucket& b ) { - string dem_file = path + ".dem" + "/Scenery/" + b.gen_base_path() - + "/" + b.gen_index_str() + ".dem"; - if ( file_exists( dem_file ) ) { - return true; - } - - dem_file += ".gz"; - if ( file_exists( dem_file ) ) { - return true; - } - - return false; -} - - -// initialize the tile counting system -void init_tile_count() { - // pre-pass - pass = 0; - - // initial bogus value - lat = 100; - - // determine tile height - FGBucket tmp1( 0.0, 0.0 ); - dy = tmp1.get_height(); -} - - -// return the next tile -long int get_next_tile( const string& work_base ) -{ - FGBucket b; - static double shift_over = 0.0; - static double shift_up = 0.0; - - // cout << "lon = " << lon << " lat = " << lat << endl; - - if ( lat > 90.0 ) { - ++pass; - if ( pass == 1 ) { - shift_over = 0.0; - shift_up = 0.0; - } else if ( pass == 2 ) { - shift_over = 1.0; - shift_up = 0.0; - } else if ( pass == 3 ) { - shift_over = 0.0; - shift_up = 1.0; - } else if ( pass == 4 ) { - shift_over = 1.0; - shift_up = 1.0; - } else { - return -1; - } - - // reset lat - // lat = -89.0 + (shift_up*dy) - (dy*0.5); - // lat = 27.0 + (0*dy) + (dy*0.5); - if ( first_time ) { - first_time = false; - lat = 54.0 + (dy*0.5); - } else { - lat = 15.0 + (shift_up*dy) + (dy*0.5); - } - - // reset lon - FGBucket tmp( 0.0, lat ); - double dx = tmp.get_width(); - // lon = -82 + (shift_over*dx) + (dx*0.5); - lon = -180 + (shift_over*dx) + (dx*0.5); - - cout << "starting pass = " << pass - << " with lat = " << lat << " lon = " << lon << endl; - } - - // if ( ! start_lon ) { - // lon = -180 + dx * 0.5; - // } else { - // start_lon = false; - // } - - if ( lon > 180.0 ) { - // increment to next row - // skip every other row (to avoid two clients working on - // adjacent tiles) - lat += 2.0 * dy; - - FGBucket tmp( 0.0, lat ); - double dx = tmp.get_width(); - lon = -180 + (shift_over*dx) + (dx*0.5); - } - - b = FGBucket( lon, lat ); - - // increment to next tile - FGBucket tmp( 0.0, lat ); - double dx = tmp.get_width(); - - // skip every other column (to avoid two clients working on - // adjacent tiles) - lon += 2.0 * dx; - - return b.gen_index(); -} - - -// log a pending tile (has been given out as a taks for some client) -void log_pending_tile( const string& path, long int tile ) { - FGBucket b(tile); - - string pending_file = path + "/" + b.gen_index_str() + ".pending"; - - string command = "touch " + pending_file; - system( command.c_str() ); -} - - -// a tile is finished (removed the .pending file) -void log_finished_tile( const string& path, long int tile ) { - FGBucket b(tile); - - string finished_file = path + "/" + b.gen_index_str() + ".pending"; - // cout << "unlinking " << finished_file << endl; - unlink( finished_file.c_str() ); -} - - -// make note of a failed tile -void log_failed_tile( const string& path, long int tile ) { - FGBucket b(tile); - - string failed_file = path + "/" + b.gen_index_str() + ".failed"; - - string command = "touch " + failed_file; - system( command.c_str() ); - - cout << "logged bad tile = " << tile << endl; -} - - -// display usage and exit -void usage( const string name ) { - cout << "Usage: " << name << " " << endl; - exit(-1); -} - - -int main( int argc, char **argv ) { - long int next_tile; - int sock, msgsock, length, pid; - fd_set ready; - short unsigned int port; - - // quick argument sanity check - if ( argc < 3 ) { - usage( argv[0] ); - } - - string work_base = argv[1]; - string output_base = argv[2]; - - // initialize tile counter / incrementer - init_tile_count(); - - // create the status directory - string status_dir = work_base + ".status"; - string command = "mkdir -p " + status_dir; - system( command.c_str() ); - - // setup socket to listen on - sock = make_socket( &port ); - cout << "socket is connected to port = " << port << endl; - - // Specify the maximum length of the connection queue - listen(sock, 10); - - for ( ;; ) { - FD_ZERO(&ready); - FD_SET(sock, &ready); - - // block until we get some input on sock - select(32, &ready, 0, 0, NULL); - - if ( FD_ISSET(sock, &ready) ) { - // printf("%d %d Incomming message --> ", getpid(), pid); - - // get the next tile to work on - next_tile = get_next_tile( work_base ); - while ( ! has_data( work_base, FGBucket(next_tile) ) ) { - next_tile = get_next_tile( work_base ); - } - - cout << "Bucket = " << FGBucket(next_tile) - << " (" << pass << ")" << endl; - - log_pending_tile( status_dir, next_tile ); - // cout << "next tile = " << next_tile << endl;; - - msgsock = accept(sock, 0, 0); - // cout << "msgsock = " << msgsock << endl; - - // spawn a child - pid = fork(); - - if ( pid < 0 ) { - // error - perror("Cannot fork child process"); - exit(-1); - } else if ( pid > 0 ) { - // This is the parent - close(msgsock); - - // clean up all of our zombie children - int status; - while ( (pid = waitpid( WAIT_ANY, &status, WNOHANG )) > 0 ) { - // cout << "waitpid(): pid = " << pid - // << " status = " << status << endl; - } - } else { - // This is the child - - // cout << "new process started to handle new connection for " - // << next_tile << endl; - - // Read client's message (which is the status of the - // last scenery creation task.) - char buf[MAXBUF]; - if ( (length = read(msgsock, buf, MAXBUF)) < 0) { - perror("Cannot read command"); - exit(-1); - } - buf[length] = '\0'; - long int returned_tile = atoi(buf); - cout << "client returned = " << returned_tile << endl; - - // record status - if ( returned_tile < 0 ) { - // failure - log_failed_tile( status_dir, -returned_tile ); - log_finished_tile( status_dir, -returned_tile ); - } else { - // success - log_finished_tile( status_dir, returned_tile ); - } - - // reply to the client - char message[MAXBUF]; - sprintf(message, "%ld", next_tile); - length = strlen(message); - if ( write(msgsock, message, length) < 0 ) { - perror("Cannot write to stream socket"); - } - close(msgsock); - // cout << "process for " << next_tile << " ended" << endl; - - exit(0); - } - } - } -} diff --git a/Tools/Construct/Triangulate/Makefile.am b/Tools/Construct/Triangulate/Makefile.am deleted file mode 100644 index e62d4405b..000000000 --- a/Tools/Construct/Triangulate/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -noinst_LIBRARIES = libTriangulate.a - -libTriangulate_a_SOURCES = \ - polygon.cxx polygon.hxx \ - triangle.cxx triangle.hxx \ - trieles.cxx trieles.hxx \ - trinodes.cxx trinodes.hxx \ - trisegs.cxx trisegs.hxx - -INCLUDES += \ - -I$(top_builddir) \ - -I$(top_builddir)/Lib \ - -I$(top_builddir)/Tools/Lib \ - -I$(top_builddir)/Tools/Construct diff --git a/Tools/Construct/Triangulate/polygon.cxx b/Tools/Construct/Triangulate/polygon.cxx deleted file mode 100644 index cc6ff9040..000000000 --- a/Tools/Construct/Triangulate/polygon.cxx +++ /dev/null @@ -1,469 +0,0 @@ -// polygon.cxx -- polygon (with holes) management class -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -// include Generic Polygon Clipping Library -// -// http://www.cs.man.ac.uk/aig/staff/alan/software/ -// -extern "C" { -#include -} - -#include -#include - -#include "trisegs.hxx" -#include "polygon.hxx" - - -// Constructor -FGPolygon::FGPolygon( void ) { -} - - -// Destructor -FGPolygon::~FGPolygon( void ) { -} - - -// Given a line segment specified by two endpoints p1 and p2, return -// the slope of the line. -static double slope( const Point3D& p0, const Point3D& p1 ) { - if ( fabs(p0.x() - p1.x()) > FG_EPSILON ) { - return (p0.y() - p1.y()) / (p0.x() - p1.x()); - } else { - return 1.0e+999; // really big number - } -} - - -// Calculate theta of angle (a, b, c) -static double calc_angle(point2d a, point2d b, point2d c) { - point2d u, v; - double udist, vdist, uv_dot, tmp; - - // u . v = ||u|| * ||v|| * cos(theta) - - u.x = b.x - a.x; - u.y = b.y - a.y; - udist = sqrt( u.x * u.x + u.y * u.y ); - // printf("udist = %.6f\n", udist); - - v.x = b.x - c.x; - v.y = b.y - c.y; - vdist = sqrt( v.x * v.x + v.y * v.y ); - // printf("vdist = %.6f\n", vdist); - - uv_dot = u.x * v.x + u.y * v.y; - // printf("uv_dot = %.6f\n", uv_dot); - - tmp = uv_dot / (udist * vdist); - // printf("tmp = %.6f\n", tmp); - - return acos(tmp); -} - - -// Given a line segment specified by two endpoints p1 and p2, return -// the y value of a point on the line that intersects with the -// verticle line through x. Return true if an intersection is found, -// false otherwise. -static bool intersects( Point3D p0, Point3D p1, double x, Point3D *result ) { - // sort the end points - if ( p0.x() > p1.x() ) { - Point3D tmp = p0; - p0 = p1; - p1 = tmp; - } - - if ( (x < p0.x()) || (x > p1.x()) ) { - // out of range of line segment, bail right away - return false; - } - - // equation of a line through (x0,y0) and (x1,y1): - // - // y = y1 + (x - x1) * (y0 - y1) / (x0 - x1) - - double y; - - if ( fabs(p0.x() - p1.x()) > FG_EPSILON ) { - y = p1.y() + (x - p1.x()) * (p0.y() - p1.y()) / (p0.x() - p1.x()); - } else { - return false; - } - result->setx(x); - result->sety(y); - - if ( p0.y() <= p1.y() ) { - if ( (p0.y() <= y) && (y <= p1.y()) ) { - return true; - } - } else { - if ( (p0.y() >= y) && (y >= p1.y()) ) { - return true; - } - } - - return false; -} - - -// calculate some "arbitrary" point inside the specified contour for -// assigning attribute areas -void FGPolygon::calc_point_inside( const int contour, - const FGTriNodes& trinodes ) { - Point3D tmp, min, ln, p1, p2, p3, m, result; - int min_node_index = 0; - int min_index = 0; - int p1_index = 0; - int p2_index = 0; - int ln_index = 0; - - // 1. find a point on the specified contour, min, with smallest y - - // min.y() starts greater than the biggest possible lat (degrees) - min.sety( 100.0 ); - - point_list_iterator current, last; - current = poly[contour].begin(); - last = poly[contour].end(); - - for ( int i = 0; i < contour_size( contour ); ++i ) { - tmp = get_pt( contour, i ); - if ( tmp.y() < min.y() ) { - min = tmp; - min_index = trinodes.find( min ); - min_node_index = i; - - // cout << "min index = " << *current - // << " value = " << min_y << endl; - } else { - // cout << " index = " << *current << endl; - } - } - - cout << "min node index = " << min_node_index << endl; - cout << "min index = " << min_index - << " value = " << trinodes.get_node( min_index ) - << " == " << min << endl; - - // 2. take midpoint, m, of min with neighbor having lowest - // fabs(slope) - - if ( min_node_index == 0 ) { - p1 = poly[contour][1]; - p2 = poly[contour][poly[contour].size() - 1]; - } else if ( min_node_index == (int)(poly[contour].size()) - 1 ) { - p1 = poly[contour][0]; - p2 = poly[contour][poly[contour].size() - 2]; - } else { - p1 = poly[contour][min_node_index - 1]; - p2 = poly[contour][min_node_index + 1]; - } - p1_index = trinodes.find( p1 ); - p2_index = trinodes.find( p2 ); - - double s1 = fabs( slope(min, p1) ); - double s2 = fabs( slope(min, p2) ); - if ( s1 < s2 ) { - ln_index = p1_index; - ln = p1; - } else { - ln_index = p2_index; - ln = p2; - } - - FGTriSeg base_leg( min_index, ln_index ); - - m.setx( (min.x() + ln.x()) / 2.0 ); - m.sety( (min.y() + ln.y()) / 2.0 ); - cout << "low mid point = " << m << endl; - - // 3. intersect vertical line through m and all other segments of - // all other contours of this polygon. save point, p3, with - // smallest y > m.y - - p3.sety(100); - - for ( int i = 0; i < (int)poly.size(); ++i ) { - cout << "contour = " << i << " size = " << poly[i].size() << endl; - for ( int j = 0; j < (int)(poly[i].size() - 1); ++j ) { - // cout << " p1 = " << poly[i][j] << " p2 = " - // << poly[i][j+1] << endl; - p1 = poly[i][j]; - p2 = poly[i][j+1]; - p1_index = trinodes.find( p1 ); - p2_index = trinodes.find( p2 ); - - if ( intersects(p1, p2, m.x(), &result) ) { - cout << "intersection = " << result << endl; - if ( ( result.y() < p3.y() ) && - ( result.y() > m.y() ) && - ( base_leg != FGTriSeg(p1_index, p2_index) ) ) { - p3 = result; - } - } - } - // cout << " p1 = " << poly[i][0] << " p2 = " - // << poly[i][poly[i].size() - 1] << endl; - p1 = poly[i][0]; - p2 = poly[i][poly[i].size() - 1]; - p1_index = trinodes.find( p1 ); - p2_index = trinodes.find( p2 ); - if ( intersects(p1, p2, m.x(), &result) ) { - cout << "intersection = " << result << endl; - if ( ( result.y() < p3.y() ) && - ( result.y() > m.y() ) && - ( base_leg != FGTriSeg(p1_index, p2_index) ) ) { - p3 = result; - } - } - } - if ( p3.y() < 100 ) { - cout << "low intersection of other segment = " << p3 << endl; - inside_list[contour].setx( (m.x() + p3.x()) / 2.0 ); - inside_list[contour].sety( (m.y() + p3.y()) / 2.0 ); - } else { - cout << "Error: Failed to find a point inside :-(" << endl; - inside_list[contour] = p3; - // exit(-1); - } - - // 4. take midpoint of p2 && m as an arbitrary point inside polygon - - cout << "inside point = " << inside_list[contour] << endl; -} - - -// return the perimeter of a contour (assumes simple polygons, -// i.e. non-self intersecting.) -double FGPolygon::area_contour( const int contour ) { - // area = 1/2 * sum[i = 0 to k-1][x(i)*y(i+1) - x(i+1)*y(i)] - // where k is defined as 0 - - point_list c = poly[contour]; - int size = c.size(); - double sum = 0.0; - - for ( int i = 0; i < size; ++i ) { - sum += c[(i+1)%size].x() * c[i].y() - c[i].x() * c[(i+1)%size].y(); - } - - // area can be negative or positive depending on the polygon - // winding order - return fabs(sum / 2.0); -} - - -// return the smallest interior angle of the polygon -double FGPolygon::minangle_contour( const int contour ) { - point_list c = poly[contour]; - int size = c.size(); - int p1_index, p2_index, p3_index; - point2d p1, p2, p3; - double angle; - double min_angle = 2.0 * FG_PI; - - for ( int i = 0; i < size; ++i ) { - p1_index = i - 1; - if ( p1_index < 0 ) { - p1_index += size; - } - - p2_index = i; - - p3_index = i + 1; - if ( p3_index >= size ) { - p3_index -= size; - } - - p1.x = c[p1_index].x(); - p1.y = c[p1_index].y(); - - p2.x = c[p2_index].x(); - p2.y = c[p2_index].y(); - - p3.x = c[p3_index].x(); - p3.y = c[p3_index].y(); - - angle = calc_angle( p1, p2, p3 ); - - if ( angle < min_angle ) { - min_angle = angle; - } - } - - return min_angle; -} - - -// output -void FGPolygon::write( const string& file ) { - FILE *fp = fopen( file.c_str(), "w" ); - - for ( int i = 0; i < (int)poly.size(); ++i ) { - for ( int j = 0; j < (int)poly[i].size(); ++j ) { - fprintf(fp, "%.6f %.6f\n", poly[i][j].x(), poly[i][j].y()); - } - fprintf(fp, "%.6f %.6f\n", poly[i][0].x(), poly[i][0].y()); - } - - fclose(fp); -} - - -// -// wrapper functions for gpc polygon clip routines -// - -// Make a gpc_poly from an FGPolygon -void make_gpc_poly( const FGPolygon& in, gpc_polygon *out ) { - gpc_vertex_list v_list; - v_list.num_vertices = 0; - v_list.vertex = new gpc_vertex[FG_MAX_VERTICES]; - - // cout << "making a gpc_poly" << endl; - // cout << " input contours = " << in.contours() << endl; - - Point3D p; - // build the gpc_polygon structures - for ( int i = 0; i < in.contours(); ++i ) { - // cout << " contour " << i << " = " << in.contour_size( i ) << endl; - for ( int j = 0; j < in.contour_size( i ); ++j ) { - p = in.get_pt( i, j ); - v_list.vertex[j].x = p.x(); - v_list.vertex[j].y = p.y(); - } - v_list.num_vertices = in.contour_size( i ); - gpc_add_contour( out, &v_list, in.get_hole_flag( i ) ); - } - - // free alocated memory - delete v_list.vertex; -} - - -// Set operation type -typedef enum { - POLY_DIFF, // Difference - POLY_INT, // Intersection - POLY_XOR, // Exclusive or - POLY_UNION // Union -} clip_op; - - -// Generic clipping routine -FGPolygon polygon_clip( clip_op poly_op, const FGPolygon& subject, - const FGPolygon& clip ) -{ - FGPolygon result; - - gpc_polygon *gpc_subject = new gpc_polygon; - gpc_subject->num_contours = 0; - gpc_subject->contour = NULL; - gpc_subject->hole = NULL; - make_gpc_poly( subject, gpc_subject ); - - gpc_polygon *gpc_clip = new gpc_polygon; - gpc_clip->num_contours = 0; - gpc_clip->contour = NULL; - gpc_clip->hole = NULL; - make_gpc_poly( clip, gpc_clip ); - - gpc_polygon *gpc_result = new gpc_polygon; - gpc_result->num_contours = 0; - gpc_result->contour = NULL; - gpc_result->hole = NULL; - - gpc_op op; - if ( poly_op == POLY_DIFF ) { - op = GPC_DIFF; - } else if ( poly_op == POLY_INT ) { - op = GPC_INT; - } else if ( poly_op == POLY_XOR ) { - op = GPC_XOR; - } else if ( poly_op == POLY_UNION ) { - op = GPC_UNION; - } else { - cout << "Unknown polygon op, exiting." << endl; - exit(-1); - } - - gpc_polygon_clip( op, gpc_subject, gpc_clip, gpc_result ); - - for ( int i = 0; i < gpc_result->num_contours; ++i ) { - // cout << " processing contour = " << i << ", nodes = " - // << gpc_result->contour[i].num_vertices << ", hole = " - // << gpc_result->hole[i] << endl; - - // sprintf(junkn, "g.%d", junkc++); - // junkfp = fopen(junkn, "w"); - - for ( int j = 0; j < gpc_result->contour[i].num_vertices; j++ ) { - Point3D p( gpc_result->contour[i].vertex[j].x, - gpc_result->contour[i].vertex[j].y, - 0 ); - // junkp = in_nodes.get_node( index ); - // fprintf(junkfp, "%.4f %.4f\n", junkp.x(), junkp.y()); - result.add_node(i, p); - // cout << " - " << index << endl; - } - // fprintf(junkfp, "%.4f %.4f\n", - // gpc_result->contour[i].vertex[0].x, - // gpc_result->contour[i].vertex[0].y); - // fclose(junkfp); - - result.set_hole_flag( i, gpc_result->hole[i] ); - } - - // free allocated memory - gpc_free_polygon( gpc_subject ); - gpc_free_polygon( gpc_clip ); - gpc_free_polygon( gpc_result ); - - return result; -} - - -// Difference -FGPolygon polygon_diff( const FGPolygon& subject, const FGPolygon& clip ) { - return polygon_clip( POLY_DIFF, subject, clip ); -} - -// Intersection -FGPolygon polygon_int( const FGPolygon& subject, const FGPolygon& clip ) { - return polygon_clip( POLY_INT, subject, clip ); -} - - -// Exclusive or -FGPolygon polygon_xor( const FGPolygon& subject, const FGPolygon& clip ) { - return polygon_clip( POLY_XOR, subject, clip ); -} - - -// Union -FGPolygon polygon_union( const FGPolygon& subject, const FGPolygon& clip ) { - return polygon_clip( POLY_UNION, subject, clip ); -} diff --git a/Tools/Construct/Triangulate/polygon.hxx b/Tools/Construct/Triangulate/polygon.hxx deleted file mode 100644 index 7624e367a..000000000 --- a/Tools/Construct/Triangulate/polygon.hxx +++ /dev/null @@ -1,168 +0,0 @@ -// polygon.hxx -- polygon (with holes) management class -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _POLYGON_HXX -#define _POLYGON_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include -#include - -#include
- -#include "trinodes.hxx" - -FG_USING_STD(string); -FG_USING_STD(vector); - - -#define FG_MAX_VERTICES 100000 - - -typedef vector < point_list > polytype; -typedef polytype::iterator polytype_iterator; -typedef polytype::const_iterator const_polytype_iterator; - - -class FGPolygon { - -private: - - polytype poly; // polygons - point_list inside_list; // point inside list - int_list hole_list; // hole flag list - -public: - - // Constructor and destructor - FGPolygon( void ); - ~FGPolygon( void ); - - // Add a contour - inline void add_contour( const point_list contour, const int hole_flag ) { - poly.push_back( contour ); - hole_list.push_back( hole_flag ); - } - - // Get a contour - inline point_list get_contour( const int i ) const { - return poly[i]; - } - - // Delete a contour - inline void delete_contour( const int i ) { - polytype_iterator start_poly = poly.begin(); - poly.erase( start_poly + i ); - - int_list_iterator start_hole = hole_list.begin(); - hole_list.erase( start_hole + i ); - } - - // Add the specified node (index) to the polygon - inline void add_node( int contour, Point3D p ) { - if ( contour >= (int)poly.size() ) { - // extend polygon - point_list empty_contour; - empty_contour.clear(); - for ( int i = 0; i < contour - (int)poly.size() + 1; ++i ) { - poly.push_back( empty_contour ); - inside_list.push_back( Point3D(0.0) ); - hole_list.push_back( 0 ); - } - } - poly[contour].push_back( p ); - } - - // return size - inline int contours() const { return poly.size(); } - inline int contour_size( int contour ) const { - return poly[contour].size(); - } - - // return the ith polygon point index from the specified contour - inline Point3D get_pt( int contour, int i ) const { - return poly[contour][i]; - } - - // calculate some "arbitrary" point inside the specified contour for - // assigning attribute areas - void calc_point_inside( const int contour, const FGTriNodes& trinodes ); - inline Point3D get_point_inside( const int contour ) const { - return inside_list[contour]; - } - - // get and set hole flag - inline int get_hole_flag( const int contour ) const { - return hole_list[contour]; - } - inline void set_hole_flag( const int contour, const int flag ) { - hole_list[contour] = flag; - } - - // erase - inline void erase() { poly.clear(); } - - // informational - - // return the area of a contour (assumes simple polygons, - // i.e. non-self intersecting.) - double area_contour( const int contour ); - - // return the smallest interior angle of the polygon - double minangle_contour( const int contour ); - - // output - void write( const string& file ); -}; - - -typedef vector < FGPolygon > poly_list; -typedef poly_list::iterator poly_list_iterator; -typedef poly_list::const_iterator const_poly_list_iterator; - - -// wrapper functions for gpc polygon clip routines - -// Difference -FGPolygon polygon_diff( const FGPolygon& subject, const FGPolygon& clip ); - -// Intersection -FGPolygon polygon_int( const FGPolygon& subject, const FGPolygon& clip ); - -// Exclusive or -FGPolygon polygon_xor( const FGPolygon& subject, const FGPolygon& clip ); - -// Union -FGPolygon polygon_union( const FGPolygon& subject, const FGPolygon& clip ); - - -#endif // _POLYGON_HXX - - diff --git a/Tools/Construct/Triangulate/triangle.cxx b/Tools/Construct/Triangulate/triangle.cxx deleted file mode 100644 index a8e357235..000000000 --- a/Tools/Construct/Triangulate/triangle.cxx +++ /dev/null @@ -1,503 +0,0 @@ -// triangle.cxx -- "Triangle" interface class -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include "polygon.hxx" -#include "triangle.hxx" - -// Constructor -FGTriangle::FGTriangle( void ) { -} - - -// Destructor -FGTriangle::~FGTriangle( void ) { -} - - -// populate this class based on the specified gpc_polys list -int -FGTriangle::build( const point_list& corner_list, - const point_list& fit_list, - const FGPolyList& gpc_polys ) -{ - int debug_counter = 0; - int index; - - in_nodes.clear(); - in_segs.clear(); - - // Point3D junkp; - // int junkc = 0; - // char junkn[256]; - // FILE *junkfp; - - // traverse the dem corner and fit lists and gpc_polys building a - // unified node list and converting the polygons so that they - // reference the node list by index (starting at zero) rather than - // listing the points explicitely - - // first the corners since these are important - const_point_list_iterator f_current, f_last; - f_current = corner_list.begin(); - f_last = corner_list.end(); - for ( ; f_current != f_last; ++f_current ) { - index = in_nodes.unique_add( *f_current ); - } - - // next process the polygons - FGPolygon gpc_poly; - const_poly_list_iterator current, last; - - // process polygons in priority order - cout << "prepairing node list and polygons" << endl; - - for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) { - polylist[i].clear(); - - cout << "area type = " << i << endl; - debug_counter = 0; - current = gpc_polys.polys[i].begin(); - last = gpc_polys.polys[i].end(); - for ( ; current != last; ++current ) { - gpc_poly = *current; - - cout << "processing a polygon, contours = " - << gpc_poly.contours() << endl; - - if (gpc_poly.contours() <= 0 ) { - cout << "FATAL ERROR! no contours in this polygon" << endl; - exit(-1); - } - - int j; - for ( j = 0; j < gpc_poly.contours(); ++j ) { - cout << " processing contour = " << j << ", nodes = " - << gpc_poly.contour_size( j ) << ", hole = " - << gpc_poly.get_hole_flag( j ) << endl; - - // sprintf(junkn, "g.%d", junkc++); - // junkfp = fopen(junkn, "w"); - - for ( int k = 0; k < gpc_poly.contour_size( j ); k++ ) { - Point3D p = gpc_poly.get_pt( j, k ); - index = in_nodes.unique_add( p ); - // junkp = in_nodes.get_node( index ); - // fprintf(junkfp, "%.4f %.4f\n", junkp.x(), junkp.y()); - // cout << " - " << index << endl; - } - // fprintf(junkfp, "%.4f %.4f\n", - // gpc_poly->contour[j].vertex[0].x, - // gpc_poly->contour[j].vertex[0].y); - // fclose(junkfp); - } - - for ( j = 0; j < gpc_poly.contours(); ++j ) { - gpc_poly.calc_point_inside( j, in_nodes ); - } - - polylist[i].push_back( gpc_poly ); - -#if 0 - // temporary ... write out hole/polygon info for debugging - for ( j = 0; j < (int)gpc_poly.contours(); ++j ) { - char pname[256]; - sprintf(pname, "poly%02d-%02d-%02d", i, debug_counter, j); - cout << "writing to " << pname << endl; - FILE *fp = fopen( pname, "w" ); - Point3D point; - for ( int k = 0; k < gpc_poly.contour_size( j ); ++k ) { - point = gpc_poly.get_pt( j, k ); - fprintf( fp, "%.6f %.6f\n", point.x(), point.y() ); - } - point = gpc_poly.get_pt( j, 0 ); - fprintf( fp, "%.6f %.6f\n", point.x(), point.y() ); - fclose(fp); - - char hname[256]; - sprintf(hname, "hole%02d-%02d-%02d", i, debug_counter, j); - FILE *fh = fopen( hname, "w" ); - point = gpc_poly.get_point_inside( j ); - fprintf( fh, "%.6f %.6f\n", point.x(), point.y() ); - fclose(fh); - } - - // cout << "type a letter + enter to continue: "; - // string input; - // cin >> input; -#endif - - ++debug_counter; - } - } - - // last, do the rest of the height nodes - f_current = fit_list.begin(); - f_last = fit_list.end(); - for ( ; f_current != f_last; ++f_current ) { - index = in_nodes.course_add( *f_current ); - } - - for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) { - if ( polylist[i].size() ) { - cout << get_area_name((AreaType)i) << " = " - << polylist[i].size() << endl; - } - } - - // traverse the polygon lists and build the segment (edge) list - // that is used by the "Triangle" lib. - - cout << "building segment list" << endl; - int i1, i2; - Point3D p1, p2; - point_list node_list = in_nodes.get_node_list(); - FGPolygon poly; - - for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) { - cout << "area type = " << i << endl; - poly_list_iterator tp_current, tp_last; - tp_current = polylist[i].begin(); - tp_last = polylist[i].end(); - - // process each polygon in list - for ( ; tp_current != tp_last; ++tp_current ) { - poly = *tp_current; - cout << " processing a polygon with contours = " - << poly.contours() << endl; - for ( int j = 0; j < (int)poly.contours(); ++j) { - for ( int k = 0; k < (int)(poly.contour_size(j) - 1); ++k ) { - p1 = poly.get_pt( j, k ); - p2 = poly.get_pt( j, k + 1 ); - i1 = in_nodes.find( p1 ); - i2 = in_nodes.find( p2 ); - // calc_line_params(i1, i2, &m, &b); - in_segs.unique_divide_and_add( node_list, FGTriSeg(i1, i2) ); - } - p1 = poly.get_pt( j, 0 ); - p2 = poly.get_pt( j, poly.contour_size(j) - 1 ); - i1 = in_nodes.find( p1 ); - i2 = in_nodes.find( p2 ); - // calc_line_params(i1, i2, &m, &b); - in_segs.unique_divide_and_add( node_list, FGTriSeg(i1, i2) ); - } - } - } - - return 0; -} - - -// populate this class based on the specified gpc_polys list -int FGTriangle::rebuild( FGConstruct& c ) { - in_nodes.clear(); - in_segs.clear(); - - in_nodes = c.get_tri_nodes(); - in_segs = c.get_tri_segs(); - - return 0; -} - - -static void write_out_data(struct triangulateio *out) { - FILE *node = fopen("tile.node", "w"); - fprintf(node, "%d 2 %d 0\n", - out->numberofpoints, out->numberofpointattributes); - for (int i = 0; i < out->numberofpoints; ++i) { - fprintf(node, "%d %.6f %.6f %.2f\n", - i, out->pointlist[2*i], out->pointlist[2*i + 1], 0.0); - } - fclose(node); - - FILE *ele = fopen("tile.ele", "w"); - fprintf(ele, "%d 3 0\n", out->numberoftriangles); - for (int i = 0; i < out->numberoftriangles; ++i) { - fprintf(ele, "%d ", i); - for (int j = 0; j < out->numberofcorners; ++j) { - fprintf(ele, "%d ", out->trianglelist[i * out->numberofcorners + j]); - } - for (int j = 0; j < out->numberoftriangleattributes; ++j) { - fprintf(ele, "%.6f ", - out->triangleattributelist[i - * out->numberoftriangleattributes - + j] - ); - } - fprintf(ele, "\n"); - } - fclose(ele); - - FILE *fp = fopen("tile.poly", "w"); - fprintf(fp, "0 2 1 0\n"); - fprintf(fp, "%d 0\n", out->numberofsegments); - for (int i = 0; i < out->numberofsegments; ++i) { - fprintf(fp, "%d %d %d\n", - i, out->segmentlist[2*i], out->segmentlist[2*i + 1]); - } - fprintf(fp, "%d\n", out->numberofholes); - for (int i = 0; i < out->numberofholes; ++i) { - fprintf(fp, "%d %.6f %.6f\n", - i, out->holelist[2*i], out->holelist[2*i + 1]); - } - fprintf(fp, "%d\n", out->numberofregions); - for (int i = 0; i < out->numberofregions; ++i) { - fprintf(fp, "%d %.6f %.6f %.6f\n", - i, out->regionlist[4*i], out->regionlist[4*i + 1], - out->regionlist[4*i + 2]); - } - fclose(fp); -} - - -// Front end triangulator for polygon list. Allocates and builds up -// all the needed structures for the triangulator, runs it, copies the -// results, and frees all the data structures used by the -// triangulator. "pass" can be 1 or 2. 1 = first pass which -// generates extra nodes for a better triangulation. 2 = second pass -// after split/reassem where we don't want any extra nodes generated. - -int FGTriangle::run_triangulate( const string& angle, const int pass ) { - FGPolygon poly; - Point3D p; - struct triangulateio in, out, vorout; - int counter; - - // point list - point_list node_list = in_nodes.get_node_list(); - in.numberofpoints = node_list.size(); - in.pointlist = (REAL *) malloc(in.numberofpoints * 2 * sizeof(REAL)); - - point_list_iterator tn_current, tn_last; - tn_current = node_list.begin(); - tn_last = node_list.end(); - counter = 0; - for ( ; tn_current != tn_last; ++tn_current ) { - in.pointlist[counter++] = tn_current->x(); - in.pointlist[counter++] = tn_current->y(); - } - - in.numberofpointattributes = 1; - in.pointattributelist = (REAL *) malloc(in.numberofpoints * - in.numberofpointattributes * - sizeof(REAL)); - for ( int i = 0; i < in.numberofpoints * in.numberofpointattributes; ++i) { - in.pointattributelist[i] = 0.0; - } - - in.pointmarkerlist = (int *) malloc(in.numberofpoints * sizeof(int)); - for ( int i = 0; i < in.numberofpoints; ++i) { - in.pointmarkerlist[i] = 0; - } - - // triangle list - in.numberoftriangles = 0; - - // segment list - triseg_list seg_list = in_segs.get_seg_list(); - in.numberofsegments = seg_list.size(); - in.segmentlist = (int *) malloc(in.numberofsegments * 2 * sizeof(int)); - in.segmentmarkerlist = (int *) NULL; - - triseg_list_iterator s_current, s_last; - s_current = seg_list.begin(); - s_last = seg_list.end(); - counter = 0; - for ( ; s_current != s_last; ++s_current ) { - in.segmentlist[counter++] = s_current->get_n1(); - in.segmentlist[counter++] = s_current->get_n2(); - } - - // hole list (make holes for airport ignore areas) - in.numberofholes = polylist[(int)AirportIgnoreArea].size(); - in.holelist = (REAL *) malloc(in.numberofholes * 2 * sizeof(REAL)); - - poly_list_iterator h_current, h_last; - h_current = polylist[(int)AirportIgnoreArea].begin(); - h_last = polylist[(int)AirportIgnoreArea].end(); - counter = 0; - for ( ; h_current != h_last; ++h_current ) { - poly = *h_current; - for ( int j = 0; j < poly.contours(); ++j ) { - p = poly.get_point_inside( j ); - in.holelist[counter++] = p.x(); - in.holelist[counter++] = p.y(); - } - } - - // region list - in.numberofregions = 0; - for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) { - poly_list_iterator h_current, h_last; - h_current = polylist[i].begin(); - h_last = polylist[i].end(); - for ( ; h_current != h_last; ++h_current ) { - poly = *h_current; - for ( int j = 0; j < poly.contours(); ++j ) { - if ( ! poly.get_hole_flag( j ) ) { - ++in.numberofregions; - } - } - } - } - - in.regionlist = (REAL *) malloc(in.numberofregions * 4 * sizeof(REAL)); - counter = 0; - for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) { - poly_list_iterator h_current, h_last; - h_current = polylist[(int)i].begin(); - h_last = polylist[(int)i].end(); - for ( ; h_current != h_last; ++h_current ) { - poly = *h_current; - for ( int j = 0; j < poly.contours(); ++j ) { - if ( ! poly.get_hole_flag( j ) ) { - p = poly.get_point_inside( j ); - cout << "Region point = " << p << endl; - in.regionlist[counter++] = p.x(); // x coord - in.regionlist[counter++] = p.y(); // y coord - in.regionlist[counter++] = i; // region attribute - in.regionlist[counter++] = -1.0; // area constraint - // (unused) - } - } - } - } - - // prep the output structures - out.pointlist = (REAL *) NULL; // Not needed if -N switch used. - // Not needed if -N switch used or number of point attributes is zero: - out.pointattributelist = (REAL *) NULL; - out.pointmarkerlist = (int *) NULL; // Not needed if -N or -B switch used. - out.trianglelist = (int *) NULL; // Not needed if -E switch used. - // Not needed if -E switch used or number of triangle attributes is zero: - out.triangleattributelist = (REAL *) NULL; - out.neighborlist = (int *) NULL; // Needed only if -n switch used. - // Needed only if segments are output (-p or -c) and -P not used: - out.segmentlist = (int *) NULL; - // Needed only if segments are output (-p or -c) and -P and -B not used: - out.segmentmarkerlist = (int *) NULL; - out.edgelist = (int *) NULL; // Needed only if -e switch used. - out.edgemarkerlist = (int *) NULL; // Needed if -e used and -B not used. - - vorout.pointlist = (REAL *) NULL; // Needed only if -v switch used. - // Needed only if -v switch used and number of attributes is not zero: - vorout.pointattributelist = (REAL *) NULL; - vorout.edgelist = (int *) NULL; // Needed only if -v switch used. - vorout.normlist = (REAL *) NULL; // Needed only if -v switch used. - - // TEMPORARY - write_out_data(&in); - - // Triangulate the points. Switches are chosen to read and write - // a PSLG (p), preserve the convex hull (c), number everything - // from zero (z), assign a regional attribute to each element (A), - // and produce an edge list (e), and a triangle neighbor list (n). - - string tri_options; - if ( pass == 1 ) { - // use a quality value of 10 (q10) meaning no interior - // triangle angles less than 10 degrees - // tri_options = "pczAen"; - if ( angle == "0" ) { - tri_options = "pczAen"; - } else { - tri_options = "pczq" + angle + "Aen"; - } - // // string tri_options = "pzAen"; - // // string tri_options = "pczq15S400Aen"; - } else if ( pass == 2 ) { - // no new points on boundary (Y), no internal segment - // splitting (YY), no quality refinement () - tri_options = "pczYYAen"; - } else { - cout << "unknown pass number = " << pass - << " in FGTriangle::run_triangulate()" << endl; - exit(-1); - } - cout << "Triangulation with options = " << tri_options << endl; - - triangulate(tri_options.c_str(), &in, &out, &vorout); - - // TEMPORARY - // write_out_data(&out); - - // now copy the results back into the corresponding FGTriangle - // structures - - // nodes - out_nodes.clear(); - for ( int i = 0; i < out.numberofpoints; ++i ) { - Point3D p( out.pointlist[2*i], out.pointlist[2*i + 1], 0.0 ); - // cout << "point = " << p << endl; - out_nodes.simple_add( p ); - } - - // segments - out_segs.clear(); - for ( int i = 0; i < out.numberofsegments; ++i ) { - out_segs.unique_add( FGTriSeg( out.segmentlist[2*i], - out.segmentlist[2*i+1] ) ); - } - - // triangles - elelist.clear(); - int n1, n2, n3; - double attribute; - for ( int i = 0; i < out.numberoftriangles; ++i ) { - n1 = out.trianglelist[i * 3]; - n2 = out.trianglelist[i * 3 + 1]; - n3 = out.trianglelist[i * 3 + 2]; - if ( out.numberoftriangleattributes > 0 ) { - attribute = out.triangleattributelist[i]; - } else { - attribute = 0.0; - } - // cout << "triangle = " << n1 << " " << n2 << " " << n3 << endl; - - elelist.push_back( FGTriEle( n1, n2, n3, attribute ) ); - } - - // free mem allocated to the "Triangle" structures - free(in.pointlist); - free(in.pointattributelist); - free(in.pointmarkerlist); - free(in.regionlist); - free(out.pointlist); - free(out.pointattributelist); - free(out.pointmarkerlist); - free(out.trianglelist); - free(out.triangleattributelist); - // free(out.trianglearealist); - free(out.neighborlist); - free(out.segmentlist); - free(out.segmentmarkerlist); - free(out.edgelist); - free(out.edgemarkerlist); - free(vorout.pointlist); - free(vorout.pointattributelist); - free(vorout.edgelist); - free(vorout.normlist); - - return 0; -} - - diff --git a/Tools/Construct/Triangulate/triangle.hxx b/Tools/Construct/Triangulate/triangle.hxx deleted file mode 100644 index 7c03175fa..000000000 --- a/Tools/Construct/Triangulate/triangle.hxx +++ /dev/null @@ -1,105 +0,0 @@ -// triangle.hxx -- "Triangle" interface class -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _TRIANGLE_HXX -#define _TRIANGLE_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include -#include -#include
-#include -#include - -#define REAL double -extern "C" { -#include -} - -#include "polygon.hxx" -#include "trieles.hxx" -#include "trinodes.hxx" -#include "trisegs.hxx" - - -class FGTriangle { - -private: - - // list of nodes - FGTriNodes in_nodes; - FGTriNodes out_nodes; - - // list of segments - FGTriSegments in_segs; - FGTriSegments out_segs; - - // polygon list - poly_list polylist[FG_MAX_AREA_TYPES]; - - // triangle list - triele_list elelist; - -public: - - // Constructor and destructor - FGTriangle( void ); - ~FGTriangle( void ); - - // add nodes from the dem fit - int add_nodes(); - - // populate this class based on the specified gpc_polys list - int build( const point_list& corner_list, - const point_list& fit_list, - const FGPolyList& gpc_polys ); - - // populate this class based on the specified gpc_polys list - int rebuild( FGConstruct& c ); - - // Front end triangulator for polygon list. Allocates and builds - // up all the needed structures for the triangulator, runs it, - // copies the results, and frees all the data structures used by - // the triangulator. "pass" can be 1 or 2. 1 = first pass which - // generates extra nodes for a better triangulation. 2 = second - // pass after split/reassem where we don't want any extra nodes - // generated. - int run_triangulate( const string& angle, const int pass ); - - inline FGTriNodes get_out_nodes() const { return out_nodes; } - inline size_t get_out_nodes_size() const { return out_nodes.size(); } - inline triele_list get_elelist() const { return elelist; } - inline FGTriSegments get_out_segs() const { return out_segs; } -}; - - -#endif // _TRIANGLE_HXX - - diff --git a/Tools/Construct/Triangulate/trieles.cxx b/Tools/Construct/Triangulate/trieles.cxx deleted file mode 100644 index f3b66d6d3..000000000 --- a/Tools/Construct/Triangulate/trieles.cxx +++ /dev/null @@ -1,26 +0,0 @@ -// trieles.cxx -- "Triangle" element management class -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include "trieles.hxx" - - diff --git a/Tools/Construct/Triangulate/trieles.hxx b/Tools/Construct/Triangulate/trieles.hxx deleted file mode 100644 index b98a30c55..000000000 --- a/Tools/Construct/Triangulate/trieles.hxx +++ /dev/null @@ -1,75 +0,0 @@ -// trieles.hxx -- "Triangle" element management class -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _TRIELES_HXX -#define _TRIELES_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include - -FG_USING_STD(vector); - - -// a segment is two integer pointers into the node list -class FGTriEle { - int n1, n2, n3; - - double attribute; - -public: - - // Constructor and destructor - inline FGTriEle( void ) { }; - inline FGTriEle( int i1, int i2, int i3, double a ) { - n1 = i1; n2 = i2; n3 = i3; attribute = a; - } - - inline ~FGTriEle( void ) { }; - - inline int get_n1() const { return n1; } - inline void set_n1( int i ) { n1 = i; } - inline int get_n2() const { return n2; } - inline void set_n2( int i ) { n2 = i; } - inline int get_n3() const { return n3; } - inline void set_n3( int i ) { n3 = i; } - - inline double get_attribute() const { return attribute; } - inline void set_attribute( double a ) { attribute = a; } -}; - - -typedef vector < FGTriEle > triele_list; -typedef triele_list::iterator triele_list_iterator; -typedef triele_list::const_iterator const_triele_list_iterator; - - -#endif // _TRIELES_HXX - - diff --git a/Tools/Construct/Triangulate/trinodes.cxx b/Tools/Construct/Triangulate/trinodes.cxx deleted file mode 100644 index 422584517..000000000 --- a/Tools/Construct/Triangulate/trinodes.cxx +++ /dev/null @@ -1,123 +0,0 @@ -// trinodes.cxx -- "Triangle" nodes management class -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include "trinodes.hxx" - - -// Constructor -FGTriNodes::FGTriNodes( void ) { -} - - -// Destructor -FGTriNodes::~FGTriNodes( void ) { -} - - -// Add a point to the point list if it doesn't already exist. Returns -// the index (starting at zero) of the point in the list. -int FGTriNodes::unique_add( const Point3D& p ) { - point_list_iterator current, last; - int counter = 0; - - // cout << p.x() << "," << p.y() << endl; - - // see if point already exists - current = node_list.begin(); - last = node_list.end(); - for ( ; current != last; ++current ) { - if ( close_enough(p, *current) ) { - // cout << "found an existing match!" << endl; - return counter; - } - - ++counter; - } - - // add to list - node_list.push_back( p ); - - return counter; -} - - -// Add the point with no uniqueness checking -int FGTriNodes::simple_add( const Point3D& p ) { - node_list.push_back( p ); - - return node_list.size() - 1; -} - - -// Add a point to the point list if it doesn't already exist. Returns -// the index (starting at zero) of the point in the list. Use a -// course proximity check -int FGTriNodes::course_add( const Point3D& p ) { - point_list_iterator current, last; - int counter = 0; - - // cout << p.x() << "," << p.y() << endl; - - // see if point already exists - current = node_list.begin(); - last = node_list.end(); - for ( ; current != last; ++current ) { - if ( course_close_enough(p, *current) ) { - // cout << "found an existing match!" << endl; - return counter; - } - - ++counter; - } - - // add to list - node_list.push_back( p ); - - return counter; -} - - -// Find the index of the specified point (compair to the same -// tolerance as unique_add(). Returns -1 if not found. -int FGTriNodes::find( const Point3D& p ) const { - const_point_list_iterator current, last; - int counter = 0; - - // cout << p.x() << "," << p.y() << endl; - - // see if point already exists - current = node_list.begin(); - last = node_list.end(); - for ( ; current != last; ++current ) { - if ( close_enough(p, *current) ) { - // cout << "found an existing match!" << endl; - return counter; - } - - ++counter; - } - - return -1; -} - - diff --git a/Tools/Construct/Triangulate/trinodes.hxx b/Tools/Construct/Triangulate/trinodes.hxx deleted file mode 100644 index 23187892e..000000000 --- a/Tools/Construct/Triangulate/trinodes.hxx +++ /dev/null @@ -1,124 +0,0 @@ -// trinodes.hxx -- "Triangle" nodes management class -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _TRINODES_HXX -#define _TRINODES_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include - -#include
- - -#define FG_PROXIMITY_EPSILON 0.000001 -#define FG_COURSE_EPSILON 0.0003 - - -class FGTriNodes { - -private: - - point_list node_list; - - // return true of the two points are "close enough" as defined by - // FG_PROXIMITY_EPSILON - bool close_enough( const Point3D& p, const Point3D& p ) const; - - // return true of the two points are "close enough" as defined by - // FG_COURSE_EPSILON - bool course_close_enough( const Point3D& p1, const Point3D& p2 ); - -public: - - // Constructor and destructor - FGTriNodes( void ); - ~FGTriNodes( void ); - - // delete all the data out of node_list - inline void clear() { node_list.clear(); } - - // Add a point to the point list if it doesn't already exist. - // Returns the index (starting at zero) of the point in the list. - int unique_add( const Point3D& p ); - - // Add the point with no uniqueness checking - int simple_add( const Point3D& p ); - - // Add a point to the point list if it doesn't already exist. - // Returns the index (starting at zero) of the point in the list. - // Use a course proximity check - int course_add( const Point3D& p ); - - // Find the index of the specified point (compair to the same - // tolerance as unique_add(). Returns -1 if not found. - int find( const Point3D& p ) const; - - // return the master node list - inline point_list get_node_list() const { return node_list; } - - // return the ith point - inline Point3D get_node( int i ) const { return node_list[i]; } - - // return the size of the node list - inline size_t size() const { return node_list.size(); } -}; - - -// return true of the two points are "close enough" as defined by -// FG_PROXIMITY_EPSILON -inline bool FGTriNodes::close_enough( const Point3D& p1, const Point3D& p2 ) - const -{ - if ( ( fabs(p1.x() - p2.x()) < FG_PROXIMITY_EPSILON ) && - ( fabs(p1.y() - p2.y()) < FG_PROXIMITY_EPSILON ) ) { - return true; - } else { - return false; - } -} - - -// return true of the two points are "close enough" as defined by -// FG_COURSE_EPSILON -inline bool FGTriNodes::course_close_enough( const Point3D& p1, - const Point3D& p2 ) -{ - if ( ( fabs(p1.x() - p2.x()) < FG_COURSE_EPSILON ) && - ( fabs(p1.y() - p2.y()) < FG_COURSE_EPSILON ) ) { - return true; - } else { - return false; - } -} - - -#endif // _TRINODES_HXX - - diff --git a/Tools/Construct/Triangulate/trisegs.cxx b/Tools/Construct/Triangulate/trisegs.cxx deleted file mode 100644 index b9f34ac32..000000000 --- a/Tools/Construct/Triangulate/trisegs.cxx +++ /dev/null @@ -1,207 +0,0 @@ -// trisegs.cxx -- "Triangle" segment management class -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include -#include - -#include "trinodes.hxx" -#include "trisegs.hxx" - - -// Constructor -FGTriSegments::FGTriSegments( void ) { -} - - -// Destructor -FGTriSegments::~FGTriSegments( void ) { -} - - -// Add a segment to the segment list if it doesn't already exist. -// Returns the index (starting at zero) of the segment in the list. -int FGTriSegments::unique_add( const FGTriSeg& s ) -{ - triseg_list_iterator current, last; - int counter = 0; - - // cout << s.get_n1() << "," << s.get_n2() << endl; - - // check if segment has duplicated endpoints - if ( s.get_n1() == s.get_n2() ) { - cout << "WARNING: ignoring null segment with the same " - << "point for both endpoints" << endl; - return -1; - } - - // check if segment already exists - current = seg_list.begin(); - last = seg_list.end(); - for ( ; current != last; ++current ) { - if ( s == *current ) { - // cout << "found an existing segment match" << endl; - return counter; - } - - ++counter; - } - - // add to list - seg_list.push_back( s ); - - return counter; -} - - -// Divide segment if there are other points on it, return the divided -// list of segments -void FGTriSegments::unique_divide_and_add( const point_list& nodes, - const FGTriSeg& s ) -{ - Point3D p0 = nodes[ s.get_n1() ]; - Point3D p1 = nodes[ s.get_n2() ]; - - bool found_extra = false; - int extra_index = 0; - int counter; - double m, m1, b, b1, y_err, x_err, y_err_min, x_err_min; - const_point_list_iterator current, last; - - // bool temp = false; - // if ( s == FGTriSeg( 170, 206 ) ) { - // cout << "this is it!" << endl; - // temp = true; - // } - - double xdist = fabs(p0.x() - p1.x()); - double ydist = fabs(p0.y() - p1.y()); - x_err_min = xdist + 1.0; - y_err_min = ydist + 1.0; - - if ( xdist > ydist ) { - // use y = mx + b - - // sort these in a sensible order - if ( p0.x() > p1.x() ) { - Point3D tmp = p0; - p0 = p1; - p1 = tmp; - } - - m = (p0.y() - p1.y()) / (p0.x() - p1.x()); - b = p1.y() - m * p1.x(); - - // if ( temp ) { - // cout << "m = " << m << " b = " << b << endl; - // } - - current = nodes.begin(); - last = nodes.end(); - counter = 0; - for ( ; current != last; ++current ) { - if ( (current->x() > (p0.x() + FG_EPSILON)) - && (current->x() < (p1.x() - FG_EPSILON)) ) { - - // if ( temp ) { - // cout << counter << endl; - // } - - y_err = fabs(current->y() - (m * current->x() + b)); - - if ( y_err < FG_PROXIMITY_EPSILON ) { - cout << "FOUND EXTRA SEGMENT NODE (Y)" << endl; - cout << p0 << " < " << *current << " < " - << p1 << endl; - found_extra = true; - if ( y_err < y_err_min ) { - extra_index = counter; - y_err_min = y_err; - } - } - } - ++counter; - } - } else { - // use x = m1 * y + b1 - - // sort these in a sensible order - if ( p0.y() > p1.y() ) { - Point3D tmp = p0; - p0 = p1; - p1 = tmp; - } - - m1 = (p0.x() - p1.x()) / (p0.y() - p1.y()); - b1 = p1.x() - m1 * p1.y(); - - // bool temp = true; - // if ( temp ) { - // cout << "xdist = " << xdist << " ydist = " << ydist << endl; - // cout << " p0 = " << p0 << " p1 = " << p1 << endl; - // cout << " m1 = " << m1 << " b1 = " << b1 << endl; - // } - - // cout << " should = 0 = " << fabs(p0.x() - (m1 * p0.y() + b1)) << endl;; - // cout << " should = 0 = " << fabs(p1.x() - (m1 * p1.y() + b1)) << endl;; - - current = nodes.begin(); - last = nodes.end(); - counter = 0; - for ( ; current != last; ++current ) { - if ( (current->y() > (p0.y() + FG_EPSILON)) - && (current->y() < (p1.y() - FG_EPSILON)) ) { - - x_err = fabs(current->x() - (m1 * current->y() + b1)); - - // if ( temp ) { - // cout << " (" << counter << ") x_err = " << x_err << endl; - // } - - if ( x_err < FG_PROXIMITY_EPSILON ) { - cout << "FOUND EXTRA SEGMENT NODE (X)" << endl; - cout << p0 << " < " << *current << " < " - << p1 << endl; - found_extra = true; - if ( x_err < x_err_min ) { - extra_index = counter; - x_err_min = x_err; - } - } - } - ++counter; - } - } - - if ( found_extra ) { - // recurse with two sub segments - cout << "dividing " << s.get_n1() << " " << extra_index - << " " << s.get_n2() << endl; - unique_divide_and_add( nodes, FGTriSeg( s.get_n1(), extra_index ) ); - unique_divide_and_add( nodes, FGTriSeg( extra_index, s.get_n2() ) ); - } else { - // this segment does not need to be divided, lets add it - unique_add( s ); - } -} - - diff --git a/Tools/Construct/Triangulate/trisegs.hxx b/Tools/Construct/Triangulate/trisegs.hxx deleted file mode 100644 index dc3d38317..000000000 --- a/Tools/Construct/Triangulate/trisegs.hxx +++ /dev/null @@ -1,118 +0,0 @@ -// trisegs.hxx -- "Triangle" segment management class -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _TRISEGS_HXX -#define _TRISEGS_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include - -#include "trinodes.hxx" - -FG_USING_STD(vector); - - -// a segment is two integer pointers into the node list -class FGTriSeg { - int n1, n2; - -public: - - // Constructor and destructor - inline FGTriSeg( void ) { }; - inline FGTriSeg( int i1, int i2 ) { - n1 = i1; - n2 = i2; - } - - inline ~FGTriSeg( void ) { }; - - inline int get_n1() const { return n1; } - inline void set_n1( int i ) { n1 = i; } - inline int get_n2() const { return n2; } - inline void set_n2( int i ) { n2 = i; } - - friend bool operator == (const FGTriSeg& a, const FGTriSeg& b); - -}; - -inline bool operator == (const FGTriSeg& a, const FGTriSeg& b) -{ - return ((a.n1 == b.n1) && (a.n2 == b.n2)) - || ((a.n1 == b.n2) && (a.n2 == b.n1)); -} - - -typedef vector < FGTriSeg > triseg_list; -typedef triseg_list::iterator triseg_list_iterator; -typedef triseg_list::const_iterator const_triseg_list_iterator; - - -class FGTriSegments { - -private: - - triseg_list seg_list; - - // Divide segment if there are other points on it, return the - // divided list of segments - triseg_list divide_segment( const point_list& nodes, - const FGTriSeg& s ); - -public: - - // Constructor and destructor - FGTriSegments( void ); - ~FGTriSegments( void ); - - // delete all the data out of seg_list - inline void clear() { seg_list.clear(); } - - // Add a segment to the segment list if it doesn't already exist. - // Returns the index (starting at zero) of the segment in the - // list. - int unique_add( const FGTriSeg& s ); - - // Add a segment to the segment list if it doesn't already exist. - // Returns the index (starting at zero) of the segment in the list. - void unique_divide_and_add( const point_list& node_list, - const FGTriSeg& s ); - - // return the master segment list - inline triseg_list get_seg_list() const { return seg_list; } - - // return the ith segment - inline FGTriSeg get_seg( int i ) const { return seg_list[i]; } -}; - - -#endif // _TRISEGS_HXX - - diff --git a/Tools/Lib/DEM/Makefile.am b/Tools/Lib/DEM/Makefile.am deleted file mode 100644 index 91bfd90d6..000000000 --- a/Tools/Lib/DEM/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -noinst_LIBRARIES = libDEM.a - -libDEM_a_SOURCES = dem.cxx dem.hxx - -INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib - -# We can't build this with "-O2" (optimization) since this causes a seg fault -# I haven't found a way to strip this out of the CXXFLAGS, so I'm just -# setting it to "-g" -# CXXFLAGS = -g - diff --git a/Tools/Lib/DEM/dem.cxx b/Tools/Lib/DEM/dem.cxx deleted file mode 100644 index ddd03fd0c..000000000 --- a/Tools/Lib/DEM/dem.cxx +++ /dev/null @@ -1,874 +0,0 @@ -// dem.cxx -- DEM management class -// -// Written by Curtis Olson, started March 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -#include // isspace() -#include // atoi() -#include // rint() -#include -#include - -#ifdef HAVE_SYS_STAT_H -# include // stat() -#endif - -#ifdef FG_HAVE_STD_INCLUDES -# include -#else -# include -#endif - -#ifdef HAVE_UNISTD_H -# include // stat() -#endif - -#include -#include -#include - -#include "dem.hxx" - - -#define MAX_EX_NODES 10000 - -#if 0 -#ifdef WIN32 -# ifdef __BORLANDC__ -# include -# define MKDIR(a) mkdir(a) -# else -# define MKDIR(a) mkdir(a,S_IRWXU) // I am just guessing at this flag (NHV) -# endif // __BORLANDC__ -#endif // WIN32 -#endif //0 - - -FGDem::FGDem( void ) { - // cout << "class FGDem CONstructor called." << endl; - dem_data = new float[DEM_SIZE_1][DEM_SIZE_1]; - output_data = new float[DEM_SIZE_1][DEM_SIZE_1]; -} - - -FGDem::FGDem( const string &file ) { - // cout << "class FGDem CONstructor called." << endl; - dem_data = new float[DEM_SIZE_1][DEM_SIZE_1]; - output_data = new float[DEM_SIZE_1][DEM_SIZE_1]; - - FGDem::open(file); -} - - -// open a DEM file -int -FGDem::open ( const string& file ) { - // open input file (or read from stdin) - if ( file == "-" ) { - printf("Loading DEM data file: stdin\n"); - // fd = stdin; - // fd = gzdopen(STDIN_FILENO, "r"); - printf("Not yet ported ...\n"); - return 0; - } else { - in = new fg_gzifstream( file ); - if ( !(*in) ) { - cout << "Cannot open " << file << endl; - return 0; - } - cout << "Loading DEM data file: " << file << endl; - } - - return 1; -} - - -// close a DEM file -int -FGDem::close () { - // the fg_gzifstream doesn't seem to have a close() - - delete in; - - return 1; -} - - -// return next token from input stream -string -FGDem::next_token() { - string token; - - *in >> token; - - // cout << " returning " + token + "\n"; - - return token; -} - - -// return next integer from input stream -int -FGDem::next_int() { - int result; - - *in >> result; - - return result; -} - - -// return next double from input stream -double -FGDem::next_double() { - double result; - - *in >> result; - - return result; -} - - -// return next exponential num from input stream -double -FGDem::next_exp() { - string token; - - token = next_token(); - - const char* p = token.c_str(); - char buf[64]; - char* bp = buf; - - for ( ; *p != 0; ++p ) - { - if ( *p == 'D' ) - *bp++ = 'E'; - else - *bp++ = *p; - } - *bp = 0; - return ::atof( buf ); -} - - -// read and parse DEM "A" record -int -FGDem::read_a_record() { - int i, inum; - double dnum; - string name, token; - char c; - - // get the name field (144 characters) - for ( i = 0; i < 144; i++ ) { - in->get(c); - name += c; - } - - // clean off the trailing whitespace - name = trim(name); - cout << " Quad name field: " << name << endl; - - // DEM level code, 3 reflects processing by DMA - inum = next_int(); - cout << " DEM level code = " << inum << "\n"; - - if ( inum > 3 ) { - return 0; - } - - // Pattern code, 1 indicates a regular elevation pattern - inum = next_int(); - cout << " Pattern code = " << inum << "\n"; - - // Planimetric reference system code, 0 indicates geographic - // coordinate system. - inum = next_int(); - cout << " Planimetric reference code = " << inum << "\n"; - - // Zone code - inum = next_int(); - cout << " Zone code = " << inum << "\n"; - - // Map projection parameters (ignored) - for ( i = 0; i < 15; i++ ) { - dnum = next_exp(); - // printf("%d: %f\n",i,dnum); - } - - // Units code, 3 represents arc-seconds as the unit of measure for - // ground planimetric coordinates throughout the file. - inum = next_int(); - if ( inum != 3 ) { - cout << " Unknown (X,Y) units code = " << inum << "!\n"; - exit(-1); - } - - // Units code; 2 represents meters as the unit of measure for - // elevation coordinates throughout the file. - inum = next_int(); - if ( inum != 2 ) { - cout << " Unknown (Z) units code = " << inum << "!\n"; - exit(-1); - } - - // Number (n) of sides in the polygon which defines the coverage of - // the DEM file (usually equal to 4). - inum = next_int(); - if ( inum != 4 ) { - cout << " Unknown polygon dimension = " << inum << "!\n"; - exit(-1); - } - - // Ground coordinates of bounding box in arc-seconds - dem_x1 = originx = next_exp(); - dem_y1 = originy = next_exp(); - cout << " Origin = (" << originx << "," << originy << ")\n"; - - dem_x2 = next_exp(); - dem_y2 = next_exp(); - - dem_x3 = next_exp(); - dem_y3 = next_exp(); - - dem_x4 = next_exp(); - dem_y4 = next_exp(); - - // Minimum/maximum elevations in meters - dem_z1 = next_exp(); - dem_z2 = next_exp(); - cout << " Elevation range " << dem_z1 << " to " << dem_z2 << "\n"; - - // Counterclockwise angle from the primary axis of ground - // planimetric referenced to the primary axis of the DEM local - // reference system. - token = next_token(); - - // Accuracy code; 0 indicates that a record of accuracy does not - // exist and that no record type C will follow. - - // DEM spacial resolution. Usually (3,3,1) (3,6,1) or (3,9,1) - // depending on latitude - - // I will eventually have to do something with this for data at - // higher latitudes */ - token = next_token(); - cout << " accuracy & spacial resolution string = " << token << endl; - i = token.length(); - cout << " length = " << i << "\n"; - - inum = atoi( token.substr( 0, i - 36 ) ); - row_step = atof( token.substr( i - 24, 12 ) ); - col_step = atof( token.substr( i - 36, 12 ) ); - cout << " Accuracy code = " << inum << "\n"; - cout << " column step = " << col_step << - " row step = " << row_step << "\n"; - - // dimension of arrays to follow (1) - token = next_token(); - - // number of profiles - dem_num_profiles = cols = next_int(); - cout << " Expecting " << dem_num_profiles << " profiles\n"; - - return 1; -} - - -// read and parse DEM "B" record -void -FGDem::read_b_record( ) { - string token; - int i; - int last; - - // row / column id of this profile - prof_row = next_int(); - prof_col = next_int(); - // printf("col id = %d row id = %d\n", prof_col, prof_row); - - // Number of columns and rows (elevations) in this profile - prof_num_rows = rows = next_int(); - prof_num_cols = next_int(); - // printf(" profile num rows = %d\n", prof_num_rows); - - // Ground planimetric coordinates (arc-seconds) of the first - // elevation in the profile - prof_x1 = next_exp(); - prof_y1 = next_exp(); - // printf(" Starting at %.2f %.2f\n", prof_x1, prof_y1); - - // Elevation of local datum for the profile. Always zero for - // 1-degree DEM, the reference is mean sea level. - token = next_token(); - - // Minimum and maximum elevations for the profile. - token = next_token(); - token = next_token(); - - // One (usually) dimensional array (prof_num_cols,1) of elevations - last = 0; - for ( i = 0; i < prof_num_rows; i++ ) { - prof_data = next_int(); - - // a bit of sanity checking that is unfortunately necessary - if ( prof_data > 10000 ) { // meters - prof_data = last; - } - - dem_data[cur_col][i] = (float)prof_data; - last = prof_data; - } -} - - -// parse dem file -int -FGDem::parse( ) { - int i; - - cur_col = 0; - - if ( !read_a_record() ) { - return(0); - } - - for ( i = 0; i < dem_num_profiles; i++ ) { - // printf("Ready to read next b record\n"); - read_b_record(); - cur_col++; - - if ( cur_col % 100 == 0 ) { - cout << " loaded " << cur_col << " profiles of data\n"; - } - } - - cout << " Done parsing\n"; - - return 1; -} - - -// write out the area of data covered by the specified bucket. Data -// is written out column by column starting at the lower left hand -// corner. -int -FGDem::write_area( const string& root, FGBucket& b, bool compress ) { - // calculate some boundaries - double min_x = ( b.get_center_lon() - 0.5 * b.get_width() ) * 3600.0; - double max_x = ( b.get_center_lon() + 0.5 * b.get_width() ) * 3600.0; - - double min_y = ( b.get_center_lat() - 0.5 * b.get_height() ) * 3600.0; - double max_y = ( b.get_center_lat() + 0.5 * b.get_height() ) * 3600.0; - - cout << b << endl; - cout << "width = " << b.get_width() << " height = " << b.get_height() - << endl; - - int start_x = (int)((min_x - originx) / col_step); - int span_x = (int)(b.get_width() * 3600.0 / col_step); - - int start_y = (int)((min_y - originy) / row_step); - int span_y = (int)(b.get_height() * 3600.0 / row_step); - - cout << "start_x = " << start_x << " span_x = " << span_x << endl; - cout << "start_y = " << start_y << " span_y = " << span_y << endl; - - // Do a simple sanity checking. But, please, please be nice to - // this write_area() routine and feed it buckets that coincide - // well with the underlying grid structure and spacing. - - if ( ( min_x < originx ) - || ( max_x > originx + cols * col_step ) - || ( min_y < originy ) - || ( max_y > originy + rows * row_step ) ) { - cout << " ERROR: bucket at least partially outside DEM data range!" << - endl; - return 0; - } - - // generate output file name - string base = b.gen_base_path(); - string path = root + "/Scenery/" + base; - string command = "mkdir -p " + path; - system( command.c_str() ); - - string demfile = path + "/" + b.gen_index_str() + ".dem"; - cout << "demfile = " << demfile << endl; - - // write the file - FILE *fp; - if ( (fp = fopen(demfile.c_str(), "w")) == NULL ) { - cout << "cannot open " << demfile << " for writing!" << endl; - exit(-1); - } - - fprintf( fp, "%d %d\n", (int)min_x, (int)min_y ); - fprintf( fp, "%d %d %d %d\n", span_x + 1, (int)col_step, - span_y + 1, (int)row_step ); - for ( int i = start_x; i <= start_x + span_x; ++i ) { - for ( int j = start_y; j <= start_y + span_y; ++j ) { - fprintf( fp, "%d ", (int)dem_data[i][j] ); - } - fprintf( fp, "\n" ); - } - fclose(fp); - - if ( compress ) { - string command = "gzip --best -f " + demfile; - system( command.c_str() ); - } - - return 1; -} - - -#if 0 - -// return the current altitude based on grid data. We should rewrite -// this to interpolate exact values, but for now this is good enough -double FGDem::interpolate_altitude( double lon, double lat ) { - // we expect incoming (lon,lat) to be in arcsec for now - - double xlocal, ylocal, dx, dy, zA, zB, elev; - int x1, x2, x3, y1, y2, y3; - float z1, z2, z3; - int xindex, yindex; - - /* determine if we are in the lower triangle or the upper triangle - ______ - | /| - | / | - | / | - |/ | - ------ - - then calculate our end points - */ - - xlocal = (lon - originx) / col_step; - ylocal = (lat - originy) / row_step; - - xindex = (int)(xlocal); - yindex = (int)(ylocal); - - // printf("xindex = %d yindex = %d\n", xindex, yindex); - - if ( xindex + 1 == cols ) { - xindex--; - } - - if ( yindex + 1 == rows ) { - yindex--; - } - - if ( (xindex < 0) || (xindex + 1 >= cols) || - (yindex < 0) || (yindex + 1 >= rows) ) { - return(-9999); - } - - dx = xlocal - xindex; - dy = ylocal - yindex; - - if ( dx > dy ) { - // lower triangle - // printf(" Lower triangle\n"); - - x1 = xindex; - y1 = yindex; - z1 = dem_data[x1][y1]; - - x2 = xindex + 1; - y2 = yindex; - z2 = dem_data[x2][y2]; - - x3 = xindex + 1; - y3 = yindex + 1; - z3 = dem_data[x3][y3]; - - // printf(" dx = %.2f dy = %.2f\n", dx, dy); - // printf(" (x1,y1,z1) = (%d,%d,%d)\n", x1, y1, z1); - // printf(" (x2,y2,z2) = (%d,%d,%d)\n", x2, y2, z2); - // printf(" (x3,y3,z3) = (%d,%d,%d)\n", x3, y3, z3); - - zA = dx * (z2 - z1) + z1; - zB = dx * (z3 - z1) + z1; - - // printf(" zA = %.2f zB = %.2f\n", zA, zB); - - if ( dx > FG_EPSILON ) { - elev = dy * (zB - zA) / dx + zA; - } else { - elev = zA; - } - } else { - // upper triangle - // printf(" Upper triangle\n"); - - x1 = xindex; - y1 = yindex; - z1 = dem_data[x1][y1]; - - x2 = xindex; - y2 = yindex + 1; - z2 = dem_data[x2][y2]; - - x3 = xindex + 1; - y3 = yindex + 1; - z3 = dem_data[x3][y3]; - - // printf(" dx = %.2f dy = %.2f\n", dx, dy); - // printf(" (x1,y1,z1) = (%d,%d,%d)\n", x1, y1, z1); - // printf(" (x2,y2,z2) = (%d,%d,%d)\n", x2, y2, z2); - // printf(" (x3,y3,z3) = (%d,%d,%d)\n", x3, y3, z3); - - zA = dy * (z2 - z1) + z1; - zB = dy * (z3 - z1) + z1; - - // printf(" zA = %.2f zB = %.2f\n", zA, zB ); - // printf(" xB - xA = %.2f\n", col_step * dy / row_step); - - if ( dy > FG_EPSILON ) { - elev = dx * (zB - zA) / dy + zA; - } else { - elev = zA; - } - } - - return(elev); -} - - -// Use least squares to fit a simpler data set to dem data -void FGDem::fit( double error, FGBucket& p ) { - double x[DEM_SIZE_1], y[DEM_SIZE_1]; - double m, b, ave_error, max_error; - double cury, lasty; - int n, row, start, end; - int colmin, colmax, rowmin, rowmax; - bool good_fit; - // FILE *dem, *fit, *fit1; - - printf("Initializing output mesh structure\n"); - outputmesh_init(); - - // determine dimensions - colmin = p.get_x() * ( (cols - 1) / 8); - colmax = colmin + ( (cols - 1) / 8); - rowmin = p.get_y() * ( (rows - 1) / 8); - rowmax = rowmin + ( (rows - 1) / 8); - printf("Fitting region = %d,%d to %d,%d\n", colmin, rowmin, colmax, rowmax); - - // include the corners explicitly - outputmesh_set_pt(colmin, rowmin, dem_data[colmin][rowmin]); - outputmesh_set_pt(colmin, rowmax, dem_data[colmin][rowmax]); - outputmesh_set_pt(colmax, rowmax, dem_data[colmax][rowmax]); - outputmesh_set_pt(colmax, rowmin, dem_data[colmax][rowmin]); - - printf("Beginning best fit procedure\n"); - - for ( row = rowmin; row <= rowmax; row++ ) { - // fit = fopen("fit.dat", "w"); - // fit1 = fopen("fit1.dat", "w"); - - start = colmin; - - // printf(" fitting row = %d\n", row); - - while ( start < colmax ) { - end = start + 1; - good_fit = true; - - x[(end - start) - 1] = 0.0 + ( start * col_step ); - y[(end - start) - 1] = dem_data[start][row]; - - while ( (end <= colmax) && good_fit ) { - n = (end - start) + 1; - // printf("Least square of first %d points\n", n); - x[end - start] = 0.0 + ( end * col_step ); - y[end - start] = dem_data[end][row]; - least_squares(x, y, n, &m, &b); - ave_error = least_squares_error(x, y, n, m, b); - max_error = least_squares_max_error(x, y, n, m, b); - - /* - printf("%d - %d ave error = %.2f max error = %.2f y = %.2f*x + %.2f\n", - start, end, ave_error, max_error, m, b); - - f = fopen("gnuplot.dat", "w"); - for ( j = 0; j <= end; j++) { - fprintf(f, "%.2f %.2f\n", 0.0 + ( j * col_step ), - dem_data[row][j]); - } - for ( j = start; j <= end; j++) { - fprintf(f, "%.2f %.2f\n", 0.0 + ( j * col_step ), - dem_data[row][j]); - } - fclose(f); - - printf("Please hit return: "); gets(junk); - */ - - if ( max_error > error ) { - good_fit = false; - } - - end++; - } - - if ( !good_fit ) { - // error exceeded the threshold, back up - end -= 2; // back "end" up to the last good enough fit - n--; // back "n" up appropriately too - } else { - // we popped out of the above loop while still within - // the error threshold, so we must be at the end of - // the data set - end--; - } - - least_squares(x, y, n, &m, &b); - ave_error = least_squares_error(x, y, n, m, b); - max_error = least_squares_max_error(x, y, n, m, b); - - /* - printf("\n"); - printf("%d - %d ave error = %.2f max error = %.2f y = %.2f*x + %.2f\n", - start, end, ave_error, max_error, m, b); - printf("\n"); - - fprintf(fit1, "%.2f %.2f\n", x[0], m * x[0] + b); - fprintf(fit1, "%.2f %.2f\n", x[end-start], m * x[end-start] + b); - */ - - if ( start > colmin ) { - // skip this for the first line segment - cury = m * x[0] + b; - outputmesh_set_pt(start, row, (lasty + cury) / 2); - // fprintf(fit, "%.2f %.2f\n", x[0], (lasty + cury) / 2); - } - - lasty = m * x[end-start] + b; - start = end; - } - - /* - fclose(fit); - fclose(fit1); - - dem = fopen("gnuplot.dat", "w"); - for ( j = 0; j < DEM_SIZE_1; j++) { - fprintf(dem, "%.2f %.2f\n", 0.0 + ( j * col_step ), - dem_data[j][row]); - } - fclose(dem); - */ - - // NOTICE, this is for testing only. This instance of - // output_nodes should be removed. It should be called only - // once at the end once all the nodes have been generated. - // newmesh_output_nodes(&nm, "mesh.node"); - // printf("Please hit return: "); gets(junk); - } - - // outputmesh_output_nodes(fg_root, p); -} - - -// Initialize output mesh structure -void FGDem::outputmesh_init( void ) { - int i, j; - - for ( j = 0; j < DEM_SIZE_1; j++ ) { - for ( i = 0; i < DEM_SIZE_1; i++ ) { - output_data[i][j] = -9999.0; - } - } -} - - -// Get the value of a mesh node -double FGDem::outputmesh_get_pt( int i, int j ) { - return ( output_data[i][j] ); -} - - -// Set the value of a mesh node -void FGDem::outputmesh_set_pt( int i, int j, double value ) { - // printf("Setting data[%d][%d] = %.2f\n", i, j, value); - output_data[i][j] = value; -} - - -// Write out a node file that can be used by the "triangle" program. -// Check for an optional "index.node.ex" file in case there is a .poly -// file to go along with this node file. Include these nodes first -// since they are referenced by position from the .poly file. -void FGDem::outputmesh_output_nodes( const string& fg_root, FGBucket& p ) -{ - double exnodes[MAX_EX_NODES][3]; - struct stat stat_buf; - string dir; - char file[256], exfile[256]; -#ifdef WIN32 - char tmp_path[256]; -#endif - string command; - FILE *fd; - long int index; - int colmin, colmax, rowmin, rowmax; - int i, j, count, excount, result; - - // determine dimensions - colmin = p.get_x() * ( (cols - 1) / 8); - colmax = colmin + ( (cols - 1) / 8); - rowmin = p.get_y() * ( (rows - 1) / 8); - rowmax = rowmin + ( (rows - 1) / 8); - cout << " dumping region = " << colmin << "," << rowmin << " to " << - colmax << "," << rowmax << "\n"; - - // generate the base directory - string base_path = p.gen_base_path(); - cout << "fg_root = " << fg_root << " Base Path = " << base_path << endl; - dir = fg_root + "/Scenery/" + base_path; - cout << "Dir = " << dir << endl; - - // stat() directory and create if needed - errno = 0; - result = stat(dir.c_str(), &stat_buf); - if ( result != 0 && errno == ENOENT ) { - cout << "Creating directory\n"; - -// #ifndef WIN32 - - command = "mkdir -p " + dir + "\n"; - system( command.c_str() ); - -#if 0 -// #else // WIN32 - - // Cygwin crashes when trying to output to node file - // explicitly making directory structure seems OK on Win95 - - extract_path (base_path, tmp_path); - - dir = fg_root + "/Scenery"; - if (my_mkdir ( dir.c_str() )) { exit (-1); } - - dir = fg_root + "/Scenery/" + tmp_path; - if (my_mkdir ( dir.c_str() )) { exit (-1); } - - dir = fg_root + "/Scenery/" + base_path; - if (my_mkdir ( dir.c_str() )) { exit (-1); } - -// #endif // WIN32 -#endif //0 - - } else { - // assume directory exists - } - - // get index and generate output file name - index = p.gen_index(); - sprintf(file, "%s/%ld.node", dir.c_str(), index); - - // get (optional) extra node file name (in case there is matching - // .poly file. - strcpy(exfile, file); - strcat(exfile, ".ex"); - - // load extra nodes if they exist - excount = 0; - if ( (fd = fopen(exfile, "r")) != NULL ) { - int junki; - fscanf(fd, "%d %d %d %d", &excount, &junki, &junki, &junki); - - if ( excount > MAX_EX_NODES - 1 ) { - printf("Error, too many 'extra' nodes, increase array size\n"); - exit(-1); - } else { - printf(" Expecting %d 'extra' nodes\n", excount); - } - - for ( i = 1; i <= excount; i++ ) { - fscanf(fd, "%d %lf %lf %lf\n", &junki, - &exnodes[i][0], &exnodes[i][1], &exnodes[i][2]); - printf("(extra) %d %.2f %.2f %.2f\n", - i, exnodes[i][0], exnodes[i][1], exnodes[i][2]); - } - fclose(fd); - } - - printf("Creating node file: %s\n", file); - fd = fopen(file, "w"); - - // first count regular nodes to generate header - count = 0; - for ( j = rowmin; j <= rowmax; j++ ) { - for ( i = colmin; i <= colmax; i++ ) { - if ( output_data[i][j] > -9000.0 ) { - count++; - } - } - // printf(" count = %d\n", count); - } - fprintf(fd, "%d 2 1 0\n", count + excount); - - // now write out extra node data - for ( i = 1; i <= excount; i++ ) { - fprintf(fd, "%d %.2f %.2f %.2f\n", - i, exnodes[i][0], exnodes[i][1], exnodes[i][2]); - } - - // write out actual node data - count = excount + 1; - for ( j = rowmin; j <= rowmax; j++ ) { - for ( i = colmin; i <= colmax; i++ ) { - if ( output_data[i][j] > -9000.0 ) { - fprintf(fd, "%d %.2f %.2f %.2f\n", - count++, - originx + (double)i * col_step, - originy + (double)j * row_step, - output_data[i][j]); - } - } - // printf(" count = %d\n", count); - } - - fclose(fd); -} -#endif - - -FGDem::~FGDem( void ) { - // printf("class FGDem DEstructor called.\n"); - delete [] dem_data; - delete [] output_data; -} - - diff --git a/Tools/Lib/DEM/dem.hxx b/Tools/Lib/DEM/dem.hxx deleted file mode 100644 index 2bbdf6ffe..000000000 --- a/Tools/Lib/DEM/dem.hxx +++ /dev/null @@ -1,154 +0,0 @@ -// dem.hxx -- DEM management class -// -// Written by Curtis Olson, started March 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _DEM_HXX -#define _DEM_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include -#include - - -#define DEM_SIZE 1200 -#define DEM_SIZE_1 1201 - - -class FGDem { - -private: - - // file pointer for input - // gzFile fd; - fg_gzifstream *in; - - // coordinates (in arc seconds) of south west corner - double originx, originy; - - // number of columns and rows - int cols, rows; - - // Distance between column and row data points (in arc seconds) - double col_step, row_step; - - // pointers to the actual grid data allocated here - float (*dem_data)[DEM_SIZE_1]; - float (*output_data)[DEM_SIZE_1]; - - // Current "A" Record Information - char dem_description[80], dem_quadrangle[80]; - double dem_x1, dem_y1, dem_x2, dem_y2, dem_x3, dem_y3, dem_x4, dem_y4; - double dem_z1, dem_z2; - int dem_resolution, dem_num_profiles; - - // Current "B" Record Information - int prof_col, prof_row; - int prof_num_cols, prof_num_rows; - double prof_x1, prof_y1; - int prof_data; - - // temporary values for the class to use - char option_name[32]; - int do_data; - int cur_col, cur_row; - - // return next token from input stream - string next_token(); - - // return next integer from input stream - int next_int(); - - // return next double from input stream - double next_double(); - - // return next exponential num from input stream - double next_exp(); - -public: - - // Constructor - FGDem( void ); - FGDem( const string& file ); - - // Destructor - ~FGDem( void ); - - // open a DEM file (use "-" if input is coming from stdin) - int open ( const string& file ); - - // close a DEM file - int close(); - - // parse a DEM file - int parse(); - - // read and parse DEM "A" record - int read_a_record(); - - // read and parse DEM "B" record - void read_b_record(); - - // write out the area of data covered by the specified bucket. - // Data is written out column by column starting at the lower left - // hand corner. - int write_area( const string& root, FGBucket& b, bool compress ); - -#if 0 - // return the current altitude based on grid data. We should - // rewrite this to interpolate exact values, but for now this is - // good enough - double interpolate_altitude( double lon, double lat ); - - // Use least squares to fit a simpler data set to dem data - void fit( double error, FGBucket& p ); - - // Initialize output mesh structure - void outputmesh_init( void ); - - // Get the value of a mesh node - double outputmesh_get_pt( int i, int j ); - - // Set the value of a mesh node - void outputmesh_set_pt( int i, int j, double value ); - - // Write out a node file that can be used by the "triangle" program - void outputmesh_output_nodes( const string& fg_root, FGBucket& p ); -#endif - - // Informational methods - inline double get_originx() const { return originx; } - inline double get_originy() const { return originy; } - inline int get_cols() const { return cols; } - inline int get_rows() const { return rows; } - inline double get_col_step() const { return col_step; } - inline double get_row_step() const { return row_step; } -}; - - -#endif // _DEM_HXX - - diff --git a/Tools/Lib/Makefile.am b/Tools/Lib/Makefile.am deleted file mode 100644 index 6c6ad9d3e..000000000 --- a/Tools/Lib/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -SUBDIRS = \ - DEM \ - Polygon \ - Triangle diff --git a/Tools/Lib/Polygon/Makefile.am b/Tools/Lib/Polygon/Makefile.am deleted file mode 100644 index caa4c59be..000000000 --- a/Tools/Lib/Polygon/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -noinst_LIBRARIES = libPolygon.a - -libPolygon_a_SOURCES = \ - index.cxx index.hxx \ - names.cxx names.hxx - -INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib diff --git a/Tools/Lib/Polygon/index.cxx b/Tools/Lib/Polygon/index.cxx deleted file mode 100644 index d5a51ca9b..000000000 --- a/Tools/Lib/Polygon/index.cxx +++ /dev/null @@ -1,71 +0,0 @@ -// index.cxx -- routines to handle a unique/persistant integer polygon index -// -// Written by Curtis Olson, started February 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - -#include - -#include STL_STRING - -#include - -#include "index.hxx" - - -static long int poly_index; -static string poly_path; - - -// initialize the unique polygon index counter stored in path -bool poly_index_init( string path ) { - poly_path = path; - - FILE *fp = fopen( poly_path.c_str(), "r" ); - - if ( fp == NULL ) { - cout << "Error cannot open " << poly_path << endl; - poly_index = 0; - return false; - } - - fscanf( fp, "%ld", &poly_index ); - - fclose( fp ); -} - - -// increment the persistant counter and return the next poly_index -long int poly_index_next() { - ++poly_index; - - FILE *fp = fopen( poly_path.c_str(), "w" ); - - if ( fp == NULL ) { - cout << "Error cannot open " << poly_path << " for writing" << endl; - } - - fprintf( fp, "%ld\n", poly_index ); - - fclose( fp ); - - return poly_index; -} - - diff --git a/Tools/Lib/Polygon/index.hxx b/Tools/Lib/Polygon/index.hxx deleted file mode 100644 index 8a60331cd..000000000 --- a/Tools/Lib/Polygon/index.hxx +++ /dev/null @@ -1,43 +0,0 @@ -// index.cxx -- routines to handle a unique/persistant integer polygon index -// -// Written by Curtis Olson, started February 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _INDEX_HXX -#define _INDEX_HXX - - -#include - -#include STL_STRING - - -// initialize the unique polygon index counter stored in path -bool poly_index_init( string path ); - -// increment the persistant counter and return the next poly_index -long int poly_index_next(); - - - -#endif // _INDEX_HXX - - diff --git a/Tools/Lib/Polygon/names.cxx b/Tools/Lib/Polygon/names.cxx deleted file mode 100644 index 8534b0bdf..000000000 --- a/Tools/Lib/Polygon/names.cxx +++ /dev/null @@ -1,122 +0,0 @@ -// names.cxx -- process shapefiles names -// -// Written by Curtis Olson, started February 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - -#include - -#include STL_STRING - -#include "names.hxx" - - -// return area type from text name -AreaType get_area_type( string area ) { - if ( area == "SomeSort" ) { - return SomeSortOfArea; - } else if ( area == "AirportKeep" ) { - return AirportKeepArea; - } else if ( area == "AirportIgnore" ) { - return AirportIgnoreArea; - } else if ( (area == "Swamp or Marsh") - || (area == "Marsh") ) { - return MarshArea; - } else if ( area == "Lake" ) { - return LakeArea; - } else if ( (area == "Lake Dry") - || (area == "DryLake") ) { - return DryLakeArea; - } else if ( (area == "Lake Intermittent") - || (area == "IntermittentLake") ) { - return IntLakeArea; - } else if ( area == "Reservoir" ) { - return ReservoirArea; - } else if ( (area == "Reservoir Intermittent") - || (area == "IntermittentReservoir") ) { - return IntReservoirArea; - } else if ( area == "Stream" ) { - return StreamArea; - } else if ( area == "Canal" ) { - return CanalArea; - } else if ( area == "Glacier" ) { - return GlacierArea; - } else if ( area == "Urban" ) { - return UrbanArea; - } else if ( area == "Default" ) { - return DefaultArea; - } else if ( (area == "Bay Estuary or Ocean") - || (area == "Ocean") ) { - return OceanArea; - } else if ( area == "Void Area" ) { - return VoidArea; - } else if ( area == "Null" ) { - return NullArea; - } else { - cout << "unknown area = '" << area << "'" << endl; - // cout << "area = " << area << endl; - // for ( int i = 0; i < area.length(); i++ ) { - // cout << i << ") " << (int)area[i] << endl; - // } - return UnknownArea; - } -} - - -// return text from of area name -string get_area_name( AreaType area ) { - if ( area == DefaultArea ) { - return "Default"; - } else if ( area == AirportKeepArea ) { - return "AirportKeep"; - } else if ( area == AirportIgnoreArea ) { - return "AirportIgnore"; - } else if ( area == MarshArea ) { - return "Marsh"; - } else if ( area == LakeArea ) { - return "Lake"; - } else if ( area == DryLakeArea ) { - return "DryLake"; - } else if ( area == IntLakeArea ) { - return "IntermittentLake"; - } else if ( area == ReservoirArea ) { - return "Reservoir"; - } else if ( area == IntReservoirArea ) { - return "IntermittentReservoir"; - } else if ( area == StreamArea ) { - return "Stream"; - } else if ( area == CanalArea ) { - return "Canal"; - } else if ( area == GlacierArea ) { - return "Glacier"; - } else if ( area == UrbanArea ) { - return "Urban"; - } else if ( area == OceanArea ) { - return "Ocean"; - } else if ( area == VoidArea ) { - return "VoidArea"; - } else if ( area == NullArea ) { - return "Null"; - } else { - cout << "unknown area code = " << (int)area << endl; - return "Unknown"; - } -} - - diff --git a/Tools/Lib/Polygon/names.hxx b/Tools/Lib/Polygon/names.hxx deleted file mode 100644 index 6c97c13ff..000000000 --- a/Tools/Lib/Polygon/names.hxx +++ /dev/null @@ -1,69 +0,0 @@ -// names.hxx -- process shapefiles names -// -// Written by Curtis Olson, started February 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _NAMES_HXX -#define _NAMES_HXX - - -#include - -#include STL_STRING - -FG_USING_STD(string); - - -// Posible shape file types. Note the order of these is important and -// defines the priority of these shapes if they should intersect. The -// smaller the number, the higher the priority. -enum AreaType { - SomeSortOfArea = 0, - AirportKeepArea = 1, - AirportIgnoreArea = 2, - LakeArea = 3, - DryLakeArea = 4, - IntLakeArea = 5, - ReservoirArea = 6, - IntReservoirArea = 7, - StreamArea = 8, - CanalArea = 9, - GlacierArea = 10, - OceanArea = 11, - UrbanArea = 12, - MarshArea = 13, - DefaultArea = 14, - VoidArea = 9997, - NullArea = 9998, - UnknownArea = 9999 -}; - - -// return area type from text name -AreaType get_area_type( string area ); - -// return text form of area name -string get_area_name( AreaType area ); - - -#endif // _NAMES_HXX - - diff --git a/Tools/Lib/Triangle/A.poly b/Tools/Lib/Triangle/A.poly deleted file mode 100644 index 166a71773..000000000 --- a/Tools/Lib/Triangle/A.poly +++ /dev/null @@ -1,62 +0,0 @@ -29 2 1 0 -1 0.200000 -0.776400 -0.57 -2 0.220000 -0.773200 -0.55 -3 0.245600 -0.756400 -0.51 -4 0.277600 -0.702000 -0.53 -5 0.488800 -0.207600 0.28 -6 0.504800 -0.207600 0.30 -7 0.740800 -0.739600 0 -8 0.756000 -0.761200 -0.01 -9 0.774400 -0.772400 0 -10 0.800000 -0.776400 0.02 -11 0.800000 -0.792400 0.01 -12 0.579200 -0.792400 -0.21 -13 0.579200 -0.776400 -0.2 -14 0.621600 -0.771600 -0.15 -15 0.633600 -0.762800 -0.13 -16 0.639200 -0.744400 -0.1 -17 0.620800 -0.684400 -0.06 -18 0.587200 -0.604400 -0.01 -19 0.360800 -0.604400 -0.24 -20 0.319200 -0.706800 -0.39 -21 0.312000 -0.739600 -0.43 -22 0.318400 -0.761200 -0.44 -23 0.334400 -0.771600 -0.44 -24 0.371200 -0.776400 -0.41 -25 0.371200 -0.792400 -0.42 -26 0.374400 -0.570000 -0.2 -27 0.574400 -0.570000 0 -28 0.473600 -0.330800 0.14 -29 0.200000 -0.792400 -0.59 -29 0 -1 29 1 -2 1 2 -3 2 3 -4 3 4 -5 4 5 -6 5 6 -7 6 7 -8 7 8 -9 8 9 -10 9 10 -11 10 11 -12 11 12 -13 12 13 -14 13 14 -15 14 15 -16 15 16 -17 16 17 -18 17 18 -19 18 19 -20 19 20 -21 20 21 -22 21 22 -23 22 23 -24 23 24 -25 24 25 -26 25 29 -27 26 27 -28 27 28 -29 28 26 -1 -1 0.47 -0.5 diff --git a/Tools/Lib/Triangle/Makefile.am b/Tools/Lib/Triangle/Makefile.am deleted file mode 100644 index caa86591b..000000000 --- a/Tools/Lib/Triangle/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -# DEFS is a list of definitions used to compile an object code version -# of Triangle (triangle.o) to be called by another program. The file -# "triangle.h" contains detailed information on how to call triangle.o. -# -# The -DTRILIBRARY should always be used when compiling Triangle into an -# object file. -# -# An example DEFS line is: -# -# DEFS = -DTRILIBRARY -DREDUCED -DCDT_ONLY - -DEFS += -DTRILIBRARY - -noinst_LIBRARIES = libTriangle.a - -libTriangle_a_SOURCES = triangle.c triangle.h - -if HAVE_XWINDOWS - -bin_PROGRAMS = showme -showme_SOURCES = showme.c -showme_LDADD = -lX11 - -endif \ No newline at end of file diff --git a/Tools/Lib/Triangle/README b/Tools/Lib/Triangle/README deleted file mode 100644 index 571d5689f..000000000 --- a/Tools/Lib/Triangle/README +++ /dev/null @@ -1,181 +0,0 @@ -Triangle -A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator. -Version 1.3 - -Show Me -A Display Program for Meshes and More. -Version 1.3 - -Copyright 1996 Jonathan Richard Shewchuk -School of Computer Science -Carnegie Mellon University -5000 Forbes Avenue -Pittsburgh, Pennsylvania 15213-3891 -Please send bugs and comments to jrs@cs.cmu.edu - -Created as part of the Archimedes project (tools for parallel FEM). -Supported in part by NSF Grant CMS-9318163 and an NSERC 1967 Scholarship. -There is no warranty whatsoever. Use at your own risk. - - -Triangle generates exact Delaunay triangulations, constrained Delaunay -triangulations, and quality conforming Delaunay triangulations. The -latter can be generated with no small angles, and are thus suitable for -finite element analysis. Show Me graphically displays the contents of -the geometric files used by Triangle. Show Me can also write images in -PostScript form. - -Information on the algorithms used by Triangle, including complete -references, can be found in the comments at the beginning of the triangle.c -source file. Another listing of these references, with PostScript copies -of some of the papers, is available from the Web page - - http://www.cs.cmu.edu/~quake/triangle.research.html - ------------------------------------------------------------------------------- - -These programs may be freely redistributed under the condition that the -copyright notices (including the copy of this notice in the code comments -and the copyright notice printed when the `-h' switch is selected) are -not removed, and no compensation is received. Private, research, and -institutional use is free. You may distribute modified versions of this -code UNDER THE CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE TO IT -IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE ORIGINAL AUTHOR, BOTH -SOURCE AND OBJECT CODE ARE MADE FREELY AVAILABLE WITHOUT CHARGE, AND -CLEAR NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution of this code as -part of a commercial system is permissible ONLY BY DIRECT ARRANGEMENT -WITH THE AUTHOR. (If you are not directly supplying this code to a -customer, and you are instead telling them how they can obtain it for -free, then you are not required to make any arrangement with me.) - ------------------------------------------------------------------------------- - -The files included in this distribution are: - - README The file you're reading now. - triangle.c Complete C source code for Triangle. - showme.c Complete C source code for Show Me. - triangle.h Include file for calling Triangle from another program. - tricall.c Sample program that calls Triangle. - makefile Makefile for compiling Triangle and Show Me. - A.poly A sample data file. - -Triangle and Show Me are each a single portable C file. The easiest way to -compile them is to edit and use the included makefile. Before compiling, -read the makefile, which describes your options, and edit it accordingly. -You should specify: - - The source and binary directories. - - The C compiler and level of optimization. - - Do you want single precision or double? Do you want to leave out some of - Triangle's features to reduce the size of the executable file? - - The "correct" directories for include files (especially X include files), - if necessary. - -Once you've done this, type "make" to compile the programs. Alternatively, -the files are usually easy to compile without a makefile: - - cc -O -o triangle triangle.c -lm - cc -O -o showme showme.c -lX11 - -On some systems, the C compiler won't be able to find the X include files -or libraries, and you'll need to specify an include path or library path: - - cc -O -I/usr/local/include -o showme showme.c -L/usr/local/lib -lX11 - -However, on other systems (like my workstation), the latter incantation -will cause the wrong files to be read, and the Show Me mouse buttons won't -work properly in the main window. Hence, try the "-I" and "-L" switches -ONLY if the compiler fails without it. (If you're using the makefile, you -may edit it to add this switch.) - -Some processors, possibly including Intel x86 family and Motorola 68xxx -family chips, are IEEE conformant but have extended length internal -floating-point registers that may defeat Triangle's exact arithmetic -routines by failing to cause enough roundoff error! Typically, there is -a way to set these internal registers so that they are rounded off to -IEEE single or double precision format. If you have such a processor, -you should check your C compiler or system manuals to find out how to -configure these internal registers to the precision you are using. -Otherwise, the exact arithmetic routines won't be exact at all. -Unfortunately, I don't have access to any such systems, and can't give -advice on how to configure them. These problems don't occur on any -workstations I am aware of. However, Triangle's exact arithmetic hasn't -a hope of working on machines like the Cray C90 or Y-MP, which are not -IEEE conformant and have inaccurate rounding. - -Triangle and Show Me both produce their own documentation. Complete -instructions are printed by invoking each program with the `-h' switch: - - triangle -h - showme -h - -The instructions are long; you'll probably want to pipe the output to -`more' or `lpr' or redirect it to a file. Both programs give a short list -of command line options if they are invoked without arguments (that is, -just type `triangle' or `showme'). Alternatively, you may want to read -the instructions on the World Wide Web. The appropriate URLs are: - - http://www.cs.cmu.edu/~quake/triangle.html - http://www.cs.cmu.edu/~quake/showme.html - -Try out Triangle on the enclosed sample file, A.poly: - - triangle -p A - showme A.poly & - -Triangle will read the Planar Straight Line Graph defined by A.poly, and -write its constrained Delaunay triangulation to A.1.node and A.1.ele. -Show Me will display the figure defined by A.poly. There are two buttons -marked "ele" in the Show Me window; click on the top one. This will cause -Show Me to load and display the triangulation. - -For contrast, try running - - triangle -pq A - -Now, click on the same "ele" button. A new triangulation will be loaded; -this one having no angles smaller than 20 degrees. - -To see a Voronoi diagram, try this: - - cp A.poly A.node - triangle -v A - -Click the "ele" button again. You will see the Delaunay triangulation of -the points in A.poly, without the segments. Now click the top "voro" button. -You will see the Voronoi diagram corresponding to that Delaunay triangulation. -Click the "Reset" button to see the full extent of the diagram. - ------------------------------------------------------------------------------- - -If you wish to call Triangle from another program, instructions for doing -so are contained in the file `triangle.h' (but read Triangle's regular -instructions first!). Also look at `tricall.c', which provides an example. - -Type "make trilibrary" to create triangle.o, a callable object file. -Alternatively, the object file is usually easy to compile without a -makefile: - - cc -DTRILIBRARY -O -c triangle.c - ------------------------------------------------------------------------------- - -If you use Triangle, and especially if you use it to accomplish real -work, I would like very much to hear from you. A short letter or email -(to jrs@cs.cmu.edu) describing how you use Triangle will mean a lot to -me. The more people I know are using this program, the more easily I can -justify spending time on improvements and on the three-dimensional -successor to Triangle, which in turn will benefit you. Also, I can put -you on a list to receive email whenever a new version of Triangle is -available. - -If you use a mesh generated by Triangle or plotted by Show Me in a -publication, please include an acknowledgment as well. - - -Jonathan Richard Shewchuk -July 20, 1996 diff --git a/Tools/Lib/Triangle/showme.c b/Tools/Lib/Triangle/showme.c deleted file mode 100644 index 722cba8ac..000000000 --- a/Tools/Lib/Triangle/showme.c +++ /dev/null @@ -1,3384 +0,0 @@ -/*****************************************************************************/ -/* */ -/* ,d88^^o 888 o o */ -/* 8888 888o^88, o88^^o Y88b o / d8b d8b o88^^8o */ -/* "Y88b 888 888 d888 b Y88b d8b / d888bdY88b d888 88b */ -/* "Y88b, 888 888 8888 8 Y888/Y88b/ / Y88Y Y888b 8888oo888 */ -/* o 8888 888 888 q888 p Y8/ Y8/ / YY Y888b q888 */ -/* "oo88P" 888 888 "88oo" Y Y / Y888b "88oooo" */ -/* */ -/* A Display Program for Meshes and More. */ -/* (showme.c) */ -/* */ -/* Version 1.3 */ -/* July 20, 1996 */ -/* */ -/* Copyright 1996 */ -/* Jonathan Richard Shewchuk */ -/* School of Computer Science */ -/* Carnegie Mellon University */ -/* 5000 Forbes Avenue */ -/* Pittsburgh, Pennsylvania 15213-3891 */ -/* jrs@cs.cmu.edu */ -/* */ -/* This program may be freely redistributed under the condition that the */ -/* copyright notices (including this entire header and the copyright */ -/* notice printed when the `-h' switch is selected) are not removed, and */ -/* no compensation is received. Private, research, and institutional */ -/* use is free. You may distribute modified versions of this code UNDER */ -/* THE CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE TO IT IN THE */ -/* SAME FILE REMAIN UNDER COPYRIGHT OF THE ORIGINAL AUTHOR, BOTH SOURCE */ -/* AND OBJECT CODE ARE MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR */ -/* NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution of this code as */ -/* part of a commercial system is permissible ONLY BY DIRECT ARRANGEMENT */ -/* WITH THE AUTHOR. (If you are not directly supplying this code to a */ -/* customer, and you are instead telling them how they can obtain it for */ -/* free, then you are not required to make any arrangement with me.) */ -/* */ -/* Hypertext instructions for Triangle are available on the Web at */ -/* */ -/* http://www.cs.cmu.edu/~quake/showme.html */ -/* */ -/* Show Me was created as part of the Archimedes project in the School of */ -/* Computer Science at Carnegie Mellon University. Archimedes is a */ -/* system for compiling parallel finite element solvers. For further */ -/* information, see Anja Feldmann, Omar Ghattas, John R. Gilbert, Gary L. */ -/* Miller, David R. O'Hallaron, Eric J. Schwabe, Jonathan R. Shewchuk, */ -/* and Shang-Hua Teng. "Automated Parallel Solution of Unstructured PDE */ -/* Problems." To appear in Communications of the ACM, we hope. */ -/* */ -/* If you make any improvements to this code, please please please let me */ -/* know, so that I may obtain the improvements. Even if you don't change */ -/* the code, I'd still love to hear what it's being used for. */ -/* */ -/* Disclaimer: Neither I nor Carnegie Mellon warrant this code in any way */ -/* whatsoever. Use at your own risk. */ -/* */ -/*****************************************************************************/ - -/* For single precision (which will save some memory and reduce paging), */ -/* write "#define SINGLE" below. */ -/* */ -/* For double precision (which will allow you to display triangulations of */ -/* a finer resolution), leave SINGLE undefined. */ - -/* #define SINGLE */ - -#ifdef SINGLE -#define REAL float -#else -#define REAL double -#endif - -/* Maximum number of characters in a file name (including the null). */ - -#define FILENAMESIZE 1024 - -/* Maximum number of characters in a line read from a file (including the */ -/* null). */ - -#define INPUTLINESIZE 512 - -#define STARTWIDTH 414 -#define STARTHEIGHT 414 -#define MINWIDTH 50 -#define MINHEIGHT 50 -#define BUTTONHEIGHT 21 -#define BUTTONROWS 3 -#define PANELHEIGHT (BUTTONHEIGHT * BUTTONROWS) -#define MAXCOLORS 64 - -#define IMAGE_TYPES 7 -#define NOTHING -1 -#define NODE 0 -#define POLY 1 -#define ELE 2 -#define EDGE 3 -#define PART 4 -#define ADJ 5 -#define VORO 6 - -#define STARTEXPLOSION 0.5 - -#include -#include -#include -#include -#include - -/* The following obscenity seems to be necessary to ensure that this program */ -/* will port to Dec Alphas running OSF/1, because their stdio.h file commits */ -/* the unpardonable sin of including stdlib.h. Hence, malloc(), free(), and */ -/* exit() may or may not already be defined at this point. I declare these */ -/* functions explicitly because some non-ANSI C compilers lack stdlib.h. */ - -#ifndef _STDLIB_H_ -extern char *malloc(); -extern void free(); -extern void exit(); -extern double strtod(); -extern long strtol(); -#endif - -/* A necessary forward declaration. */ - -int load_image(); - -Display *display; -int screen; -Window rootwindow; -Window mainwindow; -Window quitwin; -Window leftwin; -Window rightwin; -Window upwin; -Window downwin; -Window resetwin; -Window pswin; -Window epswin; -Window expwin; -Window exppluswin; -Window expminuswin; -Window widthpluswin; -Window widthminuswin; -Window versionpluswin; -Window versionminuswin; -Window fillwin; -Window nodewin[2]; -Window polywin[2]; -Window elewin[2]; -Window edgewin[2]; -Window partwin[2]; -Window adjwin[2]; -Window voronoiwin[2]; - -int windowdepth; -XEvent event; -Colormap rootmap; -XFontStruct *font; -int width, height; -int black, white; -int showme_foreground; -GC fontgc; -GC blackfontgc; -GC linegc; -GC trianglegc; -int colors[MAXCOLORS]; -XColor rgb[MAXCOLORS]; -int color; - -int start_image, current_image; -int start_inc, current_inc; -int loweriteration; -int line_width; -int loaded[2][IMAGE_TYPES]; -REAL xlo[2][IMAGE_TYPES], ylo[2][IMAGE_TYPES]; -REAL xhi[2][IMAGE_TYPES], yhi[2][IMAGE_TYPES]; -REAL xscale, yscale; -REAL xoffset, yoffset; -int zoom; - -int nodes[2], node_dim[2]; -REAL *nodeptr[2]; -int polynodes[2], poly_dim[2], polyedges[2], polyholes[2]; -REAL *polynodeptr[2], *polyholeptr[2]; -int *polyedgeptr[2]; -int elems[2], ele_corners[2]; -int *eleptr[2]; -int edges[2]; -int *edgeptr[2]; -REAL *normptr[2]; -int subdomains[2]; -int *partpart[2]; -REAL *partcenter[2], *partshift[2]; -int adjsubdomains[2]; -int *adjptr[2]; -int vnodes[2], vnode_dim[2]; -REAL *vnodeptr[2]; -int vedges[2]; -int *vedgeptr[2]; -REAL *vnormptr[2]; -int firstnumber[2]; - -int quiet, fillelem, bw_ps, explode; -REAL explosion; - -char filename[FILENAMESIZE]; -char nodefilename[2][FILENAMESIZE]; -char polyfilename[2][FILENAMESIZE]; -char elefilename[2][FILENAMESIZE]; -char edgefilename[2][FILENAMESIZE]; -char partfilename[2][FILENAMESIZE]; -char adjfilename[2][FILENAMESIZE]; -char vnodefilename[2][FILENAMESIZE]; -char vedgefilename[2][FILENAMESIZE]; - -char *colorname[] = {"aquamarine", "red", "green yellow", "magenta", - "yellow", "green", "orange", "blue", - "white", "sandy brown", "cyan", "moccasin", - "cadet blue", "coral", "cornflower blue", "sky blue", - "firebrick", "forest green", "gold", "goldenrod", - "gray", "hot pink", "chartreuse", "pale violet red", - "indian red", "khaki", "lavender", "light blue", - "light gray", "light steel blue", "lime green", "azure", - "maroon", "medium aquamarine", "dodger blue", "honeydew", - "medium orchid", "medium sea green", "moccasin", - "medium slate blue", "medium spring green", - "medium turquoise", "medium violet red", - "orange red", "chocolate", "light goldenrod", - "orchid", "pale green", "pink", "plum", - "purple", "salmon", "sea green", - "sienna", "slate blue", "spring green", - "steel blue", "tan", "thistle", "turquoise", - "violet", "violet red", "wheat", - "yellow green"}; - -void syntax() -{ - printf("showme [-bfw_Qh] input_file\n"); - printf(" -b Black and white PostScript (default is color).\n"); - printf(" -f Fill triangles of partitioned mesh with color.\n"); - printf(" -w Set line width to some specified number.\n"); - printf(" -Q Quiet: No terminal output except errors.\n"); - printf(" -h Help: Detailed instructions for Show Me.\n"); - exit(0); -} - -void info() -{ - printf("Show Me\n"); - printf("A Display Program for Meshes and More.\n"); - printf("Version 1.3\n\n"); - printf( -"Copyright 1996 Jonathan Richard Shewchuk (bugs/comments to jrs@cs.cmu.edu)\n" -); - printf("School of Computer Science / Carnegie Mellon University\n"); - printf("5000 Forbes Avenue / Pittsburgh, Pennsylvania 15213-3891\n"); - printf( -"Created as part of the Archimedes project (tools for parallel FEM).\n"); - printf( -"Supported in part by NSF Grant CMS-9318163 and an NSERC 1967 Scholarship.\n"); - printf("There is no warranty whatsoever. Use at your own risk.\n"); -#ifdef SINGLE - printf("This executable is compiled for single precision arithmetic.\n\n\n"); -#else - printf("This executable is compiled for double precision arithmetic.\n\n\n"); -#endif - printf( -"Show Me graphically displays the contents of geometric files, especially\n"); - printf( -"those generated by Triangle, my two-dimensional quality mesh generator and\n" -); - printf( -"Delaunay triangulator. Show Me can also write images in PostScript form.\n"); - printf( -"Show Me is also useful for checking the consistency of the files you create\n" -); - printf( -"as input to Triangle; Show Me does these checks more thoroughly than\n"); - printf("Triangle does. The command syntax is:\n\n"); - printf("showme [-bfw_Qh] input_file\n\n"); - printf( -"The underscore indicates that a number should follow the -w switch.\n"); - printf( -"input_file may be one of several types of file. It must have extension\n"); - printf( -".node, .poly, .ele, .edge, .part, or .adj. If no extension is provided,\n"); - printf( -"Show Me will assume the extension .ele. A .node file represents a set of\n"); - printf( -"points; a .poly file represents a Planar Straight Line Graph; an .ele file\n" -); - printf( -"(coupled with a .node file) represents the elements of a mesh or the\n"); - printf( -"triangles of a triangulation; an .edge file (coupled with a .node file)\n"); - printf( -"represents a set of edges; a .part file specifies a partition of a mesh;\n"); - printf( -"and a .adj file represents the adjacency graph defined by a partition.\n"); - printf("\n"); - printf("Command Line Switches:\n"); - printf("\n"); - printf( -" -b Makes all PostScript output black and white. If this switch is not\n" -); - printf( -" selected, color PostScript is used for partitioned meshes and\n"); - printf(" adjacency graphs (.part and .adj files).\n"); - printf( -" -f On color displays and in color PostScript, displays partitioned\n"); - printf( -" meshes by filling triangles with color, rather than by coloring the\n" -); - printf( -" edges. This switch will result in a clearer picture if all\n"); - printf( -" triangles are reasonably large, and a less clear picture if small\n"); - printf( -" triangles are present. (There is also a button to toggle this\n"); - printf(" behavior.)\n"); - printf( -" -w Followed by an integer, specifies the line width used in all\n"); - printf( -" images. (There are also buttons to change the line width.)\n"); - printf( -" -Q Quiet: Suppresses all explanation of what Show Me is doing, unless\n" -); - printf(" an error occurs.\n"); - printf(" -h Help: Displays these instructions.\n"); - printf("\n"); - printf("Controls:\n"); - printf("\n"); - printf( -" To zoom in on an image, point at the location where you want a closer\n"); - printf( -" look, and click the left mouse button. To zoom out, click the right\n"); - printf( -" mouse button. In either case, the point you click on will be centered in\n" -); - printf( -" the window. If you want to know the coordinates of a point, click the\n"); - printf( -" middle mouse button; the coordinates will be printed on the terminal you\n" -); - printf(" invoked Show Me from.\n\n"); - printf( -" If you resize the window, the image will grow or shrink to match.\n"); - printf("\n"); - printf( -" There is a panel of control buttons at the bottom of the Show Me window:\n" -); - printf("\n"); - printf(" Quit: Shuts down Show Me.\n"); - printf(" <, >, ^, v: Moves the image in the indicated direction.\n"); - printf( -" Reset: Unzooms and centers the image in the window. When you switch from\n" -); - printf( -" one image to another, the viewing region does not change, so you may\n"); - printf( -" need to reset the new image to make it fully visible. This often is\n"); - printf( -" the case when switching between Delaunay triangulations and their\n"); - printf( -" corresponding Voronoi diagrams, as Voronoi vertices can be far from the\n" -); - printf(" initial point set.\n"); - printf( -" Width+, -: Increases or decreases the width of all lines and points.\n"); - printf( -" Exp, +, -: These buttons appear only when you are viewing a partitioned\n" -); - printf( -" mesh (.part file). `Exp' toggles between an exploded and non-exploded\n" -); - printf( -" image of the mesh. The non-exploded image will not show the partition\n" -); - printf( -" on a black and white monitor. `+' and `-' allow you to adjust the\n"); - printf( -" spacing between pieces of the mesh to better distinguish them.\n"); - printf( -" Fill: This button appears only when you are viewing a partitioned mesh\n"); - printf( -" (.part file). It toggles between color-filled triangles and colored\n"); - printf( -" edges (as the -f switch does). Filled triangles look better when all\n"); - printf( -" triangles are reasonably large; colored edges look better when there\n"); - printf(" are very small triangles present.\n"); - printf( -" PS: Creates a PostScript file containing the image you are viewing. If\n" -); - printf( -" the -b switch is selected, all PostScript output will be black and\n"); - printf( -" white; otherwise, .part.ps and .adj.ps files will be color, independent\n" -); - printf( -" of whether you are using a color monitor. Normally the output will\n"); - printf( -" preserve the properties of the image you see on the screen, including\n"); - printf( -" zoom and line width; however, if black and white output is selected (-b\n" -); - printf( -" switch), partitioned meshes will always be drawn exploded. The output\n" -); - printf( -" file name depends on the image being viewed. If you want several\n"); - printf( -" different snapshots (zooming in on different parts) of the same object,\n" -); - printf( -" you'll have to rename each file after Show Me creates it so that it\n"); - printf(" isn't overwritten by the next snapshot.\n"); - printf( -" EPS: Creates an encapsulated PostScript file, suitable for inclusion in\n" -); - printf( -" documents. Otherwise, this button is just like the PS button. (The\n"); - printf( -" main difference is that .eps files lack a `showpage' command at the\n"); - printf(" end.)\n\n"); - printf( -" There are two nearly-identical rows of buttons that load different images\n" -); - printf(" from disk. Each row contains the following buttons:\n\n"); - printf(" node: Loads a .node file.\n"); - printf( -" poly: Loads a .poly file (and possibly an associated .node file).\n"); - printf(" ele: Loads an .ele file (and associated .node file).\n"); - printf(" edge: Loads an .edge file (and associated .node file).\n"); - printf( -" part: Loads a .part file (and associated .node and .ele files).\n"); - printf( -" adj: Loads an .adj file (and associated .node, .ele, and .part files).\n"); - printf(" voro: Loads a .v.node and .v.edge file for a Voronoi diagram.\n"); - printf("\n"); - printf( -" Each row represents a different iteration number of the geometry files.\n"); - printf( -" For a full explanation of iteration numbers, read the instructions for\n"); - printf( -" Triangle. Briefly, iteration numbers are used to allow a user to easily\n" -); - printf( -" represent a sequence of related triangulations. Iteration numbers are\n"); - printf( -" used in the names of geometry files; for instance, mymesh.3.ele is a\n"); - printf( -" triangle file with iteration number three, and mymesh.ele has an implicit\n" -); - printf(" iteration number of zero.\n\n"); - printf( -" The control buttons at the right end of each row display the two\n"); - printf( -" iterations currently under view. These buttons can be clicked to\n"); - printf( -" increase or decrease the iteration numbers, and thus conveniently view\n"); - printf(" a sequence of meshes.\n\n"); - printf( -" Show Me keeps each file in memory after loading it, but you can force\n"); - printf( -" Show Me to reread a set of files (for one iteration number) by reclicking\n" -); - printf( -" the button that corresponds to the current image. This is convenient if\n" -); - printf(" you have changed a geometry file.\n\n"); - printf("File Formats:\n\n"); - printf( -" All files may contain comments prefixed by the character '#'. Points,\n"); - printf( -" segments, holes, triangles, edges, and subdomains must be numbered\n"); - printf( -" consecutively, starting from either 1 or 0. Whichever you choose, all\n"); - printf( -" input files must be consistent (for any single iteration number); if the\n" -); - printf( -" nodes are numbered from 1, so must be all other objects. Show Me\n"); - printf( -" automatically detects your choice while reading a .node (or .poly) file.\n" -); - printf(" Examples of these file formats are given below.\n\n"); - printf(" .node files:\n"); - printf( -" First line: <# of points> <# of attributes>\n"); - printf( -" <# of boundary markers (0 or 1)>\n" -); - printf( -" Remaining lines: [attributes] [boundary marker]\n"); - printf("\n"); - printf( -" The attributes, which are typically floating-point values of physical\n"); - printf( -" quantities (such as mass or conductivity) associated with the nodes of\n" -); - printf( -" a finite element mesh, are ignored by Show Me. Show Me also ignores\n"); - printf( -" boundary markers. See the instructions for Triangle to find out what\n"); - printf(" attributes and boundary markers are.\n\n"); - printf(" .poly files:\n"); - printf( -" First line: <# of points> <# of attributes>\n"); - printf( -" <# of boundary markers (0 or 1)>\n" -); - printf( -" Following lines: [attributes] [boundary marker]\n"); - printf(" One line: <# of segments> <# of boundary markers (0 or 1)>\n"); - printf( -" Following lines: [boundary marker]\n"); - printf(" One line: <# of holes>\n"); - printf(" Following lines: \n"); - printf(" [Optional additional lines that are ignored]\n\n"); - printf( -" A .poly file represents a Planar Straight Line Graph (PSLG), an idea\n"); - printf( -" familiar to computational geometers. By definition, a PSLG is just a\n"); - printf( -" list of points and edges. A .poly file also contains some additional\n"); - printf(" information.\n\n"); - printf( -" The first section lists all the points, and is identical to the format\n" -); - printf( -" of .node files. <# of points> may be set to zero to indicate that the\n" -); - printf( -" points are listed in a separate .node file; .poly files produced by\n"); - printf( -" Triangle always have this format. When Show Me reads such a file, it\n"); - printf(" also reads the corresponding .node file.\n\n"); - printf( -" The second section lists the segments. Segments are edges whose\n"); - printf( -" presence in a triangulation produced from the PSLG is enforced. Each\n"); - printf( -" segment is specified by listing the indices of its two endpoints. This\n" -); - printf( -" means that its endpoints must be included in the point list. Each\n"); - printf( -" segment, like each point, may have a boundary marker, which is ignored\n" -); - printf(" by Show Me.\n\n"); - printf( -" The third section lists holes and concavities that are desired in any\n"); - printf( -" triangulation generated from the PSLG. Holes are specified by\n"); - printf(" identifying a point inside each hole.\n\n"); - printf(" .ele files:\n"); - printf( -" First line: <# of triangles> <# of attributes>\n"); - printf( -" Remaining lines: ... [attributes]\n" -); - printf("\n"); - printf( -" Points are indices into the corresponding .node file. Show Me ignores\n" -); - printf( -" all but the first three points of each triangle; these should be the\n"); - printf( -" corners listed in counterclockwise order around the triangle. The\n"); - printf(" attributes are ignored by Show Me.\n\n"); - printf(" .edge files:\n"); - printf(" First line: <# of edges> <# of boundary markers (0 or 1)>\n"); - printf( -" Following lines: [boundary marker]\n"); - printf("\n"); - printf( -" Endpoints are indices into the corresponding .node file. The boundary\n" -); - printf(" markers are ignored by Show Me.\n\n"); - printf( -" In Voronoi diagrams, one also finds a special kind of edge that is an\n"); - printf( -" infinite ray with only one endpoint. For these edges, a different\n"); - printf(" format is used:\n\n"); - printf(" -1 \n\n"); - printf( -" The `direction' is a floating-point vector that indicates the direction\n" -); - printf(" of the infinite ray.\n\n"); - printf(" .part files:\n"); - printf(" First line: <# of triangles> <# of subdomains>\n"); - printf(" Remaining lines: \n\n"); - printf( -" The set of triangles is partitioned by a .part file; each triangle is\n"); - printf(" mapped to a subdomain.\n\n"); - printf(" .adj files:\n"); - printf(" First line: <# of subdomains>\n"); - printf(" Remaining lines: \n\n"); - printf( -" An .adj file represents adjacencies between subdomains (presumably\n"); - printf(" computed by a partitioner). The first line is followed by\n"); - printf( -" (subdomains X subdomains) lines, each containing one entry of the\n"); - printf( -" adjacency matrix. A nonzero entry indicates that two subdomains are\n"); - printf(" adjacent (share a point).\n\n"); - printf("Example:\n\n"); - printf( -" Here is a sample file `box.poly' describing a square with a square hole:\n" -); - printf("\n"); - printf( -" # A box with eight points in 2D, no attributes, no boundary marker.\n"); - printf(" 8 2 0 0\n"); - printf(" # Outer box has these vertices:\n"); - printf(" 1 0 0\n"); - printf(" 2 0 3\n"); - printf(" 3 3 0\n"); - printf(" 4 3 3\n"); - printf(" # Inner square has these vertices:\n"); - printf(" 5 1 1\n"); - printf(" 6 1 2\n"); - printf(" 7 2 1\n"); - printf(" 8 2 2\n"); - printf(" # Five segments without boundary markers.\n"); - printf(" 5 0\n"); - printf(" 1 1 2 # Left side of outer box.\n"); - printf(" 2 5 7 # Segments 2 through 5 enclose the hole.\n"); - printf(" 3 7 8\n"); - printf(" 4 8 6\n"); - printf(" 5 6 5\n"); - printf(" # One hole in the middle of the inner square.\n"); - printf(" 1\n"); - printf(" 1 1.5 1.5\n\n"); - printf( -" After this PSLG is triangulated by Triangle, the resulting triangulation\n" -); - printf( -" consists of a .node and .ele file. Here is the former, `box.1.node',\n"); - printf(" which duplicates the points of the PSLG:\n\n"); - printf(" 8 2 0 0\n"); - printf(" 1 0 0\n"); - printf(" 2 0 3\n"); - printf(" 3 3 0\n"); - printf(" 4 3 3\n"); - printf(" 5 1 1\n"); - printf(" 6 1 2\n"); - printf(" 7 2 1\n"); - printf(" 8 2 2\n"); - printf(" # Generated by triangle -pcBev box\n"); - printf("\n"); - printf(" Here is the triangulation file, `box.1.ele'.\n"); - printf("\n"); - printf(" 8 3 0\n"); - printf(" 1 1 5 6\n"); - printf(" 2 5 1 3\n"); - printf(" 3 2 6 8\n"); - printf(" 4 6 2 1\n"); - printf(" 5 7 3 4\n"); - printf(" 6 3 7 5\n"); - printf(" 7 8 4 2\n"); - printf(" 8 4 8 7\n"); - printf(" # Generated by triangle -pcBev box\n\n"); - printf(" Here is the edge file for the triangulation, `box.1.edge'.\n\n"); - printf(" 16 0\n"); - printf(" 1 1 5\n"); - printf(" 2 5 6\n"); - printf(" 3 6 1\n"); - printf(" 4 1 3\n"); - printf(" 5 3 5\n"); - printf(" 6 2 6\n"); - printf(" 7 6 8\n"); - printf(" 8 8 2\n"); - printf(" 9 2 1\n"); - printf(" 10 7 3\n"); - printf(" 11 3 4\n"); - printf(" 12 4 7\n"); - printf(" 13 7 5\n"); - printf(" 14 8 4\n"); - printf(" 15 4 2\n"); - printf(" 16 8 7\n"); - printf(" # Generated by triangle -pcBev box\n"); - printf("\n"); - printf( -" Here's a file `box.1.part' that partitions the mesh into four subdomains.\n" -); - printf("\n"); - printf(" 8 4\n"); - printf(" 1 3\n"); - printf(" 2 3\n"); - printf(" 3 4\n"); - printf(" 4 4\n"); - printf(" 5 1\n"); - printf(" 6 1\n"); - printf(" 7 2\n"); - printf(" 8 2\n"); - printf(" # Generated by slice -s4 box.1\n\n"); - printf( -" Here's a file `box.1.adj' that represents the resulting adjacencies.\n"); - printf("\n"); - printf(" 4\n"); - printf(" 9\n"); - printf(" 2\n"); - printf(" 2\n"); - printf(" 0\n"); - printf(" 2\n"); - printf(" 9\n"); - printf(" 0\n"); - printf(" 2\n"); - printf(" 2\n"); - printf(" 0\n"); - printf(" 9\n"); - printf(" 2\n"); - printf(" 0\n"); - printf(" 2\n"); - printf(" 2\n"); - printf(" 9\n"); - printf("\n"); - printf("Display Speed:\n"); - printf("\n"); - printf( -" It is worthwhile to note that .edge files typically plot and print twice\n" -); - printf( -" as quickly as .ele files, because .ele files cause each internal edge to\n" -); - printf( -" be drawn twice. For the same reason, PostScript files created from edge\n" -); - printf(" sets are smaller than those created from triangulations.\n\n"); - printf("Show Me on the Web:\n\n"); - printf( -" To see an illustrated, updated version of these instructions, check out\n"); - printf("\n"); - printf(" http://www.cs.cmu.edu/~quake/showme.html\n"); - printf("\n"); - printf("A Brief Plea:\n"); - printf("\n"); - printf( -" If you use Show Me (or Triangle), and especially if you use it to\n"); - printf( -" accomplish real work, I would like very much to hear from you. A short\n"); - printf( -" letter or email (to jrs@cs.cmu.edu) describing how you use Show Me (and\n"); - printf( -" its sister programs) will mean a lot to me. The more people I know\n"); - printf( -" are using my programs, the more easily I can justify spending time on\n"); - printf( -" improvements, which in turn will benefit you. Also, I can put you\n"); - printf( -" on a list to receive email whenever new versions are available.\n"); - printf("\n"); - printf( -" If you use a PostScript file generated by Show Me in a publication,\n"); - printf(" please include an acknowledgment as well.\n\n"); - exit(0); -} - -void set_filenames(filename, lowermeshnumber) -char *filename; -int lowermeshnumber; -{ - char numberstring[100]; - int i; - - for (i = 0; i < 2; i++) { - strcpy(nodefilename[i], filename); - strcpy(polyfilename[i], filename); - strcpy(elefilename[i], filename); - strcpy(edgefilename[i], filename); - strcpy(partfilename[i], filename); - strcpy(adjfilename[i], filename); - strcpy(vnodefilename[i], filename); - strcpy(vedgefilename[i], filename); - - if (lowermeshnumber + i > 0) { - sprintf(numberstring, ".%d", lowermeshnumber + i); - strcat(nodefilename[i], numberstring); - strcat(polyfilename[i], numberstring); - strcat(elefilename[i], numberstring); - strcat(edgefilename[i], numberstring); - strcat(partfilename[i], numberstring); - strcat(adjfilename[i], numberstring); - strcat(vnodefilename[i], numberstring); - strcat(vedgefilename[i], numberstring); - } - - strcat(nodefilename[i], ".node"); - strcat(polyfilename[i], ".poly"); - strcat(elefilename[i], ".ele"); - strcat(edgefilename[i], ".edge"); - strcat(partfilename[i], ".part"); - strcat(adjfilename[i], ".adj"); - strcat(vnodefilename[i], ".v.node"); - strcat(vedgefilename[i], ".v.edge"); - } -} - -void parsecommandline(argc, argv) -int argc; -char **argv; -{ - int increment; - int meshnumber; - int i, j; - - quiet = 0; - fillelem = 0; - line_width = 1; - bw_ps = 0; - start_image = ELE; - filename[0] = '\0'; - for (i = 1; i < argc; i++) { - if (argv[i][0] == '-') { - for (j = 1; argv[i][j] != '\0'; j++) { - if (argv[i][j] == 'f') { - fillelem = 1; - } - if (argv[i][j] == 'w') { - if ((argv[i][j + 1] >= '1') && (argv[i][j + 1] <= '9')) { - line_width = 0; - while ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { - j++; - line_width = line_width * 10 + (int) (argv[i][j] - '0'); - } - if (line_width > 100) { - printf("Error: Line width cannot exceed 100.\n"); - line_width = 1; - } - } - } - if (argv[i][j] == 'b') { - bw_ps = 1; - } - if (argv[i][j] == 'Q') { - quiet = 1; - } - if ((argv[i][j] == 'h') || (argv[i][j] == 'H') || - (argv[i][j] == '?')) { - info(); - } - } - } else { - strcpy(filename, argv[i]); - } - } - if (filename[0] == '\0') { - syntax(); - } - if (!strcmp(&filename[strlen(filename) - 5], ".node")) { - filename[strlen(filename) - 5] = '\0'; - start_image = NODE; - } - if (!strcmp(&filename[strlen(filename) - 5], ".poly")) { - filename[strlen(filename) - 5] = '\0'; - start_image = POLY; - } - if (!strcmp(&filename[strlen(filename) - 4], ".ele")) { - filename[strlen(filename) - 4] = '\0'; - start_image = ELE; - } - if (!strcmp(&filename[strlen(filename) - 5], ".edge")) { - filename[strlen(filename) - 5] = '\0'; - start_image = EDGE; - } - if (!strcmp(&filename[strlen(filename) - 5], ".part")) { - filename[strlen(filename) - 5] = '\0'; - start_image = PART; - } - if (!strcmp(&filename[strlen(filename) - 4], ".adj")) { - filename[strlen(filename) - 4] = '\0'; - start_image = ADJ; - } - - increment = 0; - j = 1; - while (filename[j] != '\0') { - if ((filename[j] == '.') && (filename[j + 1] != '\0')) { - increment = j + 1; - } - j++; - } - meshnumber = 0; - if (increment > 0) { - j = increment; - do { - if ((filename[j] >= '0') && (filename[j] <= '9')) { - meshnumber = meshnumber * 10 + (int) (filename[j] - '0'); - } else { - increment = 0; - } - j++; - } while (filename[j] != '\0'); - } - if (increment > 0) { - filename[increment - 1] = '\0'; - } - - if (meshnumber == 0) { - start_inc = 0; - loweriteration = 0; - } else { - start_inc = 1; - loweriteration = meshnumber - 1; - } - set_filenames(filename, loweriteration); -} - -void free_inc(inc) -int inc; -{ - if (loaded[inc][NODE]) { - free(nodeptr[inc]); - } - if (loaded[inc][POLY]) { - if (polynodes[inc] > 0) { - free(polynodeptr[inc]); - } - free(polyedgeptr[inc]); - free(polyholeptr[inc]); - } - if (loaded[inc][ELE]) { - free(eleptr[inc]); - } - if (loaded[inc][PART]) { - free(partpart[inc]); - free(partcenter[inc]); - free(partshift[inc]); - } - if (loaded[inc][EDGE]) { - free(edgeptr[inc]); - free(normptr[inc]); - } - if (loaded[inc][ADJ]) { - free(adjptr[inc]); - } - if (loaded[inc][VORO]) { - free(vnodeptr[inc]); - free(vedgeptr[inc]); - free(vnormptr[inc]); - } -} - -void move_inc(inc) -int inc; -{ - int i; - - free_inc(1 - inc); - for (i = 0; i < IMAGE_TYPES; i++) { - loaded[1 - inc][i] = loaded[inc][i]; - loaded[inc][i] = 0; - xlo[1 - inc][i] = xlo[inc][i]; - ylo[1 - inc][i] = ylo[inc][i]; - xhi[1 - inc][i] = xhi[inc][i]; - yhi[1 - inc][i] = yhi[inc][i]; - } - nodes[1 - inc] = nodes[inc]; - node_dim[1 - inc] = node_dim[inc]; - nodeptr[1 - inc] = nodeptr[inc]; - polynodes[1 - inc] = polynodes[inc]; - poly_dim[1 - inc] = poly_dim[inc]; - polyedges[1 - inc] = polyedges[inc]; - polyholes[1 - inc] = polyholes[inc]; - polynodeptr[1 - inc] = polynodeptr[inc]; - polyedgeptr[1 - inc] = polyedgeptr[inc]; - polyholeptr[1 - inc] = polyholeptr[inc]; - elems[1 - inc] = elems[inc]; - ele_corners[1 - inc] = ele_corners[inc]; - eleptr[1 - inc] = eleptr[inc]; - edges[1 - inc] = edges[inc]; - edgeptr[1 - inc] = edgeptr[inc]; - normptr[1 - inc] = normptr[inc]; - subdomains[1 - inc] = subdomains[inc]; - partpart[1 - inc] = partpart[inc]; - partcenter[1 - inc] = partcenter[inc]; - partshift[1 - inc] = partshift[inc]; - adjsubdomains[1 - inc] = adjsubdomains[inc]; - adjptr[1 - inc] = adjptr[inc]; - vnodes[1 - inc] = vnodes[inc]; - vnode_dim[1 - inc] = vnode_dim[inc]; - vnodeptr[1 - inc] = vnodeptr[inc]; - vedges[1 - inc] = vedges[inc]; - vedgeptr[1 - inc] = vedgeptr[inc]; - vnormptr[1 - inc] = vnormptr[inc]; - firstnumber[1 - inc] = firstnumber[inc]; - firstnumber[inc] = -1; -} - -void unload_inc(inc) -int inc; -{ - int i; - - current_image = NOTHING; - for (i = 0; i < IMAGE_TYPES; i++) { - loaded[inc][i] = 0; - firstnumber[inc] = -1; - } -} - -void showme_init() -{ - current_image = NOTHING; - current_inc = 0; - explosion = STARTEXPLOSION; - unload_inc(0); - unload_inc(1); -} - -char *readline(string, infile, infilename) -char *string; -FILE *infile; -char *infilename; -{ - char *result; - - do { - result = fgets(string, INPUTLINESIZE, infile); - if (result == (char *) NULL) { - printf(" Error: Unexpected end of file in %s.\n", - infilename); - exit(1); - } - while ((*result != '\0') && (*result != '#') - && (*result != '.') && (*result != '+') && (*result != '-') - && ((*result < '0') || (*result > '9'))) { - result++; - } - } while ((*result == '#') || (*result == '\0')); - return result; -} - -char *findfield(string) -char *string; -{ - char *result; - - result = string; - while ((*result != '\0') && (*result != '#') - && (*result != ' ') && (*result != '\t')) { - result++; - } - while ((*result != '\0') && (*result != '#') - && (*result != '.') && (*result != '+') && (*result != '-') - && ((*result < '0') || (*result > '9'))) { - result++; - } - if (*result == '#') { - *result = '\0'; - } - return result; -} - -int load_node(fname, firstnumber, nodes, dim, ptr, xmin, ymin, xmax, ymax) -char *fname; -int *firstnumber; -int *nodes; -int *dim; -REAL **ptr; -REAL *xmin; -REAL *ymin; -REAL *xmax; -REAL *ymax; -{ - FILE *infile; - char inputline[INPUTLINESIZE]; - char *stringptr; - int extras; - int nodemarks; - int index; - int nodenumber; - int i, j; - int smallerr; - REAL x, y; - - *xmin = *ymin = 0.0; - *xmax = *ymax = 1.0; - if (!quiet) { - printf("Opening %s.\n", fname); - } - infile = fopen(fname, "r"); - if (infile == (FILE *) NULL) { - printf(" Error: Cannot access file %s.\n", fname); - return 1; - } - stringptr = readline(inputline, infile, fname); - *nodes = (int) strtol (stringptr, &stringptr, 0); - if (*nodes < 3) { - printf(" Error: %s contains %d points.\n", fname, *nodes); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - *dim = 2; - } else { - *dim = (int) strtol (stringptr, &stringptr, 0); - } - if (*dim < 1) { - printf(" Error: %s has dimensionality %d.\n", fname, *dim); - return 1; - } - if (*dim != 2) { - printf(" I only understand two-dimensional meshes.\n"); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - extras = 0; - } else { - extras = (int) strtol (stringptr, &stringptr, 0); - } - if (extras < 0) { - printf(" Error: %s has negative value for number of attributes.\n", - fname); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - nodemarks = 0; - } else { - nodemarks = (int) strtol (stringptr, &stringptr, 0); - } - if (nodemarks < 0) { - printf(" Warning: %s has negative value for number of point markers.\n", - fname); - } - if (nodemarks > 1) { - printf( - " Warning: %s has value greater than one for number of point markers.\n", - fname); - } - *ptr = (REAL *) malloc((*nodes + 1) * *dim * sizeof(REAL)); - if (*ptr == (REAL *) NULL) { - printf(" Out of memory.\n"); - return 1; - } - index = *dim; - smallerr = 1; - for (i = 0; i < *nodes; i++) { - stringptr = readline(inputline, infile, fname); - nodenumber = (int) strtol (stringptr, &stringptr, 0); - if ((i == 0) && (*firstnumber == -1)) { - if (nodenumber == 0) { - *firstnumber = 0; - } else { - *firstnumber = 1; - } - } - if ((nodenumber != *firstnumber + i) && (smallerr)) { - printf(" Warning: Points in %s are not numbered correctly\n", fname); - printf(" (starting with point %d).\n", *firstnumber + i); - smallerr = 0; - } - for (j = 0; j < *dim; j++) { - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Point %d is missing a coordinate in %s.\n", - *firstnumber + i, fname); - free(*ptr); - return 1; - } - (*ptr)[index++] = (REAL) strtod(stringptr, &stringptr); - } - } - fclose(infile); - index = *dim; - *xmin = *xmax = (*ptr)[index]; - *ymin = *ymax = (*ptr)[index + 1]; - for (i = 2; i <= *nodes; i++) { - index += *dim; - x = (*ptr)[index]; - y = (*ptr)[index + 1]; - if (x < *xmin) { - *xmin = x; - } - if (y < *ymin) { - *ymin = y; - } - if (x > *xmax) { - *xmax = x; - } - if (y > *ymax) { - *ymax = y; - } - } - if (*xmin == *xmax) { - *xmin -= 0.5; - *xmax += 0.5; - } - if (*ymin == *ymax) { - *ymin -= 0.5; - *ymax += 0.5; - } - return 0; -} - -int load_poly(inc, fname, firstnumber, pnodes, dim, edges, holes, nodeptr, - edgeptr, holeptr, xmin, ymin, xmax, ymax) -int inc; -char *fname; -int *firstnumber; -int *pnodes; -int *dim; -int *edges; -int *holes; -REAL **nodeptr; -int **edgeptr; -REAL **holeptr; -REAL *xmin; -REAL *ymin; -REAL *xmax; -REAL *ymax; -{ - FILE *infile; - char inputline[INPUTLINESIZE]; - char *stringptr; - int extras; - int nodemarks; - int segmentmarks; - int index; - int nodenumber, edgenumber, holenumber; - int maxnode; - int i, j; - int smallerr; - REAL x, y; - - if (!quiet) { - printf("Opening %s.\n", fname); - } - infile = fopen(fname, "r"); - if (infile == (FILE *) NULL) { - printf(" Error: Cannot access file %s.\n", fname); - return 1; - } - stringptr = readline(inputline, infile, fname); - *pnodes = (int) strtol (stringptr, &stringptr, 0); - if (*pnodes == 0) { - if (!loaded[inc][NODE]) { - if (load_image(inc, NODE)) { - return 1; - } - } - maxnode = nodes[inc]; - *xmin = xlo[inc][NODE]; - *ymin = ylo[inc][NODE]; - *xmax = xhi[inc][NODE]; - *ymax = yhi[inc][NODE]; - } else { - if (*pnodes < 1) { - printf(" Error: %s contains %d points.\n", fname, *pnodes); - return 1; - } - maxnode = *pnodes; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - *dim = 2; - } else { - *dim = (int) strtol (stringptr, &stringptr, 0); - } - if (*dim < 1) { - printf(" Error: %s has dimensionality %d.\n", fname, *dim); - return 1; - } - if (*dim != 2) { - printf(" I only understand two-dimensional meshes.\n"); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - extras = 0; - } else { - extras = (int) strtol (stringptr, &stringptr, 0); - } - if (extras < 0) { - printf(" Error: %s has negative value for number of attributes.\n", - fname); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - nodemarks = 0; - } else { - nodemarks = (int) strtol (stringptr, &stringptr, 0); - } - if (nodemarks < 0) { - printf(" Warning: %s has negative value for number of point markers.\n", - fname); - } - if (nodemarks > 1) { - printf( - " Warning: %s has value greater than one for number of point markers.\n", - fname); - } - if (*pnodes > 0) { - *nodeptr = (REAL *) malloc((*pnodes + 1) * *dim * sizeof(REAL)); - if (*nodeptr == (REAL *) NULL) { - printf(" Out of memory.\n"); - return 1; - } - index = *dim; - smallerr = 1; - for (i = 0; i < *pnodes; i++) { - stringptr = readline(inputline, infile, fname); - nodenumber = (int) strtol (stringptr, &stringptr, 0); - if ((i == 0) && (*firstnumber == -1)) { - if (nodenumber == 0) { - *firstnumber = 0; - } else { - *firstnumber = 1; - } - } - if ((nodenumber != *firstnumber + i) && (smallerr)) { - printf(" Warning: Points in %s are not numbered correctly.\n", - fname); - printf(" (starting with point %d).\n", *firstnumber + i); - smallerr = 0; - } - for (j = 0; j < *dim; j++) { - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Point %d is missing a coordinate in %s.\n", - *firstnumber + i, fname); - free(*nodeptr); - return 1; - } - (*nodeptr)[index++] = (REAL) strtod(stringptr, &stringptr); - } - } - } - stringptr = readline(inputline, infile, fname); - *edges = (int) strtol (stringptr, &stringptr, 0); - if (*edges < 0) { - printf(" Error: %s contains %d segments.\n", fname, *edges); - free(*nodeptr); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - segmentmarks = 0; - } else { - segmentmarks = (int) strtol (stringptr, &stringptr, 0); - } - if (segmentmarks < 0) { - printf(" Error: %s has negative value for number of segment markers.\n", - fname); - free(*nodeptr); - return 1; - } - if (segmentmarks > 1) { - printf( - " Error: %s has value greater than one for number of segment markers.\n", - fname); - free(*nodeptr); - return 1; - } - *edgeptr = (int *) malloc(((*edges + 1) << 1) * sizeof(int)); - if (*edgeptr == (int *) NULL) { - printf(" Out of memory.\n"); - free(*nodeptr); - return 1; - } - index = 2; - smallerr = 1; - for (i = *firstnumber; i < *firstnumber + *edges; i++) { - stringptr = readline(inputline, infile, fname); - edgenumber = (int) strtol (stringptr, &stringptr, 0); - if ((edgenumber != i) && (smallerr)) { - printf(" Warning: Segments in %s are not numbered correctly.\n", - fname); - printf(" (starting with segment %d).\n", i); - smallerr = 0; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Segment %d is missing its endpoints in %s.\n", i, fname); - free(*nodeptr); - free(*edgeptr); - return 1; - } - (*edgeptr)[index] = (int) strtol (stringptr, &stringptr, 0) + 1 - - *firstnumber; - if (((*edgeptr)[index] < 1) || ((*edgeptr)[index] > maxnode)) { - printf("Error: Segment %d has invalid endpoint in %s.\n", i, fname); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Segment %d is missing an endpoint in %s.\n", i, fname); - free(*nodeptr); - free(*edgeptr); - return 1; - } - (*edgeptr)[index + 1] = (int) strtol (stringptr, &stringptr, 0) + 1 - - *firstnumber; - if (((*edgeptr)[index + 1] < 1) || ((*edgeptr)[index + 1] > maxnode)) { - printf("Error: Segment %d has invalid endpoint in %s.\n", i, fname); - return 1; - } - index += 2; - } - stringptr = readline(inputline, infile, fname); - *holes = (int) strtol (stringptr, &stringptr, 0); - if (*holes < 0) { - printf(" Error: %s contains %d holes.\n", fname, *holes); - free(*nodeptr); - free(*edgeptr); - return 1; - } - *holeptr = (REAL *) malloc((*holes + 1) * *dim * sizeof(REAL)); - if (*holeptr == (REAL *) NULL) { - printf(" Out of memory.\n"); - free(*nodeptr); - free(*edgeptr); - return 1; - } - index = *dim; - smallerr = 1; - for (i = *firstnumber; i < *firstnumber + *holes; i++) { - stringptr = readline(inputline, infile, fname); - holenumber = (int) strtol (stringptr, &stringptr, 0); - if ((holenumber != i) && (smallerr)) { - printf(" Warning: Holes in %s are not numbered correctly.\n", fname); - printf(" (starting with hole %d).\n", i); - smallerr = 0; - } - for (j = 0; j < *dim; j++) { - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Hole %d is missing a coordinate in %s.\n", i, - fname); - free(*nodeptr); - free(*edgeptr); - free(*holeptr); - return 1; - } - (*holeptr)[index++] = (REAL) strtod(stringptr, &stringptr); - } - } - fclose(infile); - if (*pnodes > 0) { - index = *dim; - *xmin = *xmax = (*nodeptr)[index]; - *ymin = *ymax = (*nodeptr)[index + 1]; - for (i = 2; i <= *pnodes; i++) { - index += *dim; - x = (*nodeptr)[index]; - y = (*nodeptr)[index + 1]; - if (x < *xmin) { - *xmin = x; - } - if (y < *ymin) { - *ymin = y; - } - if (x > *xmax) { - *xmax = x; - } - if (y > *ymax) { - *ymax = y; - } - } - } - index = *dim; - for (i = 1; i <= *holes; i++) { - x = (*holeptr)[index]; - y = (*holeptr)[index + 1]; - if (x < *xmin) { - *xmin = x; - } - if (y < *ymin) { - *ymin = y; - } - if (x > *xmax) { - *xmax = x; - } - if (y > *ymax) { - *ymax = y; - } - index += *dim; - } - return 0; -} - -int load_ele(fname, firstnumber, nodes, elems, corners, ptr) -char *fname; -int firstnumber; -int nodes; -int *elems; -int *corners; -int **ptr; -{ - FILE *infile; - char inputline[INPUTLINESIZE]; - char *stringptr; - int extras; - int index; - int elemnumber; - int i, j; - int smallerr; - - if (!quiet) { - printf("Opening %s.\n", fname); - } - infile = fopen(fname, "r"); - if (infile == (FILE *) NULL) { - printf(" Error: Cannot access file %s.\n", fname); - return 1; - } - stringptr = readline(inputline, infile, fname); - *elems = (int) strtol (stringptr, &stringptr, 0); - if (*elems < 1) { - printf(" Error: %s contains %d triangles.\n", fname, *elems); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - *corners = 3; - } else { - *corners = (int) strtol (stringptr, &stringptr, 0); - } - if (*corners < 3) { - printf(" Error: Triangles in %s have only %d corners.\n", fname, - *corners); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - extras = 0; - } else { - extras = (int) strtol (stringptr, &stringptr, 0); - } - if (extras < 0) { - printf(" Error: %s has negative value for extra fields.\n", fname); - return 1; - } - *ptr = (int *) malloc((*elems + 1) * 3 * sizeof(int)); - if (*ptr == (int *) NULL) { - printf(" Out of memory.\n"); - return 1; - } - index = 3; - smallerr = 1; - for (i = firstnumber; i < firstnumber + *elems; i++) { - stringptr = readline(inputline, infile, fname); - elemnumber = (int) strtol (stringptr, &stringptr, 0); - if ((elemnumber != i) && (smallerr)) { - printf(" Warning: Triangles in %s are not numbered correctly.\n", - fname); - printf(" (starting with triangle %d).\n", i); - smallerr = 0; - } - for (j = 0; j < 3; j++) { - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Triangle %d is missing a corner in %s.\n", i, fname); - free(*ptr); - return 1; - } - (*ptr)[index] = (int) strtol (stringptr, &stringptr, 0) + 1 - - firstnumber; - if (((*ptr)[index] < 1) || ((*ptr)[index] > nodes)) { - printf("Error: Triangle %d has invalid corner in %s.\n", i, fname); - return 1; - } - index++; - } - } - fclose(infile); - return 0; -} - -int load_edge(fname, firstnumber, nodes, edges, edgeptr, normptr) -char *fname; -int firstnumber; -int nodes; -int *edges; -int **edgeptr; -REAL **normptr; -{ - FILE *infile; - char inputline[INPUTLINESIZE]; - char *stringptr; - int index; - int edgenumber; - int edgemarks; - int i; - int smallerr; - - if (!quiet) { - printf("Opening %s.\n", fname); - } - infile = fopen(fname, "r"); - if (infile == (FILE *) NULL) { - printf(" Error: Cannot access file %s.\n", fname); - return 1; - } - stringptr = readline(inputline, infile, fname); - *edges = (int) strtol (stringptr, &stringptr, 0); - if (*edges < 1) { - printf(" Error: %s contains %d edges.\n", fname, *edges); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - edgemarks = 0; - } else { - edgemarks = (int) strtol (stringptr, &stringptr, 0); - } - if (edgemarks < 0) { - printf(" Error: %s has negative value for number of edge markers.\n", - fname); - return 1; - } - if (edgemarks > 1) { - printf( - " Error: %s has value greater than one for number of edge markers.\n", - fname); - return 1; - } - *edgeptr = (int *) malloc(((*edges + 1) << 1) * sizeof(int)); - if (*edgeptr == (int *) NULL) { - printf(" Out of memory.\n"); - return 1; - } - *normptr = (REAL *) malloc(((*edges + 1) << 1) * sizeof(REAL)); - if (*normptr == (REAL *) NULL) { - printf(" Out of memory.\n"); - free(*edgeptr); - return 1; - } - index = 2; - smallerr = 1; - for (i = firstnumber; i < firstnumber + *edges; i++) { - stringptr = readline(inputline, infile, fname); - edgenumber = (int) strtol (stringptr, &stringptr, 0); - if ((edgenumber != i) && (smallerr)) { - printf(" Warning: Edges in %s are not numbered correctly.\n", fname); - printf(" (starting with edge %d).\n", i); - smallerr = 0; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Edge %d is missing its endpoints in %s.\n", i, fname); - free(*edgeptr); - free(*normptr); - return 1; - } - (*edgeptr)[index] = (int) strtol (stringptr, &stringptr, 0) + 1 - - firstnumber; - if (((*edgeptr)[index] < 1) || ((*edgeptr)[index] > nodes)) { - printf("Error: Edge %d has invalid endpoint in %s.\n", i, fname); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Edge %d is missing an endpoint in %s.\n", i, fname); - free(*edgeptr); - free(*normptr); - return 1; - } - (*edgeptr)[index + 1] = (int) strtol (stringptr, &stringptr, 0); - if ((*edgeptr)[index + 1] == -1) { - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Edge %d is missing its direction in %s.\n", i, fname); - free(*edgeptr); - free(*normptr); - return 1; - } - (*normptr)[index] = (REAL) strtod(stringptr, &stringptr); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Edge %d is missing a direction coordinate in %s.\n", - i, fname); - free(*edgeptr); - free(*normptr); - return 1; - } - (*normptr)[index + 1] = (REAL) strtod(stringptr, &stringptr); - } else { - (*edgeptr)[index + 1] += 1 - firstnumber; - if (((*edgeptr)[index + 1] < 1) || ((*edgeptr)[index + 1] > nodes)) { - printf("Error: Edge %d has invalid endpoint in %s.\n", i, fname); - return 1; - } - } - index += 2; - } - fclose(infile); - return 0; -} - -int load_part(fname, dim, firstnumber, elems, nodeptr, eleptr, parts, - partition, partcenter, partshift) -char *fname; -int dim; -int firstnumber; -int elems; -REAL *nodeptr; -int *eleptr; -int *parts; -int **partition; -REAL **partcenter; -REAL **partshift; -{ - FILE *infile; - char inputline[INPUTLINESIZE]; - char *stringptr; - int partelems; - int index; - int elemnumber; - int i, j; - int smallerr; - int *partsize; - - if (!quiet) { - printf("Opening %s.\n", fname); - } - infile = fopen(fname, "r"); - if (infile == (FILE *) NULL) { - printf(" Error: Cannot access file %s.\n", fname); - return 1; - } - stringptr = readline(inputline, infile, fname); - partelems = (int) strtol (stringptr, &stringptr, 0); - if (partelems != elems) { - printf( - " Error: .ele and .part files do not agree on number of triangles.\n"); - return 1; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - *parts = 1; - } else { - *parts = (int) strtol (stringptr, &stringptr, 0); - } - if (*parts < 1) { - printf(" Error: %s specifies %d subdomains.\n", fname, *parts); - return 1; - } - *partition = (int *) malloc((elems + 1) * sizeof(int)); - if (*partition == (int *) NULL) { - printf(" Out of memory.\n"); - return 1; - } - smallerr = 1; - for (i = firstnumber; i < firstnumber + partelems; i++) { - stringptr = readline(inputline, infile, fname); - elemnumber = (int) strtol (stringptr, &stringptr, 0); - if ((elemnumber != i) && (smallerr)) { - printf(" Warning: Triangles in %s are not numbered correctly.\n", - fname); - printf(" (starting with triangle %d).\n", i); - smallerr = 0; - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Triangle %d has no subdomain in %s.\n", i, fname); - free(*partition); - return 1; - } - (*partition)[i] = (int) strtol (stringptr, &stringptr, 0) - firstnumber; - if (((*partition)[i] >= *parts) || ((*partition)[i] < 0)) { - printf(" Error: Triangle %d of %s has an invalid subdomain.\n", - i, fname); - free(*partition); - return 1; - } - } - fclose(infile); - *partcenter = (REAL *) malloc(((*parts + 1) << 1) * sizeof(REAL)); - if (*partcenter == (REAL *) NULL) { - printf("Error: Out of memory.\n"); - free(*partition); - return 1; - } - *partshift = (REAL *) malloc((*parts << 1) * sizeof(REAL)); - if (*partshift == (REAL *) NULL) { - printf("Error: Out of memory.\n"); - free(*partition); - free(*partcenter); - return 1; - } - partsize = (int *) malloc((*parts + 1) * sizeof(int)); - if (partsize == (int *) NULL) { - printf("Error: Out of memory.\n"); - free(*partition); - free(*partcenter); - free(*partshift); - return 1; - } - index = 3; - for (i = 0; i <= *parts; i++) { - partsize[i] = 0; - (*partcenter)[i << 1] = 0.0; - (*partcenter)[(i << 1) + 1] = 0.0; - } - for (i = 1; i <= elems; i++) { - partsize[(*partition)[i]] += 3; - for (j = 0; j < 3; j++) { - (*partcenter)[(*partition)[i] << 1] += - nodeptr[eleptr[index] * dim]; - (*partcenter)[((*partition)[i] << 1) + 1] += - nodeptr[eleptr[index++] * dim + 1]; - } - } - for (i = 0; i < *parts; i++) { - (*partcenter)[i << 1] /= (REAL) partsize[i]; - (*partcenter)[(i << 1) + 1] /= (REAL) partsize[i]; - (*partcenter)[*parts << 1] += (*partcenter)[i << 1]; - (*partcenter)[(*parts << 1) + 1] += (*partcenter)[(i << 1) + 1]; - } - (*partcenter)[*parts << 1] /= (REAL) *parts; - (*partcenter)[(*parts << 1) + 1] /= (REAL) *parts; - free(partsize); - return 0; -} - -int load_adj(fname, subdomains, ptr) -char *fname; -int *subdomains; -int **ptr; -{ - FILE *infile; - char inputline[INPUTLINESIZE]; - char *stringptr; - int i, j; - - if (!quiet) { - printf("Opening %s.\n", fname); - } - infile = fopen(fname, "r"); - if (infile == (FILE *) NULL) { - printf(" Error: Cannot access file %s.\n", fname); - return 1; - } - stringptr = readline(inputline, infile, fname); - *subdomains = (int) strtol (stringptr, &stringptr, 0); - if (*subdomains < 1) { - printf(" Error: %s contains %d subdomains.\n", fname, *subdomains); - return 1; - } - *ptr = (int *) malloc(*subdomains * *subdomains * sizeof(int)); - if (*ptr == (int *) NULL) { - printf(" Out of memory.\n"); - return 1; - } - for (i = 0; i < *subdomains; i++) { - for (j = 0; j < *subdomains; j++) { - stringptr = readline(inputline, infile, fname); - (*ptr)[i * *subdomains + j] = (int) strtol (stringptr, &stringptr, 0); - } - } - return 0; -} - -void findpartshift(parts, explosion, partcenter, partshift) -int parts; -REAL explosion; -REAL *partcenter; -REAL *partshift; -{ - int i; - - for (i = 0; i < parts; i++) { - partshift[i << 1] = explosion * - (partcenter[i << 1] - partcenter[parts << 1]); - partshift[(i << 1) + 1] = explosion * - (partcenter[(i << 1) + 1] - partcenter[(parts << 1) + 1]); - } -} - -int load_image(inc, image) -int inc; -int image; -{ - int error; - - switch (image) { - case NODE: - error = load_node(nodefilename[inc], &firstnumber[inc], &nodes[inc], - &node_dim[inc], &nodeptr[inc], &xlo[inc][NODE], - &ylo[inc][NODE], &xhi[inc][NODE], &yhi[inc][NODE]); - break; - case POLY: - error = load_poly(inc, polyfilename[inc], &firstnumber[inc], - &polynodes[inc], &poly_dim[inc], &polyedges[inc], - &polyholes[inc], &polynodeptr[inc], &polyedgeptr[inc], - &polyholeptr[inc], - &xlo[inc][POLY], &ylo[inc][POLY], - &xhi[inc][POLY], &yhi[inc][POLY]); - break; - case ELE: - error = load_ele(elefilename[inc], firstnumber[inc], nodes[inc], - &elems[inc], &ele_corners[inc], &eleptr[inc]); - xlo[inc][ELE] = xlo[inc][NODE]; - ylo[inc][ELE] = ylo[inc][NODE]; - xhi[inc][ELE] = xhi[inc][NODE]; - yhi[inc][ELE] = yhi[inc][NODE]; - break; - case EDGE: - error = load_edge(edgefilename[inc], firstnumber[inc], nodes[inc], - &edges[inc], &edgeptr[inc], &normptr[inc]); - xlo[inc][EDGE] = xlo[inc][NODE]; - ylo[inc][EDGE] = ylo[inc][NODE]; - xhi[inc][EDGE] = xhi[inc][NODE]; - yhi[inc][EDGE] = yhi[inc][NODE]; - break; - case PART: - error = load_part(partfilename[inc], node_dim[inc], firstnumber[inc], - elems[inc], nodeptr[inc], eleptr[inc], - &subdomains[inc], &partpart[inc], &partcenter[inc], - &partshift[inc]); - if (!error) { - findpartshift(subdomains[inc], explosion, partcenter[inc], - partshift[inc]); - } - xlo[inc][PART] = xlo[inc][NODE]; - ylo[inc][PART] = ylo[inc][NODE]; - xhi[inc][PART] = xhi[inc][NODE]; - yhi[inc][PART] = yhi[inc][NODE]; - break; - case ADJ: - error = load_adj(adjfilename[inc], &adjsubdomains[inc], &adjptr[inc]); - xlo[inc][ADJ] = xlo[inc][NODE]; - ylo[inc][ADJ] = ylo[inc][NODE]; - xhi[inc][ADJ] = xhi[inc][NODE]; - yhi[inc][ADJ] = yhi[inc][NODE]; - break; - case VORO: - error = load_node(vnodefilename[inc], &firstnumber[inc], &vnodes[inc], - &vnode_dim[inc], &vnodeptr[inc], &xlo[inc][VORO], - &ylo[inc][VORO], &xhi[inc][VORO], &yhi[inc][VORO]); - if (!error) { - error = load_edge(vedgefilename[inc], firstnumber[inc], vnodes[inc], - &vedges[inc], &vedgeptr[inc], &vnormptr[inc]); - } - break; - default: - error = 1; - } - if (!error) { - loaded[inc][image] = 1; - } - return error; -} - -void choose_image(inc, image) -int inc; -int image; -{ - if (!loaded[inc][image]) { - if ((image == ELE) || (image == EDGE) || (image == PART) - || (image == ADJ)) { - if (!loaded[inc][NODE]) { - if (load_image(inc, NODE)) { - return; - } - } - } - if ((image == PART) || (image == ADJ)) { - if (!loaded[inc][ELE]) { - if (load_image(inc, ELE)) { - return; - } - } - } - if (image == ADJ) { - if (!loaded[inc][PART]) { - if (load_image(inc, PART)) { - return; - } - } - } - if (load_image(inc, image)) { - return; - } - } - current_inc = inc; - current_image = image; -} - -Window make_button(name, x, y, width) -char *name; -int x; -int y; -int width; -{ - XSetWindowAttributes attr; - XSizeHints hints; - Window button; - - attr.background_pixel = black; - attr.border_pixel = white; - attr.backing_store = NotUseful; - attr.event_mask = ExposureMask | ButtonReleaseMask | ButtonPressMask; - attr.bit_gravity = SouthWestGravity; - attr.win_gravity = SouthWestGravity; - attr.save_under = False; - button = XCreateWindow(display, mainwindow, x, y, width, BUTTONHEIGHT - 4, - 2, 0, InputOutput, CopyFromParent, - CWBackPixel | CWBorderPixel | CWEventMask | - CWBitGravity | CWWinGravity | CWBackingStore | - CWSaveUnder, &attr); - hints.width = width; - hints.height = BUTTONHEIGHT - 4; - hints.min_width = 0; - hints.min_height = BUTTONHEIGHT - 4; - hints.max_width = width; - hints.max_height = BUTTONHEIGHT - 4; - hints.width_inc = 1; - hints.height_inc = 1; - hints.flags = PMinSize | PMaxSize | PSize | PResizeInc; - XSetStandardProperties(display, button, name, "showme", None, (char **) NULL, - 0, &hints); - return button; -} - -void make_buttons(y) -int y; -{ - int i; - - for (i = 1; i >= 0; i--) { - nodewin[i] = make_button("node", 0, y + (1 - i) * BUTTONHEIGHT, 42); - XMapWindow(display, nodewin[i]); - polywin[i] = make_button("poly", 44, y + (1 - i) * BUTTONHEIGHT, 42); - XMapWindow(display, polywin[i]); - elewin[i] = make_button("ele", 88, y + (1 - i) * BUTTONHEIGHT, 33); - XMapWindow(display, elewin[i]); - edgewin[i] = make_button("edge", 123, y + (1 - i) * BUTTONHEIGHT, 42); - XMapWindow(display, edgewin[i]); - partwin[i] = make_button("part", 167, y + (1 - i) * BUTTONHEIGHT, 42); - XMapWindow(display, partwin[i]); - adjwin[i] = make_button("adj", 211, y + (1 - i) * BUTTONHEIGHT, 33); - XMapWindow(display, adjwin[i]); - voronoiwin[i] = make_button("voro", 246, y + (1 - i) * BUTTONHEIGHT, 42); - XMapWindow(display, voronoiwin[i]); - } - versionpluswin = make_button(" +", 290, y, 52); - XMapWindow(display, versionpluswin); - versionminuswin = make_button(" -", 290, y + BUTTONHEIGHT, 52); - XMapWindow(display, versionminuswin); - - quitwin = make_button("Quit", 0, y + 2 * BUTTONHEIGHT, 42); - XMapWindow(display, quitwin); - leftwin = make_button("<", 44, y + 2 * BUTTONHEIGHT, 14); - XMapWindow(display, leftwin); - rightwin = make_button(">", 60, y + 2 * BUTTONHEIGHT, 14); - XMapWindow(display, rightwin); - upwin = make_button("^", 76, y + 2 * BUTTONHEIGHT, 14); - XMapWindow(display, upwin); - downwin = make_button("v", 92, y + 2 * BUTTONHEIGHT, 14); - XMapWindow(display, downwin); - resetwin = make_button("Reset", 108, y + 2 * BUTTONHEIGHT, 52); - XMapWindow(display, resetwin); - widthpluswin = make_button("Width+", 162, y + 2 * BUTTONHEIGHT, 61); - XMapWindow(display, widthpluswin); - widthminuswin = make_button("-", 225, y + 2 * BUTTONHEIGHT, 14); - XMapWindow(display, widthminuswin); - expwin = make_button("Exp", 241, y + 2 * BUTTONHEIGHT, 33); - XMapWindow(display, expwin); - exppluswin = make_button("+", 276, y + 2 * BUTTONHEIGHT, 14); - XMapWindow(display, exppluswin); - expminuswin = make_button("-", 292, y + 2 * BUTTONHEIGHT, 14); - XMapWindow(display, expminuswin); - fillwin = make_button("Fill", 308, y + 2 * BUTTONHEIGHT, 41); - XMapWindow(display, fillwin); - pswin = make_button("PS", 351, y + 2 * BUTTONHEIGHT, 24); - XMapWindow(display, pswin); - epswin = make_button("EPS", 377, y + 2 * BUTTONHEIGHT, 33); - XMapWindow(display, epswin); -} - -void fill_button(button) -Window button; -{ - int x, y; - unsigned int w, h, d, b; - Window rootw; - - XGetGeometry(display, button, &rootw, &x, &y, &w, &h, &d, &b); - XFillRectangle(display, button, fontgc, 0, 0, w, h); -} - -void draw_buttons() -{ - char numberstring[32]; - char buttonstring[6]; - int i; - - for (i = 1; i >= 0; i--) { - if ((current_image == NODE) && (current_inc == i)) { - fill_button(nodewin[i]); - XDrawString(display, nodewin[i], blackfontgc, 2, 13, "node", 4); - } else { - XClearWindow(display, nodewin[i]); - XDrawString(display, nodewin[i], fontgc, 2, 13, "node", 4); - } - if ((current_image == POLY) && (current_inc == i)) { - fill_button(polywin[i]); - XDrawString(display, polywin[i], blackfontgc, 2, 13, "poly", 4); - } else { - XClearWindow(display, polywin[i]); - XDrawString(display, polywin[i], fontgc, 2, 13, "poly", 4); - } - if ((current_image == ELE) && (current_inc == i)) { - fill_button(elewin[i]); - XDrawString(display, elewin[i], blackfontgc, 2, 13, "ele", 3); - } else { - XClearWindow(display, elewin[i]); - XDrawString(display, elewin[i], fontgc, 2, 13, "ele", 3); - } - if ((current_image == EDGE) && (current_inc == i)) { - fill_button(edgewin[i]); - XDrawString(display, edgewin[i], blackfontgc, 2, 13, "edge", 4); - } else { - XClearWindow(display, edgewin[i]); - XDrawString(display, edgewin[i], fontgc, 2, 13, "edge", 4); - } - if ((current_image == PART) && (current_inc == i)) { - fill_button(partwin[i]); - XDrawString(display, partwin[i], blackfontgc, 2, 13, "part", 4); - } else { - XClearWindow(display, partwin[i]); - XDrawString(display, partwin[i], fontgc, 2, 13, "part", 4); - } - if ((current_image == ADJ) && (current_inc == i)) { - fill_button(adjwin[i]); - XDrawString(display, adjwin[i], blackfontgc, 2, 13, "adj", 3); - } else { - XClearWindow(display, adjwin[i]); - XDrawString(display, adjwin[i], fontgc, 2, 13, "adj", 3); - } - if ((current_image == VORO) && (current_inc == i)) { - fill_button(voronoiwin[i]); - XDrawString(display, voronoiwin[i], blackfontgc, 2, 13, "voro", 4); - } else { - XClearWindow(display, voronoiwin[i]); - XDrawString(display, voronoiwin[i], fontgc, 2, 13, "voro", 4); - } - } - - XClearWindow(display, versionpluswin); - sprintf(numberstring, "%d", loweriteration + 1); - sprintf(buttonstring, "%-4.4s+", numberstring); - XDrawString(display, versionpluswin, fontgc, 2, 13, buttonstring, 5); - XClearWindow(display, versionminuswin); - sprintf(numberstring, "%d", loweriteration); - if (loweriteration == 0) { - sprintf(buttonstring, "%-4.4s", numberstring); - } else { - sprintf(buttonstring, "%-4.4s-", numberstring); - } - XDrawString(display, versionminuswin, fontgc, 2, 13, buttonstring, 5); - - XClearWindow(display, quitwin); - XDrawString(display, quitwin, fontgc, 2, 13, "Quit", 4); - XClearWindow(display, leftwin); - XDrawString(display, leftwin, fontgc, 2, 13, "<", 1); - XClearWindow(display, rightwin); - XDrawString(display, rightwin, fontgc, 2, 13, ">", 1); - XClearWindow(display, upwin); - XDrawString(display, upwin, fontgc, 2, 13, "^", 1); - XClearWindow(display, downwin); - XDrawString(display, downwin, fontgc, 2, 13, "v", 1); - XClearWindow(display, resetwin); - XDrawString(display, resetwin, fontgc, 2, 13, "Reset", 6); - XClearWindow(display, widthpluswin); - if (line_width < 100) { - XDrawString(display, widthpluswin, fontgc, 2, 13, "Width+", 6); - } else { - XDrawString(display, widthpluswin, fontgc, 2, 13, "Width ", 6); - } - XClearWindow(display, widthminuswin); - if (line_width > 1) { - XDrawString(display, widthminuswin, fontgc, 2, 13, "-", 1); - } - XClearWindow(display, expwin); - XClearWindow(display, exppluswin); - XClearWindow(display, expminuswin); - XClearWindow(display, fillwin); - if (current_image == PART) { - if (explode) { - fill_button(expwin); - XDrawString(display, expwin, blackfontgc, 2, 13, "Exp", 3); - } else { - XDrawString(display, expwin, fontgc, 2, 13, "Exp", 3); - } - XDrawString(display, exppluswin, fontgc, 2, 13, "+", 1); - XDrawString(display, expminuswin, fontgc, 2, 13, "-", 1); - if (fillelem) { - fill_button(fillwin); - XDrawString(display, fillwin, blackfontgc, 2, 13, "Fill", 4); - } else { - XDrawString(display, fillwin, fontgc, 2, 13, "Fill", 4); - } - } - XClearWindow(display, pswin); - XDrawString(display, pswin, fontgc, 2, 13, "PS", 2); - XClearWindow(display, epswin); - XDrawString(display, epswin, fontgc, 2, 13, "EPS", 3); -} - -void showme_window(argc, argv) -int argc; -char **argv; -{ - XSetWindowAttributes attr; - XSizeHints hints; - XGCValues fontvalues, linevalues; - XColor alloc_color, exact_color; - int i; - - display = XOpenDisplay((char *) NULL); - if (!display) { - printf("Error: Cannot open display.\n"); - exit(1); - } - screen = DefaultScreen(display); - rootwindow = DefaultRootWindow(display); - black = BlackPixel(display, screen); - white = WhitePixel(display, screen); - windowdepth = DefaultDepth(display, screen); - rootmap = DefaultColormap(display, screen); - width = STARTWIDTH; - height = STARTHEIGHT; - attr.background_pixel = black; - attr.border_pixel = white; - attr.backing_store = NotUseful; - attr.event_mask = ExposureMask | ButtonReleaseMask | ButtonPressMask | - StructureNotifyMask; - attr.bit_gravity = NorthWestGravity; - attr.win_gravity = NorthWestGravity; - attr.save_under = False; - mainwindow = XCreateWindow(display, rootwindow, 0, 0, width, - height + PANELHEIGHT, 3, 0, - InputOutput, CopyFromParent, - CWBackPixel | CWBorderPixel | CWEventMask | - CWBitGravity | CWWinGravity | CWBackingStore | - CWSaveUnder, &attr); - hints.width = width; - hints.height = height + PANELHEIGHT; - hints.min_width = MINWIDTH; - hints.min_height = MINHEIGHT + PANELHEIGHT; - hints.width_inc = 1; - hints.height_inc = 1; - hints.flags = PMinSize | PSize | PResizeInc; - XSetStandardProperties(display, mainwindow, "Show Me", "showme", None, - argv, argc, &hints); - XChangeProperty(display, mainwindow, XA_WM_CLASS, XA_STRING, 8, - PropModeReplace, "showme\0Archimedes", 18); - XClearWindow(display, mainwindow); - XMapWindow(display, mainwindow); - if ((windowdepth > 1) && - XAllocNamedColor(display, rootmap, "yellow", &alloc_color, - &exact_color)) { - color = 1; - explode = bw_ps; - fontvalues.foreground = alloc_color.pixel; - linevalues.foreground = alloc_color.pixel; - showme_foreground = alloc_color.pixel; - for (i = 0; i < 64; i++) { - if (XAllocNamedColor(display, rootmap, colorname[i], &alloc_color, - &rgb[i])) { - colors[i] = alloc_color.pixel; - } else { - colors[i] = white; - rgb[i].red = alloc_color.red; - rgb[i].green = alloc_color.green; - rgb[i].blue = alloc_color.blue; - if (!quiet) { - printf("Warning: I could not allocate %s.\n", colorname[i]); - } - } - } - } else { - color = 0; - fillelem = 0; - explode = 1; - fontvalues.foreground = white; - linevalues.foreground = white; - showme_foreground = white; - } - font = XLoadQueryFont(display, "9x15"); - fontvalues.background = black; - fontvalues.font = font->fid; - fontvalues.fill_style = FillSolid; - fontvalues.line_width = 2; - fontgc = XCreateGC(display, rootwindow, GCForeground | GCBackground | - GCFont | GCLineWidth | GCFillStyle, &fontvalues); - fontvalues.foreground = black; - blackfontgc = XCreateGC(display, rootwindow, GCForeground | GCBackground | - GCFont | GCLineWidth | GCFillStyle, &fontvalues); - linevalues.background = black; - linevalues.line_width = line_width; - linevalues.cap_style = CapRound; - linevalues.join_style = JoinRound; - linevalues.fill_style = FillSolid; - linegc = XCreateGC(display, rootwindow, GCForeground | GCBackground | - GCLineWidth | GCCapStyle | GCJoinStyle | GCFillStyle, - &linevalues); - trianglegc = XCreateGC(display, rootwindow, GCForeground | GCBackground | - GCLineWidth | GCCapStyle | GCJoinStyle | GCFillStyle, - &linevalues); - make_buttons(height); - XFlush(display); -} - -void draw_node(nodes, dim, ptr, xscale, yscale, xoffset, yoffset) -int nodes; -int dim; -REAL *ptr; -REAL xscale; -REAL yscale; -REAL xoffset; -REAL yoffset; -{ - int i; - int index; - - index = dim; - for (i = 1; i <= nodes; i++) { - XFillRectangle(display, mainwindow, linegc, - (int) (ptr[index] * xscale + xoffset) - (line_width >> 1), - (int) (ptr[index + 1] * yscale + yoffset) - - (line_width >> 1), line_width, line_width); - index += dim; - } -} - -void draw_poly(nodes, dim, edges, holes, nodeptr, edgeptr, holeptr, - xscale, yscale, xoffset, yoffset) -int nodes; -int dim; -int edges; -int holes; -REAL *nodeptr; -int *edgeptr; -REAL *holeptr; -REAL xscale; -REAL yscale; -REAL xoffset; -REAL yoffset; -{ - int i; - int index; - REAL *point1, *point2; - int x1, y1, x2, y2; - - index = dim; - for (i = 1; i <= nodes; i++) { - XFillRectangle(display, mainwindow, linegc, - (int) (nodeptr[index] * xscale + xoffset) - - (line_width >> 1), - (int) (nodeptr[index + 1] * yscale + yoffset) - - (line_width >> 1), line_width, line_width); - index += dim; - } - index = 2; - for (i = 1; i <= edges; i++) { - point1 = &nodeptr[edgeptr[index++] * dim]; - point2 = &nodeptr[edgeptr[index++] * dim]; - XDrawLine(display, mainwindow, linegc, - (int) (point1[0] * xscale + xoffset), - (int) (point1[1] * yscale + yoffset), - (int) (point2[0] * xscale + xoffset), - (int) (point2[1] * yscale + yoffset)); - } - index = dim; - if (color) { - XSetForeground(display, linegc, colors[0]); - } - for (i = 1; i <= holes; i++) { - x1 = (int) (holeptr[index] * xscale + xoffset) - 3; - y1 = (int) (holeptr[index + 1] * yscale + yoffset) - 3; - x2 = x1 + 6; - y2 = y1 + 6; - XDrawLine(display, mainwindow, linegc, x1, y1, x2, y2); - XDrawLine(display, mainwindow, linegc, x1, y2, x2, y1); - index += dim; - } - XSetForeground(display, linegc, showme_foreground); -} - -void draw_ele(inc, elems, corners, ptr, partition, shift, - xscale, yscale, xoffset, yoffset) -int inc; -int elems; -int corners; -int *ptr; -int *partition; -REAL *shift; -REAL xscale; -REAL yscale; -REAL xoffset; -REAL yoffset; -{ - int i, j; - int index; - REAL shiftx, shifty; - REAL *prevpoint, *nowpoint; - XPoint *vertices; - - if (color && fillelem && (partition != (int *) NULL)) { - vertices = (XPoint *) malloc(3 * sizeof(XPoint)); - if (vertices == (XPoint *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - index = 3; - for (i = 1; i <= elems; i++) { - if ((partition != (int *) NULL) && explode) { - shiftx = shift[partition[i] << 1]; - shifty = shift[(partition[i] << 1) + 1]; - } - if (color && (partition != (int *) NULL)) { - if (fillelem) { - XSetForeground(display, trianglegc, colors[partition[i] & 63]); - } else { - XSetForeground(display, linegc, colors[partition[i] & 63]); - } - } - if (color && fillelem && (partition != (int *) NULL)) { - if ((partition != (int *) NULL) && explode) { - for (j = 0; j < 3; j++) { - nowpoint = &nodeptr[inc][ptr[index + j] * node_dim[inc]]; - vertices[j].x = (nowpoint[0] + shiftx) * xscale + xoffset; - vertices[j].y = (nowpoint[1] + shifty) * yscale + yoffset; - } - } else { - for (j = 0; j < 3; j++) { - nowpoint = &nodeptr[inc][ptr[index + j] * node_dim[inc]]; - vertices[j].x = nowpoint[0] * xscale + xoffset; - vertices[j].y = nowpoint[1] * yscale + yoffset; - } - } - XFillPolygon(display, mainwindow, trianglegc, vertices, 3, - Convex, CoordModeOrigin); - } - prevpoint = &nodeptr[inc][ptr[index + 2] * node_dim[inc]]; - if ((partition != (int *) NULL) && explode) { - for (j = 0; j < 3; j++) { - nowpoint = &nodeptr[inc][ptr[index++] * node_dim[inc]]; - XDrawLine(display, mainwindow, linegc, - (int) ((prevpoint[0] + shiftx) * xscale + xoffset), - (int) ((prevpoint[1] + shifty) * yscale + yoffset), - (int) ((nowpoint[0] + shiftx) * xscale + xoffset), - (int) ((nowpoint[1] + shifty) * yscale + yoffset)); - prevpoint = nowpoint; - } - } else { - for (j = 0; j < 3; j++) { - nowpoint = &nodeptr[inc][ptr[index++] * node_dim[inc]]; - XDrawLine(display, mainwindow, linegc, - (int) (prevpoint[0] * xscale + xoffset), - (int) (prevpoint[1] * yscale + yoffset), - (int) (nowpoint[0] * xscale + xoffset), - (int) (nowpoint[1] * yscale + yoffset)); - prevpoint = nowpoint; - } - } - } - if (color && fillelem && (partition != (int *) NULL)) { - free(vertices); - } - XSetForeground(display, linegc, showme_foreground); -} - -void draw_edge(nodes, dim, edges, nodeptr, edgeptr, normptr, - xscale, yscale, xoffset, yoffset) -int nodes; -int dim; -int edges; -REAL *nodeptr; -int *edgeptr; -REAL *normptr; -REAL xscale; -REAL yscale; -REAL xoffset; -REAL yoffset; -{ - int i; - int index; - REAL *point1, *point2; - REAL normx, normy; - REAL normmult, normmultx, normmulty; - REAL windowxmin, windowymin, windowxmax, windowymax; - - index = 2; - for (i = 1; i <= edges; i++) { - point1 = &nodeptr[edgeptr[index++] * dim]; - if (edgeptr[index] == -1) { - normx = normptr[index - 1]; - normy = normptr[index++]; - normmultx = 0.0; - if (normx > 0) { - windowxmax = (width - 1 - xoffset) / xscale; - normmultx = (windowxmax - point1[0]) / normx; - } else if (normx < 0) { - windowxmin = -xoffset / xscale; - normmultx = (windowxmin - point1[0]) / normx; - } - normmulty = 0.0; - if (normy > 0) { - windowymax = -yoffset / yscale; - normmulty = (windowymax - point1[1]) / normy; - } else if (normy < 0) { - windowymin = (height - 1 - yoffset) / yscale; - normmulty = (windowymin - point1[1]) / normy; - } - if (normmultx == 0.0) { - normmult = normmulty; - } else if (normmulty == 0.0) { - normmult = normmultx; - } else if (normmultx < normmulty) { - normmult = normmultx; - } else { - normmult = normmulty; - } - if (normmult > 0.0) { - XDrawLine(display, mainwindow, linegc, - (int) (point1[0] * xscale + xoffset), - (int) (point1[1] * yscale + yoffset), - (int) ((point1[0] + normmult * normx) * xscale + xoffset), - (int) ((point1[1] + normmult * normy) * yscale + yoffset)); - } - } else { - point2 = &nodeptr[edgeptr[index++] * dim]; - XDrawLine(display, mainwindow, linegc, - (int) (point1[0] * xscale + xoffset), - (int) (point1[1] * yscale + yoffset), - (int) (point2[0] * xscale + xoffset), - (int) (point2[1] * yscale + yoffset)); - } - } -} - -void draw_adj(dim, subdomains, ptr, center, xscale, yscale, - xoffset, yoffset) -int dim; -int subdomains; -int *ptr; -REAL *center; -REAL xscale; -REAL yscale; -REAL xoffset; -REAL yoffset; -{ - int i, j; - REAL *point1, *point2; - - for (i = 0; i < subdomains; i++) { - for (j = i + 1; j < subdomains; j++) { - if (ptr[i * subdomains + j]) { - point1 = ¢er[i * dim]; - point2 = ¢er[j * dim]; - XDrawLine(display, mainwindow, linegc, - (int) (point1[0] * xscale + xoffset), - (int) (point1[1] * yscale + yoffset), - (int) (point2[0] * xscale + xoffset), - (int) (point2[1] * yscale + yoffset)); - } - } - } - for (i = 0; i < subdomains; i++) { - point1 = ¢er[i * dim]; - if (color) { - XSetForeground(display, linegc, colors[i & 63]); - } - XFillArc(display, mainwindow, linegc, - (int) (point1[0] * xscale + xoffset) - 5 - (line_width >> 1), - (int) (point1[1] * yscale + yoffset) - 5 - (line_width >> 1), - line_width + 10, line_width + 10, 0, 23040); - } - XSetForeground(display, linegc, showme_foreground); -} - -void draw(inc, image, xmin, ymin, xmax, ymax) -int inc; -int image; -REAL xmin; -REAL ymin; -REAL xmax; -REAL ymax; -{ - draw_buttons(); - XClearWindow(display, mainwindow); - if (image == NOTHING) { - return; - } - if (!loaded[inc][image]) { - return; - } - if ((image == PART) && explode) { - xmin += (xmin - partcenter[inc][subdomains[inc] << 1]) * explosion; - xmax += (xmax - partcenter[inc][subdomains[inc] << 1]) * explosion; - ymin += (ymin - partcenter[inc][(subdomains[inc] << 1) + 1]) * explosion; - ymax += (ymax - partcenter[inc][(subdomains[inc] << 1) + 1]) * explosion; - } - xscale = (REAL) (width - line_width - 4) / (xmax - xmin); - yscale = (REAL) (height - line_width - 4) / (ymax - ymin); - if (xscale > yscale) { - xscale = yscale; - } else { - yscale = xscale; - } - xoffset = 0.5 * ((REAL) width - xscale * (xmax - xmin)) - - xscale * xmin; - yoffset = (REAL) height - 0.5 * ((REAL) height - yscale * (ymax - ymin)) + - yscale * ymin; - yscale = - yscale; - switch(image) { - case NODE: - draw_node(nodes[inc], node_dim[inc], nodeptr[inc], - xscale, yscale, xoffset, yoffset); - break; - case POLY: - if (polynodes[inc] > 0) { - draw_poly(polynodes[inc], poly_dim[inc], polyedges[inc], - polyholes[inc], polynodeptr[inc], polyedgeptr[inc], - polyholeptr[inc], - xscale, yscale, xoffset, yoffset); - } else { - draw_poly(nodes[inc], node_dim[inc], polyedges[inc], - polyholes[inc], nodeptr[inc], polyedgeptr[inc], - polyholeptr[inc], - xscale, yscale, xoffset, yoffset); - } - break; - case ELE: - draw_ele(inc, elems[inc], ele_corners[inc], eleptr[inc], - (int *) NULL, (REAL *) NULL, - xscale, yscale, xoffset, yoffset); - break; - case EDGE: - draw_edge(nodes[inc], node_dim[inc], edges[inc], - nodeptr[inc], edgeptr[inc], normptr[inc], - xscale, yscale, xoffset, yoffset); - break; - case PART: - draw_ele(inc, elems[inc], ele_corners[inc], eleptr[inc], - partpart[inc], partshift[inc], - xscale, yscale, xoffset, yoffset); - break; - case ADJ: - draw_adj(node_dim[inc], adjsubdomains[inc], adjptr[inc], partcenter[inc], - xscale, yscale, xoffset, yoffset); - break; - case VORO: - if (loaded[inc][NODE]) { - draw_node(nodes[inc], node_dim[inc], nodeptr[inc], - xscale, yscale, xoffset, yoffset); - } - draw_edge(vnodes[inc], vnode_dim[inc], vedges[inc], - vnodeptr[inc], vedgeptr[inc], vnormptr[inc], - xscale, yscale, xoffset, yoffset); - break; - default: - break; - } -} - -void addps(instring, outstring, eps) -char *instring; -char *outstring; -int eps; -{ - strcpy(outstring, instring); - if (eps) { - strcat(outstring, ".eps"); - } else { - strcat(outstring, ".ps"); - } -} - -int print_head(fname, file, llcornerx, llcornery, eps) -char *fname; -FILE **file; -int llcornerx; -int llcornery; -int eps; -{ - if (!quiet) { - printf("Writing %s\n", fname); - } - *file = fopen(fname, "w"); - if (*file == (FILE *) NULL) { - printf(" Error: Could not open %s\n", fname); - return 1; - } - if (eps) { - fprintf(*file, "%%!PS-Adobe-2.0 EPSF-2.0\n"); - } else { - fprintf(*file, "%%!PS-Adobe-2.0\n"); - } - fprintf(*file, "%%%%BoundingBox: %d %d %d %d\n", llcornerx, llcornery, - 612 - llcornerx, 792 - llcornery); - fprintf(*file, "%%%%Creator: Show Me\n"); - fprintf(*file, "%%%%EndComments\n\n"); - fprintf(*file, "1 setlinecap\n"); - fprintf(*file, "1 setlinejoin\n"); - fprintf(*file, "%d setlinewidth\n", line_width); - fprintf(*file, "%d %d moveto\n", llcornerx, llcornery); - fprintf(*file, "%d %d lineto\n", 612 - llcornerx, llcornery); - fprintf(*file, "%d %d lineto\n", 612 - llcornerx, 792 - llcornery); - fprintf(*file, "%d %d lineto\n", llcornerx, 792 - llcornery); - fprintf(*file, "closepath\nclip\nnewpath\n"); - return 0; -} - -void print_node(nodefile, nodes, dim, ptr, xscale, yscale, - xoffset, yoffset) -FILE *nodefile; -int nodes; -int dim; -REAL *ptr; -REAL xscale; -REAL yscale; -REAL xoffset; -REAL yoffset; -{ - int i; - int index; - - index = dim; - for (i = 1; i <= nodes; i++) { - fprintf(nodefile, "%d %d %d 0 360 arc\nfill\n", - (int) (ptr[index] * xscale + xoffset), - (int) (ptr[index + 1] * yscale + yoffset), - 1 + (line_width >> 1)); - index += dim; - } -} - -void print_poly(polyfile, nodes, dim, edges, holes, nodeptr, edgeptr, holeptr, - xscale, yscale, xoffset, yoffset) -FILE *polyfile; -int nodes; -int dim; -int edges; -int holes; -REAL *nodeptr; -int *edgeptr; -REAL *holeptr; -REAL xscale; -REAL yscale; -REAL xoffset; -REAL yoffset; -{ - int i; - int index; - REAL *point1, *point2; - - index = dim; - for (i = 1; i <= nodes; i++) { - fprintf(polyfile, "%d %d %d 0 360 arc\nfill\n", - (int) (nodeptr[index] * xscale + xoffset), - (int) (nodeptr[index + 1] * yscale + yoffset), - 1 + (line_width >> 1)); - index += dim; - } - index = 2; - for (i = 1; i <= edges; i++) { - point1 = &nodeptr[edgeptr[index++] * dim]; - point2 = &nodeptr[edgeptr[index++] * dim]; - fprintf(polyfile, "%d %d moveto\n", - (int) (point1[0] * xscale + xoffset), - (int) (point1[1] * yscale + yoffset)); - fprintf(polyfile, "%d %d lineto\nstroke\n", - (int) (point2[0] * xscale + xoffset), - (int) (point2[1] * yscale + yoffset)); - } -} - -void print_ele(elefile, nodes, dim, elems, corners, nodeptr, eleptr, - partition, shift, - xscale, yscale, xoffset, yoffset, llcornerx, llcornery) -FILE *elefile; -int nodes; -int dim; -int elems; -int corners; -REAL *nodeptr; -int *eleptr; -int *partition; -REAL *shift; -REAL xscale; -REAL yscale; -REAL xoffset; -REAL yoffset; -int llcornerx; -int llcornery; -{ - int i, j; - int index, colorindex; - REAL shiftx, shifty; - REAL *nowpoint; - - index = 3; - if ((partition != (int *) NULL) && !bw_ps) { - fprintf(elefile, "0 0 0 setrgbcolor\n"); - fprintf(elefile, "%d %d moveto\n", llcornerx, llcornery); - fprintf(elefile, "%d %d lineto\n", 612 - llcornerx, llcornery); - fprintf(elefile, "%d %d lineto\n", 612 - llcornerx, 792 - llcornery); - fprintf(elefile, "%d %d lineto\n", llcornerx, 792 - llcornery); - fprintf(elefile, "fill\n"); - } - for (i = 1; i <= elems; i++) { - if ((partition != (int *) NULL) && !bw_ps) { - colorindex = partition[i] & 63; - fprintf(elefile, "%6.3f %6.3f %6.3f setrgbcolor\n", - (REAL) rgb[colorindex].red / 65535.0, - (REAL) rgb[colorindex].green / 65535.0, - (REAL) rgb[colorindex].blue / 65535.0); - } - nowpoint = &nodeptr[eleptr[index + 2] * dim]; - if ((partition != (int *) NULL) && (explode || bw_ps)) { - shiftx = shift[partition[i] << 1]; - shifty = shift[(partition[i] << 1) + 1]; - fprintf(elefile, "%d %d moveto\n", - (int) ((nowpoint[0] + shiftx) * xscale + xoffset), - (int) ((nowpoint[1] + shifty) * yscale + yoffset)); - for (j = 0; j < 3; j++) { - nowpoint = &nodeptr[eleptr[index++] * dim]; - fprintf(elefile, "%d %d lineto\n", - (int) ((nowpoint[0] + shiftx) * xscale + xoffset), - (int) ((nowpoint[1] + shifty) * yscale + yoffset)); - } - } else { - fprintf(elefile, "%d %d moveto\n", - (int) (nowpoint[0] * xscale + xoffset), - (int) (nowpoint[1] * yscale + yoffset)); - for (j = 0; j < 3; j++) { - nowpoint = &nodeptr[eleptr[index++] * dim]; - fprintf(elefile, "%d %d lineto\n", - (int) (nowpoint[0] * xscale + xoffset), - (int) (nowpoint[1] * yscale + yoffset)); - } - } - if (fillelem && !bw_ps) { - fprintf(elefile, "gsave\nfill\ngrestore\n1 1 0 setrgbcolor\n"); - } - fprintf(elefile, "stroke\n"); - } -} - -void print_edge(edgefile, nodes, dim, edges, nodeptr, edgeptr, normptr, - xscale, yscale, xoffset, yoffset, llcornerx, llcornery) -FILE *edgefile; -int nodes; -int dim; -int edges; -REAL *nodeptr; -int *edgeptr; -REAL *normptr; -REAL xscale; -REAL yscale; -REAL xoffset; -REAL yoffset; -int llcornerx; -int llcornery; -{ - int i; - int index; - REAL *point1, *point2; - REAL normx, normy; - REAL normmult, normmultx, normmulty; - REAL windowxmin, windowymin, windowxmax, windowymax; - - index = 2; - for (i = 1; i <= edges; i++) { - point1 = &nodeptr[edgeptr[index++] * dim]; - if (edgeptr[index] == -1) { - normx = normptr[index - 1]; - normy = normptr[index++]; - normmultx = 0.0; - if (normx > 0) { - windowxmax = ((REAL) (612 - llcornerx) - xoffset) / xscale; - normmultx = (windowxmax - point1[0]) / normx; - } else if (normx < 0) { - windowxmin = ((REAL) llcornerx - xoffset) / xscale; - normmultx = (windowxmin - point1[0]) / normx; - } - normmulty = 0.0; - if (normy > 0) { - windowymax = ((REAL) (792 - llcornery) - yoffset) / yscale; - normmulty = (windowymax - point1[1]) / normy; - } else if (normy < 0) { - windowymin = ((REAL) llcornery - yoffset) / yscale; - normmulty = (windowymin - point1[1]) / normy; - } - if (normmultx == 0.0) { - normmult = normmulty; - } else if (normmulty == 0.0) { - normmult = normmultx; - } else if (normmultx < normmulty) { - normmult = normmultx; - } else { - normmult = normmulty; - } - if (normmult > 0.0) { - fprintf(edgefile, "%d %d moveto\n", - (int) (point1[0] * xscale + xoffset), - (int) (point1[1] * yscale + yoffset)); - fprintf(edgefile, "%d %d lineto\nstroke\n", - (int) ((point1[0] + normmult * normx) * xscale + xoffset), - (int) ((point1[1] + normmult * normy) * yscale + yoffset)); - } - } else { - point2 = &nodeptr[edgeptr[index++] * dim]; - fprintf(edgefile, "%d %d moveto\n", - (int) (point1[0] * xscale + xoffset), - (int) (point1[1] * yscale + yoffset)); - fprintf(edgefile, "%d %d lineto\nstroke\n", - (int) (point2[0] * xscale + xoffset), - (int) (point2[1] * yscale + yoffset)); - } - } -} - -void print_adj(adjfile, dim, subdomains, ptr, center, xscale, yscale, - xoffset, yoffset, llcornerx, llcornery) -FILE *adjfile; -int dim; -int subdomains; -int *ptr; -REAL *center; -REAL xscale; -REAL yscale; -REAL xoffset; -REAL yoffset; -int llcornerx; -int llcornery; -{ - int i, j; - REAL *point1, *point2; - int colorindex; - - if (!bw_ps) { - fprintf(adjfile, "0 0 0 setrgbcolor\n"); - fprintf(adjfile, "%d %d moveto\n", llcornerx, llcornery); - fprintf(adjfile, "%d %d lineto\n", 612 - llcornerx, llcornery); - fprintf(adjfile, "%d %d lineto\n", 612 - llcornerx, 792 - llcornery); - fprintf(adjfile, "%d %d lineto\n", llcornerx, 792 - llcornery); - fprintf(adjfile, "fill\n"); - fprintf(adjfile, "1 1 0 setrgbcolor\n"); - } - for (i = 0; i < subdomains; i++) { - for (j = i + 1; j < subdomains; j++) { - if (ptr[i * subdomains + j]) { - point1 = ¢er[i * dim]; - point2 = ¢er[j * dim]; - fprintf(adjfile, "%d %d moveto\n", - (int) (point1[0] * xscale + xoffset), - (int) (point1[1] * yscale + yoffset)); - fprintf(adjfile, "%d %d lineto\nstroke\n", - (int) (point2[0] * xscale + xoffset), - (int) (point2[1] * yscale + yoffset)); - } - } - } - for (i = 0; i < subdomains; i++) { - point1 = ¢er[i * dim]; - if (!bw_ps) { - colorindex = i & 63; - fprintf(adjfile, "%6.3f %6.3f %6.3f setrgbcolor\n", - (REAL) rgb[colorindex].red / 65535.0, - (REAL) rgb[colorindex].green / 65535.0, - (REAL) rgb[colorindex].blue / 65535.0); - fprintf(adjfile, "%d %d %d 0 360 arc\nfill\n", - (int) (point1[0] * xscale + xoffset), - (int) (point1[1] * yscale + yoffset), - 5 + (line_width >> 1)); - } else { - fprintf(adjfile, "%d %d %d 0 360 arc\nfill\n", - (int) (point1[0] * xscale + xoffset), - (int) (point1[1] * yscale + yoffset), - 3 + (line_width >> 1)); - } - } -} - -void print(inc, image, xmin, ymin, xmax, ymax, eps) -int inc; -int image; -REAL xmin; -REAL ymin; -REAL xmax; -REAL ymax; -int eps; -{ - REAL xxscale, yyscale, xxoffset, yyoffset; - char psfilename[FILENAMESIZE]; - int llcornerx, llcornery; - FILE *psfile; - - if (image == NOTHING) { - return; - } - if (!loaded[inc][image]) { - return; - } - if ((image == PART) && (explode || bw_ps)) { - xmin += (xmin - partcenter[inc][subdomains[inc] << 1]) * explosion; - xmax += (xmax - partcenter[inc][subdomains[inc] << 1]) * explosion; - ymin += (ymin - partcenter[inc][(subdomains[inc] << 1) + 1]) * explosion; - ymax += (ymax - partcenter[inc][(subdomains[inc] << 1) + 1]) * explosion; - } - xxscale = (460.0 - (REAL) line_width) / (xmax - xmin); - yyscale = (640.0 - (REAL) line_width) / (ymax - ymin); - if (xxscale > yyscale) { - xxscale = yyscale; - llcornerx = (604 - (int) (yyscale * (xmax - xmin)) - line_width) >> 1; - llcornery = 72; - } else { - yyscale = xxscale; - llcornerx = 72; - llcornery = (784 - (int) (xxscale * (ymax - ymin)) - line_width) >> 1; - } - xxoffset = 0.5 * (612.0 - xxscale * (xmax - xmin)) - xxscale * xmin + - (line_width >> 1); - yyoffset = 0.5 * (792.0 - yyscale * (ymax - ymin)) - yyscale * ymin + - (line_width >> 1); - switch(image) { - case NODE: - addps(nodefilename[inc], psfilename, eps); - break; - case POLY: - addps(polyfilename[inc], psfilename, eps); - break; - case ELE: - addps(elefilename[inc], psfilename, eps); - break; - case EDGE: - addps(edgefilename[inc], psfilename, eps); - break; - case PART: - addps(partfilename[inc], psfilename, eps); - break; - case ADJ: - addps(adjfilename[inc], psfilename, eps); - break; - case VORO: - addps(vedgefilename[inc], psfilename, eps); - break; - default: - break; - } - if (print_head(psfilename, &psfile, llcornerx, llcornery, eps)) { - return; - } - switch(image) { - case NODE: - print_node(psfile, nodes[inc], node_dim[inc], nodeptr[inc], - xxscale, yyscale, xxoffset, yyoffset); - break; - case POLY: - if (polynodes[inc] > 0) { - print_poly(psfile, polynodes[inc], poly_dim[inc], polyedges[inc], - polyholes[inc], polynodeptr[inc], polyedgeptr[inc], - polyholeptr[inc], xxscale, yyscale, xxoffset, yyoffset); - } else { - print_poly(psfile, nodes[inc], node_dim[inc], polyedges[inc], - polyholes[inc], nodeptr[inc], polyedgeptr[inc], - polyholeptr[inc], xxscale, yyscale, xxoffset, yyoffset); - } - break; - case ELE: - print_ele(psfile, nodes[inc], node_dim[inc], elems[inc], - ele_corners[inc], nodeptr[inc], eleptr[inc], - (int *) NULL, (REAL *) NULL, - xxscale, yyscale, xxoffset, yyoffset, llcornerx, llcornery); - break; - case EDGE: - print_edge(psfile, nodes[inc], node_dim[inc], edges[inc], - nodeptr[inc], edgeptr[inc], normptr[inc], - xxscale, yyscale, xxoffset, yyoffset, llcornerx, llcornery); - break; - case PART: - print_ele(psfile, nodes[inc], node_dim[inc], elems[inc], - ele_corners[inc], nodeptr[inc], eleptr[inc], - partpart[inc], partshift[inc], - xxscale, yyscale, xxoffset, yyoffset, llcornerx, llcornery); - break; - case ADJ: - print_adj(psfile, node_dim[inc], adjsubdomains[inc], adjptr[inc], - partcenter[inc], - xxscale, yyscale, xxoffset, yyoffset, llcornerx, llcornery); - break; - case VORO: - print_edge(psfile, vnodes[inc], vnode_dim[inc], vedges[inc], - vnodeptr[inc], vedgeptr[inc], vnormptr[inc], - xxscale, yyscale, xxoffset, yyoffset, llcornerx, llcornery); - break; - default: - break; - } - if (!eps) { - fprintf(psfile, "showpage\n"); - } - fclose(psfile); -} - -int main(argc, argv) -int argc; -char **argv; -{ - REAL xmin, ymin, xmax, ymax; - REAL xptr, yptr, xspan, yspan; - int past_image; - int new_image; - int new_inc; - - parsecommandline(argc, argv); - showme_init(); - choose_image(start_inc, start_image); - showme_window(argc, argv); - - if (current_image != NOTHING) { - xmin = xlo[current_inc][current_image]; - ymin = ylo[current_inc][current_image]; - xmax = xhi[current_inc][current_image]; - ymax = yhi[current_inc][current_image]; - zoom = 0; - } - - XMaskEvent(display, ExposureMask, &event); - while (1) { - switch (event.type) { - case ButtonRelease: - if (event.xany.window == quitwin) { - XDestroyWindow(display, mainwindow); - XCloseDisplay(display); - return 0; - } else if (event.xany.window == leftwin) { - xspan = 0.25 * (xmax - xmin); - xmin += xspan; - xmax += xspan; - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } else if (event.xany.window == rightwin) { - xspan = 0.25 * (xmax - xmin); - xmin -= xspan; - xmax -= xspan; - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } else if (event.xany.window == upwin) { - yspan = 0.25 * (ymax - ymin); - ymin -= yspan; - ymax -= yspan; - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } else if (event.xany.window == downwin) { - yspan = 0.25 * (ymax - ymin); - ymin += yspan; - ymax += yspan; - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } else if (event.xany.window == resetwin) { - xmin = xlo[current_inc][current_image]; - ymin = ylo[current_inc][current_image]; - xmax = xhi[current_inc][current_image]; - ymax = yhi[current_inc][current_image]; - zoom = 0; - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } else if (event.xany.window == widthpluswin) { - if (line_width < 100) { - line_width++; - XSetLineAttributes(display, linegc, line_width, LineSolid, - CapRound, JoinRound); - XSetLineAttributes(display, trianglegc, line_width, LineSolid, - CapRound, JoinRound); - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } - } else if (event.xany.window == widthminuswin) { - if (line_width > 1) { - line_width--; - XSetLineAttributes(display, linegc, line_width, LineSolid, - CapRound, JoinRound); - XSetLineAttributes(display, trianglegc, line_width, LineSolid, - CapRound, JoinRound); - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } - } else if (event.xany.window == expwin) { - if ((current_image == PART) && loaded[current_inc][PART]) { - explode = !explode; - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } - } else if (event.xany.window == exppluswin) { - if ((current_image == PART) && loaded[PART] && explode) { - explosion += 0.125; - findpartshift(subdomains[current_inc], explosion, - partcenter[current_inc], partshift[current_inc]); - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } - } else if (event.xany.window == expminuswin) { - if ((current_image == PART) && loaded[PART] && explode && - (explosion >= 0.125)) { - explosion -= 0.125; - findpartshift(subdomains[current_inc], explosion, - partcenter[current_inc], partshift[current_inc]); - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } - } else if (event.xany.window == fillwin) { - if ((current_image == PART) && loaded[PART]) { - fillelem = !fillelem; - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } - } else if (event.xany.window == pswin) { - fill_button(pswin); - XFlush(display); - print(current_inc, current_image, xmin, ymin, xmax, ymax, 0); - XClearWindow(display, pswin); - XDrawString(display, pswin, fontgc, 2, 13, "PS", 2); - } else if (event.xany.window == epswin) { - fill_button(epswin); - XFlush(display); - print(current_inc, current_image, xmin, ymin, xmax, ymax, 1); - XClearWindow(display, epswin); - XDrawString(display, epswin, fontgc, 2, 13, "EPS", 3); - } else if (event.xany.window == versionpluswin) { - move_inc(1); - loweriteration++; - set_filenames(filename, loweriteration); - if (current_inc == 1) { - current_inc = 0; - } else { - current_image = NOTHING; - XClearWindow(display, mainwindow); - } - draw_buttons(); - } else if (event.xany.window == versionminuswin) { - if (loweriteration > 0) { - move_inc(0); - loweriteration--; - set_filenames(filename, loweriteration); - if (current_inc == 0) { - current_inc = 1; - } else { - current_image = NOTHING; - XClearWindow(display, mainwindow); - } - draw_buttons(); - } - } else if ((event.xany.window == nodewin[0]) || - (event.xany.window == polywin[0]) || - (event.xany.window == elewin[0]) || - (event.xany.window == edgewin[0]) || - (event.xany.window == partwin[0]) || - (event.xany.window == adjwin[0]) || - (event.xany.window == voronoiwin[0]) || - (event.xany.window == nodewin[1]) || - (event.xany.window == polywin[1]) || - (event.xany.window == elewin[1]) || - (event.xany.window == edgewin[1]) || - (event.xany.window == partwin[1]) || - (event.xany.window == adjwin[1]) || - (event.xany.window == voronoiwin[1])) { - if (event.xany.window == nodewin[0]) { - new_inc = 0; - new_image = NODE; - } - if (event.xany.window == polywin[0]) { - new_inc = 0; - new_image = POLY; - } - if (event.xany.window == elewin[0]) { - new_inc = 0; - new_image = ELE; - } - if (event.xany.window == edgewin[0]) { - new_inc = 0; - new_image = EDGE; - } - if (event.xany.window == partwin[0]) { - new_inc = 0; - new_image = PART; - } - if (event.xany.window == adjwin[0]) { - new_inc = 0; - new_image = ADJ; - } - if (event.xany.window == voronoiwin[0]) { - new_inc = 0; - new_image = VORO; - } - if (event.xany.window == nodewin[1]) { - new_inc = 1; - new_image = NODE; - } - if (event.xany.window == polywin[1]) { - new_inc = 1; - new_image = POLY; - } - if (event.xany.window == elewin[1]) { - new_inc = 1; - new_image = ELE; - } - if (event.xany.window == edgewin[1]) { - new_inc = 1; - new_image = EDGE; - } - if (event.xany.window == partwin[1]) { - new_inc = 1; - new_image = PART; - } - if (event.xany.window == adjwin[1]) { - new_inc = 1; - new_image = ADJ; - } - if (event.xany.window == voronoiwin[1]) { - new_inc = 1; - new_image = VORO; - } - past_image = current_image; - if ((current_inc == new_inc) && (current_image == new_image)) { - free_inc(new_inc); - unload_inc(new_inc); - } - choose_image(new_inc, new_image); - if ((past_image == NOTHING) && (current_image != NOTHING)) { - xmin = xlo[current_inc][current_image]; - ymin = ylo[current_inc][current_image]; - xmax = xhi[current_inc][current_image]; - ymax = yhi[current_inc][current_image]; - zoom = 0; - } - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } else { - xptr = ((REAL) event.xbutton.x - xoffset) / xscale; - yptr = ((REAL) event.xbutton.y - yoffset) / yscale; - if ((current_image == PART) && loaded[PART] && explode) { - xptr = (xptr + partcenter[current_inc] - [subdomains[current_inc] << 1] - * explosion) / (1.0 + explosion); - yptr = (yptr + partcenter[current_inc] - [(subdomains[current_inc] << 1) + 1] - * explosion) / (1.0 + explosion); - } - if ((event.xbutton.button == Button1) - || (event.xbutton.button == Button3)) { - if (event.xbutton.button == Button1) { - xspan = 0.25 * (xmax - xmin); - yspan = 0.25 * (ymax - ymin); - zoom++; - } else { - xspan = xmax - xmin; - yspan = ymax - ymin; - zoom--; - } - xmin = xptr - xspan; - ymin = yptr - yspan; - xmax = xptr + xspan; - ymax = yptr + yspan; - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - } else if (event.xbutton.button == Button2) { - printf("x = %.9f, y = %.9f\n", xptr, yptr); - } - } - break; - case DestroyNotify: - XDestroyWindow(display, mainwindow); - XCloseDisplay(display); - return 0; - case ConfigureNotify: - if ((width != event.xconfigure.width) || - (height != event.xconfigure.height - PANELHEIGHT)) { - width = event.xconfigure.width; - height = event.xconfigure.height - PANELHEIGHT; - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - while (XCheckMaskEvent(display, ExposureMask, &event)); - } - break; - case Expose: - draw(current_inc, current_image, xmin, ymin, xmax, ymax); - while (XCheckMaskEvent(display, ExposureMask, &event)); - break; - default: - break; - } - XNextEvent(display, &event); - } -} diff --git a/Tools/Lib/Triangle/triangle.c b/Tools/Lib/Triangle/triangle.c deleted file mode 100644 index 9af47a493..000000000 --- a/Tools/Lib/Triangle/triangle.c +++ /dev/null @@ -1,13241 +0,0 @@ -/*****************************************************************************/ -/* */ -/* 888888888 ,o, / 888 */ -/* 888 88o88o " o8888o 88o8888o o88888o 888 o88888o */ -/* 888 888 888 88b 888 888 888 888 888 d888 88b */ -/* 888 888 888 o88^o888 888 888 "88888" 888 8888oo888 */ -/* 888 888 888 C888 888 888 888 / 888 q888 */ -/* 888 888 888 "88o^888 888 888 Cb 888 "88oooo" */ -/* "8oo8D */ -/* */ -/* A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator. */ -/* (triangle.c) */ -/* */ -/* Version 1.3 */ -/* July 19, 1996 */ -/* */ -/* Copyright 1996 */ -/* Jonathan Richard Shewchuk */ -/* School of Computer Science */ -/* Carnegie Mellon University */ -/* 5000 Forbes Avenue */ -/* Pittsburgh, Pennsylvania 15213-3891 */ -/* jrs@cs.cmu.edu */ -/* */ -/* This program may be freely redistributed under the condition that the */ -/* copyright notices (including this entire header and the copyright */ -/* notice printed when the `-h' switch is selected) are not removed, and */ -/* no compensation is received. Private, research, and institutional */ -/* use is free. You may distribute modified versions of this code UNDER */ -/* THE CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE TO IT IN THE */ -/* SAME FILE REMAIN UNDER COPYRIGHT OF THE ORIGINAL AUTHOR, BOTH SOURCE */ -/* AND OBJECT CODE ARE MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR */ -/* NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution of this code as */ -/* part of a commercial system is permissible ONLY BY DIRECT ARRANGEMENT */ -/* WITH THE AUTHOR. (If you are not directly supplying this code to a */ -/* customer, and you are instead telling them how they can obtain it for */ -/* free, then you are not required to make any arrangement with me.) */ -/* */ -/* Hypertext instructions for Triangle are available on the Web at */ -/* */ -/* http://www.cs.cmu.edu/~quake/triangle.html */ -/* */ -/* Some of the references listed below are marked [*]. These are available */ -/* for downloading from the Web page */ -/* */ -/* http://www.cs.cmu.edu/~quake/triangle.research.html */ -/* */ -/* A paper discussing some aspects of Triangle is available. See Jonathan */ -/* Richard Shewchuk, "Triangle: Engineering a 2D Quality Mesh Generator */ -/* and Delaunay Triangulator," First Workshop on Applied Computational */ -/* Geometry, ACM, May 1996. [*] */ -/* */ -/* Triangle was created as part of the Archimedes project in the School of */ -/* Computer Science at Carnegie Mellon University. Archimedes is a */ -/* system for compiling parallel finite element solvers. For further */ -/* information, see Anja Feldmann, Omar Ghattas, John R. Gilbert, Gary L. */ -/* Miller, David R. O'Hallaron, Eric J. Schwabe, Jonathan R. Shewchuk, */ -/* and Shang-Hua Teng, "Automated Parallel Solution of Unstructured PDE */ -/* Problems." To appear in Communications of the ACM, we hope. */ -/* */ -/* The quality mesh generation algorithm is due to Jim Ruppert, "A */ -/* Delaunay Refinement Algorithm for Quality 2-Dimensional Mesh */ -/* Generation," Journal of Algorithms 18(3):548-585, May 1995. [*] */ -/* */ -/* My implementation of the divide-and-conquer and incremental Delaunay */ -/* triangulation algorithms follows closely the presentation of Guibas */ -/* and Stolfi, even though I use a triangle-based data structure instead */ -/* of their quad-edge data structure. (In fact, I originally implemented */ -/* Triangle using the quad-edge data structure, but switching to a */ -/* triangle-based data structure sped Triangle by a factor of two.) The */ -/* mesh manipulation primitives and the two aforementioned Delaunay */ -/* triangulation algorithms are described by Leonidas J. Guibas and Jorge */ -/* Stolfi, "Primitives for the Manipulation of General Subdivisions and */ -/* the Computation of Voronoi Diagrams," ACM Transactions on Graphics */ -/* 4(2):74-123, April 1985. */ -/* */ -/* Their O(n log n) divide-and-conquer algorithm is adapted from Der-Tsai */ -/* Lee and Bruce J. Schachter, "Two Algorithms for Constructing the */ -/* Delaunay Triangulation," International Journal of Computer and */ -/* Information Science 9(3):219-242, 1980. The idea to improve the */ -/* divide-and-conquer algorithm by alternating between vertical and */ -/* horizontal cuts was introduced by Rex A. Dwyer, "A Faster Divide-and- */ -/* Conquer Algorithm for Constructing Delaunay Triangulations," */ -/* Algorithmica 2(2):137-151, 1987. */ -/* */ -/* The incremental insertion algorithm was first proposed by C. L. Lawson, */ -/* "Software for C1 Surface Interpolation," in Mathematical Software III, */ -/* John R. Rice, editor, Academic Press, New York, pp. 161-194, 1977. */ -/* For point location, I use the algorithm of Ernst P. Mucke, Isaac */ -/* Saias, and Binhai Zhu, "Fast Randomized Point Location Without */ -/* Preprocessing in Two- and Three-dimensional Delaunay Triangulations," */ -/* Proceedings of the Twelfth Annual Symposium on Computational Geometry, */ -/* ACM, May 1996. [*] If I were to randomize the order of point */ -/* insertion (I currently don't bother), their result combined with the */ -/* result of Leonidas J. Guibas, Donald E. Knuth, and Micha Sharir, */ -/* "Randomized Incremental Construction of Delaunay and Voronoi */ -/* Diagrams," Algorithmica 7(4):381-413, 1992, would yield an expected */ -/* O(n^{4/3}) bound on running time. */ -/* */ -/* The O(n log n) sweepline Delaunay triangulation algorithm is taken from */ -/* Steven Fortune, "A Sweepline Algorithm for Voronoi Diagrams", */ -/* Algorithmica 2(2):153-174, 1987. A random sample of edges on the */ -/* boundary of the triangulation are maintained in a splay tree for the */ -/* purpose of point location. Splay trees are described by Daniel */ -/* Dominic Sleator and Robert Endre Tarjan, "Self-Adjusting Binary Search */ -/* Trees," Journal of the ACM 32(3):652-686, July 1985. */ -/* */ -/* The algorithms for exact computation of the signs of determinants are */ -/* described in Jonathan Richard Shewchuk, "Adaptive Precision Floating- */ -/* Point Arithmetic and Fast Robust Geometric Predicates," Technical */ -/* Report CMU-CS-96-140, School of Computer Science, Carnegie Mellon */ -/* University, Pittsburgh, Pennsylvania, May 1996. [*] (Submitted to */ -/* Discrete & Computational Geometry.) An abbreviated version appears as */ -/* Jonathan Richard Shewchuk, "Robust Adaptive Floating-Point Geometric */ -/* Predicates," Proceedings of the Twelfth Annual Symposium on Computa- */ -/* tional Geometry, ACM, May 1996. [*] Many of the ideas for my exact */ -/* arithmetic routines originate with Douglas M. Priest, "Algorithms for */ -/* Arbitrary Precision Floating Point Arithmetic," Tenth Symposium on */ -/* Computer Arithmetic, 132-143, IEEE Computer Society Press, 1991. [*] */ -/* Many of the ideas for the correct evaluation of the signs of */ -/* determinants are taken from Steven Fortune and Christopher J. Van Wyk, */ -/* "Efficient Exact Arithmetic for Computational Geometry," Proceedings */ -/* of the Ninth Annual Symposium on Computational Geometry, ACM, */ -/* pp. 163-172, May 1993, and from Steven Fortune, "Numerical Stability */ -/* of Algorithms for 2D Delaunay Triangulations," International Journal */ -/* of Computational Geometry & Applications 5(1-2):193-213, March-June */ -/* 1995. */ -/* */ -/* For definitions of and results involving Delaunay triangulations, */ -/* constrained and conforming versions thereof, and other aspects of */ -/* triangular mesh generation, see the excellent survey by Marshall Bern */ -/* and David Eppstein, "Mesh Generation and Optimal Triangulation," in */ -/* Computing and Euclidean Geometry, Ding-Zhu Du and Frank Hwang, */ -/* editors, World Scientific, Singapore, pp. 23-90, 1992. */ -/* */ -/* The time for incrementally adding PSLG (planar straight line graph) */ -/* segments to create a constrained Delaunay triangulation is probably */ -/* O(n^2) per segment in the worst case and O(n) per edge in the common */ -/* case, where n is the number of triangles that intersect the segment */ -/* before it is inserted. This doesn't count point location, which can */ -/* be much more expensive. (This note does not apply to conforming */ -/* Delaunay triangulations, for which a different method is used to */ -/* insert segments.) */ -/* */ -/* The time for adding segments to a conforming Delaunay triangulation is */ -/* not clear, but does not depend upon n alone. In some cases, very */ -/* small features (like a point lying next to a segment) can cause a */ -/* single segment to be split an arbitrary number of times. Of course, */ -/* floating-point precision is a practical barrier to how much this can */ -/* happen. */ -/* */ -/* The time for deleting a point from a Delaunay triangulation is O(n^2) in */ -/* the worst case and O(n) in the common case, where n is the degree of */ -/* the point being deleted. I could improve this to expected O(n) time */ -/* by "inserting" the neighboring vertices in random order, but n is */ -/* usually quite small, so it's not worth the bother. (The O(n) time */ -/* for random insertion follows from L. Paul Chew, "Building Voronoi */ -/* Diagrams for Convex Polygons in Linear Expected Time," Technical */ -/* Report PCS-TR90-147, Department of Mathematics and Computer Science, */ -/* Dartmouth College, 1990. */ -/* */ -/* Ruppert's Delaunay refinement algorithm typically generates triangles */ -/* at a linear rate (constant time per triangle) after the initial */ -/* triangulation is formed. There may be pathological cases where more */ -/* time is required, but these never arise in practice. */ -/* */ -/* The segment intersection formulae are straightforward. If you want to */ -/* see them derived, see Franklin Antonio. "Faster Line Segment */ -/* Intersection." In Graphics Gems III (David Kirk, editor), pp. 199- */ -/* 202. Academic Press, Boston, 1992. */ -/* */ -/* If you make any improvements to this code, please please please let me */ -/* know, so that I may obtain the improvements. Even if you don't change */ -/* the code, I'd still love to hear what it's being used for. */ -/* */ -/* Disclaimer: Neither I nor Carnegie Mellon warrant this code in any way */ -/* whatsoever. This code is provided "as-is". Use at your own risk. */ -/* */ -/*****************************************************************************/ - -/* For single precision (which will save some memory and reduce paging), */ -/* define the symbol SINGLE by using the -DSINGLE compiler switch or by */ -/* writing "#define SINGLE" below. */ -/* */ -/* For double precision (which will allow you to refine meshes to a smaller */ -/* edge length), leave SINGLE undefined. */ -/* */ -/* Double precision uses more memory, but improves the resolution of the */ -/* meshes you can generate with Triangle. It also reduces the likelihood */ -/* of a floating exception due to overflow. Finally, it is much faster */ -/* than single precision on 64-bit architectures like the DEC Alpha. I */ -/* recommend double precision unless you want to generate a mesh for which */ -/* you do not have enough memory. */ - -/* #define SINGLE */ - -#ifdef SINGLE -#define REAL float -#else /* not SINGLE */ -#define REAL double -#endif /* not SINGLE */ - -/* If yours is not a Unix system, define the NO_TIMER compiler switch to */ -/* remove the Unix-specific timing code. */ - -/* #define NO_TIMER */ - -/* To insert lots of self-checks for internal errors, define the SELF_CHECK */ -/* symbol. This will slow down the program significantly. It is best to */ -/* define the symbol using the -DSELF_CHECK compiler switch, but you could */ -/* write "#define SELF_CHECK" below. If you are modifying this code, I */ -/* recommend you turn self-checks on. */ - -/* #define SELF_CHECK */ - -/* To compile Triangle as a callable object library (triangle.o), define the */ -/* TRILIBRARY symbol. Read the file triangle.h for details on how to call */ -/* the procedure triangulate() that results. */ - -/* #define TRILIBRARY */ - -/* It is possible to generate a smaller version of Triangle using one or */ -/* both of the following symbols. Define the REDUCED symbol to eliminate */ -/* all features that are primarily of research interest; specifically, the */ -/* -i, -F, -s, and -C switches. Define the CDT_ONLY symbol to eliminate */ -/* all meshing algorithms above and beyond constrained Delaunay */ -/* triangulation; specifically, the -r, -q, -a, -S, and -s switches. */ -/* These reductions are most likely to be useful when generating an object */ -/* library (triangle.o) by defining the TRILIBRARY symbol. */ - -/* #define REDUCED */ -/* #define CDT_ONLY */ - -/* On some machines, the exact arithmetic routines might be defeated by the */ -/* use of internal extended precision floating-point registers. Sometimes */ -/* this problem can be fixed by defining certain values to be volatile, */ -/* thus forcing them to be stored to memory and rounded off. This isn't */ -/* a great solution, though, as it slows Triangle down. */ -/* */ -/* To try this out, write "#define INEXACT volatile" below. Normally, */ -/* however, INEXACT should be defined to be nothing. ("#define INEXACT".) */ - -#define INEXACT /* Nothing */ -/* #define INEXACT volatile */ - -/* Maximum number of characters in a file name (including the null). */ - -#define FILENAMESIZE 512 - -/* Maximum number of characters in a line read from a file (including the */ -/* null). */ - -#define INPUTLINESIZE 512 - -/* For efficiency, a variety of data structures are allocated in bulk. The */ -/* following constants determine how many of each structure is allocated */ -/* at once. */ - -#define TRIPERBLOCK 4092 /* Number of triangles allocated at once. */ -#define SHELLEPERBLOCK 508 /* Number of shell edges allocated at once. */ -#define POINTPERBLOCK 4092 /* Number of points allocated at once. */ -#define VIRUSPERBLOCK 1020 /* Number of virus triangles allocated at once. */ -/* Number of encroached segments allocated at once. */ -#define BADSEGMENTPERBLOCK 252 -/* Number of skinny triangles allocated at once. */ -#define BADTRIPERBLOCK 4092 -/* Number of splay tree nodes allocated at once. */ -#define SPLAYNODEPERBLOCK 508 - -/* The point marker DEADPOINT is an arbitrary number chosen large enough to */ -/* (hopefully) not conflict with user boundary markers. Make sure that it */ -/* is small enough to fit into your machine's integer size. */ - -#define DEADPOINT -1073741824 - -/* The next line is used to outsmart some very stupid compilers. If your */ -/* compiler is smarter, feel free to replace the "int" with "void". */ -/* Not that it matters. */ - -#define VOID int - -/* Two constants for algorithms based on random sampling. Both constants */ -/* have been chosen empirically to optimize their respective algorithms. */ - -/* Used for the point location scheme of Mucke, Saias, and Zhu, to decide */ -/* how large a random sample of triangles to inspect. */ -#define SAMPLEFACTOR 11 -/* Used in Fortune's sweepline Delaunay algorithm to determine what fraction */ -/* of boundary edges should be maintained in the splay tree for point */ -/* location on the front. */ -#define SAMPLERATE 10 - -/* A number that speaks for itself, every kissable digit. */ - -#define PI 3.141592653589793238462643383279502884197169399375105820974944592308 - -/* Another fave. */ - -#define SQUAREROOTTWO 1.4142135623730950488016887242096980785696718753769480732 - -/* And here's one for those of you who are intimidated by math. */ - -#define ONETHIRD 0.333333333333333333333333333333333333333333333333333333333333 - -#include -#include -#include -#ifndef NO_TIMER -#include -#endif /* NO_TIMER */ -#ifdef TRILIBRARY -#include "triangle.h" -#endif /* TRILIBRARY */ - -/* The following obscenity seems to be necessary to ensure that this program */ -/* will port to Dec Alphas running OSF/1, because their stdio.h file commits */ -/* the unpardonable sin of including stdlib.h. Hence, malloc(), free(), and */ -/* exit() may or may not already be defined at this point. I declare these */ -/* functions explicitly because some non-ANSI C compilers lack stdlib.h. */ - -#ifndef _STDLIB_H_ -extern void *malloc(); -extern void free(); -extern void exit(); -extern double strtod(); -extern long strtol(); -#endif /* _STDLIB_H_ */ - -/* A few forward declarations. */ - -void poolrestart(); -#ifndef TRILIBRARY -char *readline(); -char *findfield(); -#endif /* not TRILIBRARY */ - -/* Labels that signify whether a record consists primarily of pointers or of */ -/* floating-point words. Used to make decisions about data alignment. */ - -enum wordtype {POINTER, FLOATINGPOINT}; - -/* Labels that signify the result of point location. The result of a */ -/* search indicates that the point falls in the interior of a triangle, on */ -/* an edge, on a vertex, or outside the mesh. */ - -enum locateresult {INTRIANGLE, ONEDGE, ONVERTEX, OUTSIDE}; - -/* Labels that signify the result of site insertion. The result indicates */ -/* that the point was inserted with complete success, was inserted but */ -/* encroaches on a segment, was not inserted because it lies on a segment, */ -/* or was not inserted because another point occupies the same location. */ - -enum insertsiteresult {SUCCESSFULPOINT, ENCROACHINGPOINT, VIOLATINGPOINT, - DUPLICATEPOINT}; - -/* Labels that signify the result of direction finding. The result */ -/* indicates that a segment connecting the two query points falls within */ -/* the direction triangle, along the left edge of the direction triangle, */ -/* or along the right edge of the direction triangle. */ - -enum finddirectionresult {WITHIN, LEFTCOLLINEAR, RIGHTCOLLINEAR}; - -/* Labels that signify the result of the circumcenter computation routine. */ -/* The return value indicates which edge of the triangle is shortest. */ - -enum circumcenterresult {OPPOSITEORG, OPPOSITEDEST, OPPOSITEAPEX}; - -/*****************************************************************************/ -/* */ -/* The basic mesh data structures */ -/* */ -/* There are three: points, triangles, and shell edges (abbreviated */ -/* `shelle'). These three data structures, linked by pointers, comprise */ -/* the mesh. A point simply represents a point in space and its properties.*/ -/* A triangle is a triangle. A shell edge is a special data structure used */ -/* to represent impenetrable segments in the mesh (including the outer */ -/* boundary, boundaries of holes, and internal boundaries separating two */ -/* triangulated regions). Shell edges represent boundaries defined by the */ -/* user that triangles may not lie across. */ -/* */ -/* A triangle consists of a list of three vertices, a list of three */ -/* adjoining triangles, a list of three adjoining shell edges (when shell */ -/* edges are used), an arbitrary number of optional user-defined floating- */ -/* point attributes, and an optional area constraint. The latter is an */ -/* upper bound on the permissible area of each triangle in a region, used */ -/* for mesh refinement. */ -/* */ -/* For a triangle on a boundary of the mesh, some or all of the neighboring */ -/* triangles may not be present. For a triangle in the interior of the */ -/* mesh, often no neighboring shell edges are present. Such absent */ -/* triangles and shell edges are never represented by NULL pointers; they */ -/* are represented by two special records: `dummytri', the triangle that */ -/* fills "outer space", and `dummysh', the omnipresent shell edge. */ -/* `dummytri' and `dummysh' are used for several reasons; for instance, */ -/* they can be dereferenced and their contents examined without causing the */ -/* memory protection exception that would occur if NULL were dereferenced. */ -/* */ -/* However, it is important to understand that a triangle includes other */ -/* information as well. The pointers to adjoining vertices, triangles, and */ -/* shell edges are ordered in a way that indicates their geometric relation */ -/* to each other. Furthermore, each of these pointers contains orientation */ -/* information. Each pointer to an adjoining triangle indicates which face */ -/* of that triangle is contacted. Similarly, each pointer to an adjoining */ -/* shell edge indicates which side of that shell edge is contacted, and how */ -/* the shell edge is oriented relative to the triangle. */ -/* */ -/* Shell edges are found abutting edges of triangles; either sandwiched */ -/* between two triangles, or resting against one triangle on an exterior */ -/* boundary or hole boundary. */ -/* */ -/* A shell edge consists of a list of two vertices, a list of two */ -/* adjoining shell edges, and a list of two adjoining triangles. One of */ -/* the two adjoining triangles may not be present (though there should */ -/* always be one), and neighboring shell edges might not be present. */ -/* Shell edges also store a user-defined integer "boundary marker". */ -/* Typically, this integer is used to indicate what sort of boundary */ -/* conditions are to be applied at that location in a finite element */ -/* simulation. */ -/* */ -/* Like triangles, shell edges maintain information about the relative */ -/* orientation of neighboring objects. */ -/* */ -/* Points are relatively simple. A point is a list of floating point */ -/* numbers, starting with the x, and y coordinates, followed by an */ -/* arbitrary number of optional user-defined floating-point attributes, */ -/* followed by an integer boundary marker. During the segment insertion */ -/* phase, there is also a pointer from each point to a triangle that may */ -/* contain it. Each pointer is not always correct, but when one is, it */ -/* speeds up segment insertion. These pointers are assigned values once */ -/* at the beginning of the segment insertion phase, and are not used or */ -/* updated at any other time. Edge swapping during segment insertion will */ -/* render some of them incorrect. Hence, don't rely upon them for */ -/* anything. For the most part, points do not have any information about */ -/* what triangles or shell edges they are linked to. */ -/* */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* Handles */ -/* */ -/* The oriented triangle (`triedge') and oriented shell edge (`edge') data */ -/* structures defined below do not themselves store any part of the mesh. */ -/* The mesh itself is made of `triangle's, `shelle's, and `point's. */ -/* */ -/* Oriented triangles and oriented shell edges will usually be referred to */ -/* as "handles". A handle is essentially a pointer into the mesh; it */ -/* allows you to "hold" one particular part of the mesh. Handles are used */ -/* to specify the regions in which one is traversing and modifying the mesh.*/ -/* A single `triangle' may be held by many handles, or none at all. (The */ -/* latter case is not a memory leak, because the triangle is still */ -/* connected to other triangles in the mesh.) */ -/* */ -/* A `triedge' is a handle that holds a triangle. It holds a specific side */ -/* of the triangle. An `edge' is a handle that holds a shell edge. It */ -/* holds either the left or right side of the edge. */ -/* */ -/* Navigation about the mesh is accomplished through a set of mesh */ -/* manipulation primitives, further below. Many of these primitives take */ -/* a handle and produce a new handle that holds the mesh near the first */ -/* handle. Other primitives take two handles and glue the corresponding */ -/* parts of the mesh together. The exact position of the handles is */ -/* important. For instance, when two triangles are glued together by the */ -/* bond() primitive, they are glued by the sides on which the handles lie. */ -/* */ -/* Because points have no information about which triangles they are */ -/* attached to, I commonly represent a point by use of a handle whose */ -/* origin is the point. A single handle can simultaneously represent a */ -/* triangle, an edge, and a point. */ -/* */ -/*****************************************************************************/ - -/* The triangle data structure. Each triangle contains three pointers to */ -/* adjoining triangles, plus three pointers to vertex points, plus three */ -/* pointers to shell edges (defined below; these pointers are usually */ -/* `dummysh'). It may or may not also contain user-defined attributes */ -/* and/or a floating-point "area constraint". It may also contain extra */ -/* pointers for nodes, when the user asks for high-order elements. */ -/* Because the size and structure of a `triangle' is not decided until */ -/* runtime, I haven't simply defined the type `triangle' to be a struct. */ - -typedef REAL **triangle; /* Really: typedef triangle *triangle */ - -/* An oriented triangle: includes a pointer to a triangle and orientation. */ -/* The orientation denotes an edge of the triangle. Hence, there are */ -/* three possible orientations. By convention, each edge is always */ -/* directed to point counterclockwise about the corresponding triangle. */ - -struct triedge { - triangle *tri; - int orient; /* Ranges from 0 to 2. */ -}; - -/* The shell data structure. Each shell edge contains two pointers to */ -/* adjoining shell edges, plus two pointers to vertex points, plus two */ -/* pointers to adjoining triangles, plus one shell marker. */ - -typedef REAL **shelle; /* Really: typedef shelle *shelle */ - -/* An oriented shell edge: includes a pointer to a shell edge and an */ -/* orientation. The orientation denotes a side of the edge. Hence, there */ -/* are two possible orientations. By convention, the edge is always */ -/* directed so that the "side" denoted is the right side of the edge. */ - -struct edge { - shelle *sh; - int shorient; /* Ranges from 0 to 1. */ -}; - -/* The point data structure. Each point is actually an array of REALs. */ -/* The number of REALs is unknown until runtime. An integer boundary */ -/* marker, and sometimes a pointer to a triangle, is appended after the */ -/* REALs. */ - -typedef REAL *point; - -/* A queue used to store encroached segments. Each segment's vertices are */ -/* stored so that one can check whether a segment is still the same. */ - -struct badsegment { - struct edge encsegment; /* An encroached segment. */ - point segorg, segdest; /* The two vertices. */ - struct badsegment *nextsegment; /* Pointer to next encroached segment. */ -}; - -/* A queue used to store bad triangles. The key is the square of the cosine */ -/* of the smallest angle of the triangle. Each triangle's vertices are */ -/* stored so that one can check whether a triangle is still the same. */ - -struct badface { - struct triedge badfacetri; /* A bad triangle. */ - REAL key; /* cos^2 of smallest (apical) angle. */ - point faceorg, facedest, faceapex; /* The three vertices. */ - struct badface *nextface; /* Pointer to next bad triangle. */ -}; - -/* A node in a heap used to store events for the sweepline Delaunay */ -/* algorithm. Nodes do not point directly to their parents or children in */ -/* the heap. Instead, each node knows its position in the heap, and can */ -/* look up its parent and children in a separate array. The `eventptr' */ -/* points either to a `point' or to a triangle (in encoded format, so that */ -/* an orientation is included). In the latter case, the origin of the */ -/* oriented triangle is the apex of a "circle event" of the sweepline */ -/* algorithm. To distinguish site events from circle events, all circle */ -/* events are given an invalid (smaller than `xmin') x-coordinate `xkey'. */ - -struct event { - REAL xkey, ykey; /* Coordinates of the event. */ - VOID *eventptr; /* Can be a point or the location of a circle event. */ - int heapposition; /* Marks this event's position in the heap. */ -}; - -/* A node in the splay tree. Each node holds an oriented ghost triangle */ -/* that represents a boundary edge of the growing triangulation. When a */ -/* circle event covers two boundary edges with a triangle, so that they */ -/* are no longer boundary edges, those edges are not immediately deleted */ -/* from the tree; rather, they are lazily deleted when they are next */ -/* encountered. (Since only a random sample of boundary edges are kept */ -/* in the tree, lazy deletion is faster.) `keydest' is used to verify */ -/* that a triangle is still the same as when it entered the splay tree; if */ -/* it has been rotated (due to a circle event), it no longer represents a */ -/* boundary edge and should be deleted. */ - -struct splaynode { - struct triedge keyedge; /* Lprev of an edge on the front. */ - point keydest; /* Used to verify that splay node is still live. */ - struct splaynode *lchild, *rchild; /* Children in splay tree. */ -}; - -/* A type used to allocate memory. firstblock is the first block of items. */ -/* nowblock is the block from which items are currently being allocated. */ -/* nextitem points to the next slab of free memory for an item. */ -/* deaditemstack is the head of a linked list (stack) of deallocated items */ -/* that can be recycled. unallocateditems is the number of items that */ -/* remain to be allocated from nowblock. */ -/* */ -/* Traversal is the process of walking through the entire list of items, and */ -/* is separate from allocation. Note that a traversal will visit items on */ -/* the "deaditemstack" stack as well as live items. pathblock points to */ -/* the block currently being traversed. pathitem points to the next item */ -/* to be traversed. pathitemsleft is the number of items that remain to */ -/* be traversed in pathblock. */ -/* */ -/* itemwordtype is set to POINTER or FLOATINGPOINT, and is used to suggest */ -/* what sort of word the record is primarily made up of. alignbytes */ -/* determines how new records should be aligned in memory. itembytes and */ -/* itemwords are the length of a record in bytes (after rounding up) and */ -/* words. itemsperblock is the number of items allocated at once in a */ -/* single block. items is the number of currently allocated items. */ -/* maxitems is the maximum number of items that have been allocated at */ -/* once; it is the current number of items plus the number of records kept */ -/* on deaditemstack. */ - -struct memorypool { - VOID **firstblock, **nowblock; - VOID *nextitem; - VOID *deaditemstack; - VOID **pathblock; - VOID *pathitem; - enum wordtype itemwordtype; - int alignbytes; - int itembytes, itemwords; - int itemsperblock; - long items, maxitems; - int unallocateditems; - int pathitemsleft; -}; - -/* Variables used to allocate memory for triangles, shell edges, points, */ -/* viri (triangles being eaten), bad (encroached) segments, bad (skinny */ -/* or too large) triangles, and splay tree nodes. */ - -struct memorypool triangles; -struct memorypool shelles; -struct memorypool points; -struct memorypool viri; -struct memorypool badsegments; -struct memorypool badtriangles; -struct memorypool splaynodes; - -/* Variables that maintain the bad triangle queues. The tails are pointers */ -/* to the pointers that have to be filled in to enqueue an item. */ - -struct badface *queuefront[64]; -struct badface **queuetail[64]; - -REAL xmin, xmax, ymin, ymax; /* x and y bounds. */ -REAL xminextreme; /* Nonexistent x value used as a flag in sweepline. */ -int inpoints; /* Number of input points. */ -int inelements; /* Number of input triangles. */ -int insegments; /* Number of input segments. */ -int holes; /* Number of input holes. */ -int regions; /* Number of input regions. */ -long edges; /* Number of output edges. */ -int mesh_dim; /* Dimension (ought to be 2). */ -int nextras; /* Number of attributes per point. */ -int eextras; /* Number of attributes per triangle. */ -long hullsize; /* Number of edges of convex hull. */ -int triwords; /* Total words per triangle. */ -int shwords; /* Total words per shell edge. */ -int pointmarkindex; /* Index to find boundary marker of a point. */ -int point2triindex; /* Index to find a triangle adjacent to a point. */ -int highorderindex; /* Index to find extra nodes for high-order elements. */ -int elemattribindex; /* Index to find attributes of a triangle. */ -int areaboundindex; /* Index to find area bound of a triangle. */ -int checksegments; /* Are there segments in the triangulation yet? */ -int readnodefile; /* Has a .node file been read? */ -long samples; /* Number of random samples for point location. */ -unsigned long randomseed; /* Current random number seed. */ - -REAL splitter; /* Used to split REAL factors for exact multiplication. */ -REAL epsilon; /* Floating-point machine epsilon. */ -REAL resulterrbound; -REAL ccwerrboundA, ccwerrboundB, ccwerrboundC; -REAL iccerrboundA, iccerrboundB, iccerrboundC; - -long incirclecount; /* Number of incircle tests performed. */ -long counterclockcount; /* Number of counterclockwise tests performed. */ -long hyperbolacount; /* Number of right-of-hyperbola tests performed. */ -long circumcentercount; /* Number of circumcenter calculations performed. */ -long circletopcount; /* Number of circle top calculations performed. */ - -/* Switches for the triangulator. */ -/* poly: -p switch. refine: -r switch. */ -/* quality: -q switch. */ -/* minangle: minimum angle bound, specified after -q switch. */ -/* goodangle: cosine squared of minangle. */ -/* vararea: -a switch without number. */ -/* fixedarea: -a switch with number. */ -/* maxarea: maximum area bound, specified after -a switch. */ -/* regionattrib: -A switch. convex: -c switch. */ -/* firstnumber: inverse of -z switch. All items are numbered starting */ -/* from firstnumber. */ -/* edgesout: -e switch. voronoi: -v switch. */ -/* neighbors: -n switch. geomview: -g switch. */ -/* nobound: -B switch. nopolywritten: -P switch. */ -/* nonodewritten: -N switch. noelewritten: -E switch. */ -/* noiterationnum: -I switch. noholes: -O switch. */ -/* noexact: -X switch. */ -/* order: element order, specified after -o switch. */ -/* nobisect: count of how often -Y switch is selected. */ -/* steiner: maximum number of Steiner points, specified after -S switch. */ -/* steinerleft: number of Steiner points not yet used. */ -/* incremental: -i switch. sweepline: -F switch. */ -/* dwyer: inverse of -l switch. */ -/* splitseg: -s switch. */ -/* docheck: -C switch. */ -/* quiet: -Q switch. verbose: count of how often -V switch is selected. */ -/* useshelles: -p, -r, -q, or -c switch; determines whether shell edges */ -/* are used at all. */ -/* */ -/* Read the instructions to find out the meaning of these switches. */ - -int poly, refine, quality, vararea, fixedarea, regionattrib, convex; -int firstnumber; -int edgesout, voronoi, neighbors, geomview; -int nobound, nopolywritten, nonodewritten, noelewritten, noiterationnum; -int noholes, noexact; -int incremental, sweepline, dwyer; -int splitseg; -int docheck; -int quiet, verbose; -int useshelles; -int order; -int nobisect; -int steiner, steinerleft; -REAL minangle, goodangle; -REAL maxarea; - -/* Variables for file names. */ - -#ifndef TRILIBRARY -char innodefilename[FILENAMESIZE]; -char inelefilename[FILENAMESIZE]; -char inpolyfilename[FILENAMESIZE]; -char areafilename[FILENAMESIZE]; -char outnodefilename[FILENAMESIZE]; -char outelefilename[FILENAMESIZE]; -char outpolyfilename[FILENAMESIZE]; -char edgefilename[FILENAMESIZE]; -char vnodefilename[FILENAMESIZE]; -char vedgefilename[FILENAMESIZE]; -char neighborfilename[FILENAMESIZE]; -char offfilename[FILENAMESIZE]; -#endif /* not TRILIBRARY */ - -/* Triangular bounding box points. */ - -point infpoint1, infpoint2, infpoint3; - -/* Pointer to the `triangle' that occupies all of "outer space". */ - -triangle *dummytri; -triangle *dummytribase; /* Keep base address so we can free() it later. */ - -/* Pointer to the omnipresent shell edge. Referenced by any triangle or */ -/* shell edge that isn't really connected to a shell edge at that */ -/* location. */ - -shelle *dummysh; -shelle *dummyshbase; /* Keep base address so we can free() it later. */ - -/* Pointer to a recently visited triangle. Improves point location if */ -/* proximate points are inserted sequentially. */ - -struct triedge recenttri; - -/*****************************************************************************/ -/* */ -/* Mesh manipulation primitives. Each triangle contains three pointers to */ -/* other triangles, with orientations. Each pointer points not to the */ -/* first byte of a triangle, but to one of the first three bytes of a */ -/* triangle. It is necessary to extract both the triangle itself and the */ -/* orientation. To save memory, I keep both pieces of information in one */ -/* pointer. To make this possible, I assume that all triangles are aligned */ -/* to four-byte boundaries. The `decode' routine below decodes a pointer, */ -/* extracting an orientation (in the range 0 to 2) and a pointer to the */ -/* beginning of a triangle. The `encode' routine compresses a pointer to a */ -/* triangle and an orientation into a single pointer. My assumptions that */ -/* triangles are four-byte-aligned and that the `unsigned long' type is */ -/* long enough to hold a pointer are two of the few kludges in this program.*/ -/* */ -/* Shell edges are manipulated similarly. A pointer to a shell edge */ -/* carries both an address and an orientation in the range 0 to 1. */ -/* */ -/* The other primitives take an oriented triangle or oriented shell edge, */ -/* and return an oriented triangle or oriented shell edge or point; or they */ -/* change the connections in the data structure. */ -/* */ -/*****************************************************************************/ - -/********* Mesh manipulation primitives begin here *********/ -/** **/ -/** **/ - -/* Fast lookup arrays to speed some of the mesh manipulation primitives. */ - -int plus1mod3[3] = {1, 2, 0}; -int minus1mod3[3] = {2, 0, 1}; - -/********* Primitives for triangles *********/ -/* */ -/* */ - -/* decode() converts a pointer to an oriented triangle. The orientation is */ -/* extracted from the two least significant bits of the pointer. */ - -#define decode(ptr, triedge) \ - (triedge).orient = (int) ((unsigned long) (ptr) & (unsigned long) 3l); \ - (triedge).tri = (triangle *) \ - ((unsigned long) (ptr) ^ (unsigned long) (triedge).orient) - -/* encode() compresses an oriented triangle into a single pointer. It */ -/* relies on the assumption that all triangles are aligned to four-byte */ -/* boundaries, so the two least significant bits of (triedge).tri are zero.*/ - -#define encode(triedge) \ - (triangle) ((unsigned long) (triedge).tri | (unsigned long) (triedge).orient) - -/* The following edge manipulation primitives are all described by Guibas */ -/* and Stolfi. However, they use an edge-based data structure, whereas I */ -/* am using a triangle-based data structure. */ - -/* sym() finds the abutting triangle, on the same edge. Note that the */ -/* edge direction is necessarily reversed, because triangle/edge handles */ -/* are always directed counterclockwise around the triangle. */ - -#define sym(triedge1, triedge2) \ - ptr = (triedge1).tri[(triedge1).orient]; \ - decode(ptr, triedge2); - -#define symself(triedge) \ - ptr = (triedge).tri[(triedge).orient]; \ - decode(ptr, triedge); - -/* lnext() finds the next edge (counterclockwise) of a triangle. */ - -#define lnext(triedge1, triedge2) \ - (triedge2).tri = (triedge1).tri; \ - (triedge2).orient = plus1mod3[(triedge1).orient] - -#define lnextself(triedge) \ - (triedge).orient = plus1mod3[(triedge).orient] - -/* lprev() finds the previous edge (clockwise) of a triangle. */ - -#define lprev(triedge1, triedge2) \ - (triedge2).tri = (triedge1).tri; \ - (triedge2).orient = minus1mod3[(triedge1).orient] - -#define lprevself(triedge) \ - (triedge).orient = minus1mod3[(triedge).orient] - -/* onext() spins counterclockwise around a point; that is, it finds the next */ -/* edge with the same origin in the counterclockwise direction. This edge */ -/* will be part of a different triangle. */ - -#define onext(triedge1, triedge2) \ - lprev(triedge1, triedge2); \ - symself(triedge2); - -#define onextself(triedge) \ - lprevself(triedge); \ - symself(triedge); - -/* oprev() spins clockwise around a point; that is, it finds the next edge */ -/* with the same origin in the clockwise direction. This edge will be */ -/* part of a different triangle. */ - -#define oprev(triedge1, triedge2) \ - sym(triedge1, triedge2); \ - lnextself(triedge2); - -#define oprevself(triedge) \ - symself(triedge); \ - lnextself(triedge); - -/* dnext() spins counterclockwise around a point; that is, it finds the next */ -/* edge with the same destination in the counterclockwise direction. This */ -/* edge will be part of a different triangle. */ - -#define dnext(triedge1, triedge2) \ - sym(triedge1, triedge2); \ - lprevself(triedge2); - -#define dnextself(triedge) \ - symself(triedge); \ - lprevself(triedge); - -/* dprev() spins clockwise around a point; that is, it finds the next edge */ -/* with the same destination in the clockwise direction. This edge will */ -/* be part of a different triangle. */ - -#define dprev(triedge1, triedge2) \ - lnext(triedge1, triedge2); \ - symself(triedge2); - -#define dprevself(triedge) \ - lnextself(triedge); \ - symself(triedge); - -/* rnext() moves one edge counterclockwise about the adjacent triangle. */ -/* (It's best understood by reading Guibas and Stolfi. It involves */ -/* changing triangles twice.) */ - -#define rnext(triedge1, triedge2) \ - sym(triedge1, triedge2); \ - lnextself(triedge2); \ - symself(triedge2); - -#define rnextself(triedge) \ - symself(triedge); \ - lnextself(triedge); \ - symself(triedge); - -/* rnext() moves one edge clockwise about the adjacent triangle. */ -/* (It's best understood by reading Guibas and Stolfi. It involves */ -/* changing triangles twice.) */ - -#define rprev(triedge1, triedge2) \ - sym(triedge1, triedge2); \ - lprevself(triedge2); \ - symself(triedge2); - -#define rprevself(triedge) \ - symself(triedge); \ - lprevself(triedge); \ - symself(triedge); - -/* These primitives determine or set the origin, destination, or apex of a */ -/* triangle. */ - -#define org(triedge, pointptr) \ - pointptr = (point) (triedge).tri[plus1mod3[(triedge).orient] + 3] - -#define dest(triedge, pointptr) \ - pointptr = (point) (triedge).tri[minus1mod3[(triedge).orient] + 3] - -#define apex(triedge, pointptr) \ - pointptr = (point) (triedge).tri[(triedge).orient + 3] - -#define setorg(triedge, pointptr) \ - (triedge).tri[plus1mod3[(triedge).orient] + 3] = (triangle) pointptr - -#define setdest(triedge, pointptr) \ - (triedge).tri[minus1mod3[(triedge).orient] + 3] = (triangle) pointptr - -#define setapex(triedge, pointptr) \ - (triedge).tri[(triedge).orient + 3] = (triangle) pointptr - -#define setvertices2null(triedge) \ - (triedge).tri[3] = (triangle) NULL; \ - (triedge).tri[4] = (triangle) NULL; \ - (triedge).tri[5] = (triangle) NULL; - -/* Bond two triangles together. */ - -#define bond(triedge1, triedge2) \ - (triedge1).tri[(triedge1).orient] = encode(triedge2); \ - (triedge2).tri[(triedge2).orient] = encode(triedge1) - -/* Dissolve a bond (from one side). Note that the other triangle will still */ -/* think it's connected to this triangle. Usually, however, the other */ -/* triangle is being deleted entirely, or bonded to another triangle, so */ -/* it doesn't matter. */ - -#define dissolve(triedge) \ - (triedge).tri[(triedge).orient] = (triangle) dummytri - -/* Copy a triangle/edge handle. */ - -#define triedgecopy(triedge1, triedge2) \ - (triedge2).tri = (triedge1).tri; \ - (triedge2).orient = (triedge1).orient - -/* Test for equality of triangle/edge handles. */ - -#define triedgeequal(triedge1, triedge2) \ - (((triedge1).tri == (triedge2).tri) && \ - ((triedge1).orient == (triedge2).orient)) - -/* Primitives to infect or cure a triangle with the virus. These rely on */ -/* the assumption that all shell edges are aligned to four-byte boundaries.*/ - -#define infect(triedge) \ - (triedge).tri[6] = (triangle) \ - ((unsigned long) (triedge).tri[6] | (unsigned long) 2l) - -#define uninfect(triedge) \ - (triedge).tri[6] = (triangle) \ - ((unsigned long) (triedge).tri[6] & ~ (unsigned long) 2l) - -/* Test a triangle for viral infection. */ - -#define infected(triedge) \ - (((unsigned long) (triedge).tri[6] & (unsigned long) 2l) != 0) - -/* Check or set a triangle's attributes. */ - -#define elemattribute(triedge, attnum) \ - ((REAL *) (triedge).tri)[elemattribindex + (attnum)] - -#define setelemattribute(triedge, attnum, value) \ - ((REAL *) (triedge).tri)[elemattribindex + (attnum)] = value - -/* Check or set a triangle's maximum area bound. */ - -#define areabound(triedge) ((REAL *) (triedge).tri)[areaboundindex] - -#define setareabound(triedge, value) \ - ((REAL *) (triedge).tri)[areaboundindex] = value - -/********* Primitives for shell edges *********/ -/* */ -/* */ - -/* sdecode() converts a pointer to an oriented shell edge. The orientation */ -/* is extracted from the least significant bit of the pointer. The two */ -/* least significant bits (one for orientation, one for viral infection) */ -/* are masked out to produce the real pointer. */ - -#define sdecode(sptr, edge) \ - (edge).shorient = (int) ((unsigned long) (sptr) & (unsigned long) 1l); \ - (edge).sh = (shelle *) \ - ((unsigned long) (sptr) & ~ (unsigned long) 3l) - -/* sencode() compresses an oriented shell edge into a single pointer. It */ -/* relies on the assumption that all shell edges are aligned to two-byte */ -/* boundaries, so the least significant bit of (edge).sh is zero. */ - -#define sencode(edge) \ - (shelle) ((unsigned long) (edge).sh | (unsigned long) (edge).shorient) - -/* ssym() toggles the orientation of a shell edge. */ - -#define ssym(edge1, edge2) \ - (edge2).sh = (edge1).sh; \ - (edge2).shorient = 1 - (edge1).shorient - -#define ssymself(edge) \ - (edge).shorient = 1 - (edge).shorient - -/* spivot() finds the other shell edge (from the same segment) that shares */ -/* the same origin. */ - -#define spivot(edge1, edge2) \ - sptr = (edge1).sh[(edge1).shorient]; \ - sdecode(sptr, edge2) - -#define spivotself(edge) \ - sptr = (edge).sh[(edge).shorient]; \ - sdecode(sptr, edge) - -/* snext() finds the next shell edge (from the same segment) in sequence; */ -/* one whose origin is the input shell edge's destination. */ - -#define snext(edge1, edge2) \ - sptr = (edge1).sh[1 - (edge1).shorient]; \ - sdecode(sptr, edge2) - -#define snextself(edge) \ - sptr = (edge).sh[1 - (edge).shorient]; \ - sdecode(sptr, edge) - -/* These primitives determine or set the origin or destination of a shell */ -/* edge. */ - -#define sorg(edge, pointptr) \ - pointptr = (point) (edge).sh[2 + (edge).shorient] - -#define sdest(edge, pointptr) \ - pointptr = (point) (edge).sh[3 - (edge).shorient] - -#define setsorg(edge, pointptr) \ - (edge).sh[2 + (edge).shorient] = (shelle) pointptr - -#define setsdest(edge, pointptr) \ - (edge).sh[3 - (edge).shorient] = (shelle) pointptr - -/* These primitives read or set a shell marker. Shell markers are used to */ -/* hold user boundary information. */ - -#define mark(edge) (* (int *) ((edge).sh + 6)) - -#define setmark(edge, value) \ - * (int *) ((edge).sh + 6) = value - -/* Bond two shell edges together. */ - -#define sbond(edge1, edge2) \ - (edge1).sh[(edge1).shorient] = sencode(edge2); \ - (edge2).sh[(edge2).shorient] = sencode(edge1) - -/* Dissolve a shell edge bond (from one side). Note that the other shell */ -/* edge will still think it's connected to this shell edge. */ - -#define sdissolve(edge) \ - (edge).sh[(edge).shorient] = (shelle) dummysh - -/* Copy a shell edge. */ - -#define shellecopy(edge1, edge2) \ - (edge2).sh = (edge1).sh; \ - (edge2).shorient = (edge1).shorient - -/* Test for equality of shell edges. */ - -#define shelleequal(edge1, edge2) \ - (((edge1).sh == (edge2).sh) && \ - ((edge1).shorient == (edge2).shorient)) - -/********* Primitives for interacting triangles and shell edges *********/ -/* */ -/* */ - -/* tspivot() finds a shell edge abutting a triangle. */ - -#define tspivot(triedge, edge) \ - sptr = (shelle) (triedge).tri[6 + (triedge).orient]; \ - sdecode(sptr, edge) - -/* stpivot() finds a triangle abutting a shell edge. It requires that the */ -/* variable `ptr' of type `triangle' be defined. */ - -#define stpivot(edge, triedge) \ - ptr = (triangle) (edge).sh[4 + (edge).shorient]; \ - decode(ptr, triedge) - -/* Bond a triangle to a shell edge. */ - -#define tsbond(triedge, edge) \ - (triedge).tri[6 + (triedge).orient] = (triangle) sencode(edge); \ - (edge).sh[4 + (edge).shorient] = (shelle) encode(triedge) - -/* Dissolve a bond (from the triangle side). */ - -#define tsdissolve(triedge) \ - (triedge).tri[6 + (triedge).orient] = (triangle) dummysh - -/* Dissolve a bond (from the shell edge side). */ - -#define stdissolve(edge) \ - (edge).sh[4 + (edge).shorient] = (shelle) dummytri - -/********* Primitives for points *********/ -/* */ -/* */ - -#define pointmark(pt) ((int *) (pt))[pointmarkindex] - -#define setpointmark(pt, value) \ - ((int *) (pt))[pointmarkindex] = value - -#define point2tri(pt) ((triangle *) (pt))[point2triindex] - -#define setpoint2tri(pt, value) \ - ((triangle *) (pt))[point2triindex] = value - -/** **/ -/** **/ -/********* Mesh manipulation primitives end here *********/ - -/********* User interaction routines begin here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* syntax() Print list of command line switches. */ -/* */ -/*****************************************************************************/ - -#ifndef TRILIBRARY - -void syntax() -{ -#ifdef CDT_ONLY -#ifdef REDUCED - printf("triangle [-pAcevngBPNEIOXzo_lQVh] input_file\n"); -#else /* not REDUCED */ - printf("triangle [-pAcevngBPNEIOXzo_iFlCQVh] input_file\n"); -#endif /* not REDUCED */ -#else /* not CDT_ONLY */ -#ifdef REDUCED - printf("triangle [-prq__a__AcevngBPNEIOXzo_YS__lQVh] input_file\n"); -#else /* not REDUCED */ - printf("triangle [-prq__a__AcevngBPNEIOXzo_YS__iFlsCQVh] input_file\n"); -#endif /* not REDUCED */ -#endif /* not CDT_ONLY */ - - printf(" -p Triangulates a Planar Straight Line Graph (.poly file).\n"); -#ifndef CDT_ONLY - printf(" -r Refines a previously generated mesh.\n"); - printf( - " -q Quality mesh generation. A minimum angle may be specified.\n"); - printf(" -a Applies a maximum triangle area constraint.\n"); -#endif /* not CDT_ONLY */ - printf( - " -A Applies attributes to identify elements in certain regions.\n"); - printf(" -c Encloses the convex hull with segments.\n"); - printf(" -e Generates an edge list.\n"); - printf(" -v Generates a Voronoi diagram.\n"); - printf(" -n Generates a list of triangle neighbors.\n"); - printf(" -g Generates an .off file for Geomview.\n"); - printf(" -B Suppresses output of boundary information.\n"); - printf(" -P Suppresses output of .poly file.\n"); - printf(" -N Suppresses output of .node file.\n"); - printf(" -E Suppresses output of .ele file.\n"); - printf(" -I Suppresses mesh iteration numbers.\n"); - printf(" -O Ignores holes in .poly file.\n"); - printf(" -X Suppresses use of exact arithmetic.\n"); - printf(" -z Numbers all items starting from zero (rather than one).\n"); - printf(" -o2 Generates second-order subparametric elements.\n"); -#ifndef CDT_ONLY - printf(" -Y Suppresses boundary segment splitting.\n"); - printf(" -S Specifies maximum number of added Steiner points.\n"); -#endif /* not CDT_ONLY */ -#ifndef REDUCED - printf(" -i Uses incremental method, rather than divide-and-conquer.\n"); - printf(" -F Uses Fortune's sweepline algorithm, rather than d-and-c.\n"); -#endif /* not REDUCED */ - printf(" -l Uses vertical cuts only, rather than alternating cuts.\n"); -#ifndef REDUCED -#ifndef CDT_ONLY - printf( - " -s Force segments into mesh by splitting (instead of using CDT).\n"); -#endif /* not CDT_ONLY */ - printf(" -C Check consistency of final mesh.\n"); -#endif /* not REDUCED */ - printf(" -Q Quiet: No terminal output except errors.\n"); - printf(" -V Verbose: Detailed information on what I'm doing.\n"); - printf(" -h Help: Detailed instructions for Triangle.\n"); - exit(0); -} - -#endif /* not TRILIBRARY */ - -/*****************************************************************************/ -/* */ -/* info() Print out complete instructions. */ -/* */ -/*****************************************************************************/ - -#ifndef TRILIBRARY - -void info() -{ - printf("Triangle\n"); - printf( -"A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator.\n"); - printf("Version 1.3\n\n"); - printf( -"Copyright 1996 Jonathan Richard Shewchuk (bugs/comments to jrs@cs.cmu.edu)\n" -); - printf("School of Computer Science / Carnegie Mellon University\n"); - printf("5000 Forbes Avenue / Pittsburgh, Pennsylvania 15213-3891\n"); - printf( -"Created as part of the Archimedes project (tools for parallel FEM).\n"); - printf( -"Supported in part by NSF Grant CMS-9318163 and an NSERC 1967 Scholarship.\n"); - printf("There is no warranty whatsoever. Use at your own risk.\n"); -#ifdef SINGLE - printf("This executable is compiled for single precision arithmetic.\n\n\n"); -#else /* not SINGLE */ - printf("This executable is compiled for double precision arithmetic.\n\n\n"); -#endif /* not SINGLE */ - printf( -"Triangle generates exact Delaunay triangulations, constrained Delaunay\n"); - printf( -"triangulations, and quality conforming Delaunay triangulations. The latter\n" -); - printf( -"can be generated with no small angles, and are thus suitable for finite\n"); - printf( -"element analysis. If no command line switches are specified, your .node\n"); - printf( -"input file will be read, and the Delaunay triangulation will be returned in\n" -); - printf(".node and .ele output files. The command syntax is:\n\n"); -#ifdef CDT_ONLY -#ifdef REDUCED - printf("triangle [-pAcevngBPNEIOXzo_lQVh] input_file\n\n"); -#else /* not REDUCED */ - printf("triangle [-pAcevngBPNEIOXzo_iFlCQVh] input_file\n\n"); -#endif /* not REDUCED */ -#else /* not CDT_ONLY */ -#ifdef REDUCED - printf("triangle [-prq__a__AcevngBPNEIOXzo_YS__lQVh] input_file\n\n"); -#else /* not REDUCED */ - printf("triangle [-prq__a__AcevngBPNEIOXzo_YS__iFlsCQVh] input_file\n\n"); -#endif /* not REDUCED */ -#endif /* not CDT_ONLY */ - printf( -"Underscores indicate that numbers may optionally follow certain switches;\n"); - printf( -"do not leave any space between a switch and its numeric parameter.\n"); - printf( -"input_file must be a file with extension .node, or extension .poly if the\n"); - printf( -"-p switch is used. If -r is used, you must supply .node and .ele files,\n"); - printf( -"and possibly a .poly file and .area file as well. The formats of these\n"); - printf("files are described below.\n\n"); - printf("Command Line Switches:\n\n"); - printf( -" -p Reads a Planar Straight Line Graph (.poly file), which can specify\n" -); - printf( -" points, segments, holes, and regional attributes and area\n"); - printf( -" constraints. Will generate a constrained Delaunay triangulation\n"); - printf( -" fitting the input; or, if -s, -q, or -a is used, a conforming\n"); - printf( -" Delaunay triangulation. If -p is not used, Triangle reads a .node\n" -); - printf(" file by default.\n"); - printf( -" -r Refines a previously generated mesh. The mesh is read from a .node\n" -); - printf( -" file and an .ele file. If -p is also used, a .poly file is read\n"); - printf( -" and used to constrain edges in the mesh. Further details on\n"); - printf(" refinement are given below.\n"); - printf( -" -q Quality mesh generation by Jim Ruppert's Delaunay refinement\n"); - printf( -" algorithm. Adds points to the mesh to ensure that no angles\n"); - printf( -" smaller than 20 degrees occur. An alternative minimum angle may be\n" -); - printf( -" specified after the `q'. If the minimum angle is 20.7 degrees or\n"); - printf( -" smaller, the triangulation algorithm is theoretically guaranteed to\n" -); - printf( -" terminate (assuming infinite precision arithmetic - Triangle may\n"); - printf( -" fail to terminate if you run out of precision). In practice, the\n"); - printf( -" algorithm often succeeds for minimum angles up to 33.8 degrees.\n"); - printf( -" For highly refined meshes, however, it may be necessary to reduce\n"); - printf( -" the minimum angle to well below 20 to avoid problems associated\n"); - printf( -" with insufficient floating-point precision. The specified angle\n"); - printf(" may include a decimal point.\n"); - printf( -" -a Imposes a maximum triangle area. If a number follows the `a', no\n"); - printf( -" triangle will be generated whose area is larger than that number.\n"); - printf( -" If no number is specified, an .area file (if -r is used) or .poly\n"); - printf( -" file (if -r is not used) specifies a number of maximum area\n"); - printf( -" constraints. An .area file contains a separate area constraint for\n" -); - printf( -" each triangle, and is useful for refining a finite element mesh\n"); - printf( -" based on a posteriori error estimates. A .poly file can optionally\n" -); - printf( -" contain an area constraint for each segment-bounded region, thereby\n" -); - printf( -" enforcing triangle densities in a first triangulation. You can\n"); - printf( -" impose both a fixed area constraint and a varying area constraint\n"); - printf( -" by invoking the -a switch twice, once with and once without a\n"); - printf( -" number following. Each area specified may include a decimal point.\n" -); - printf( -" -A Assigns an additional attribute to each triangle that identifies\n"); - printf( -" what segment-bounded region each triangle belongs to. Attributes\n"); - printf( -" are assigned to regions by the .poly file. If a region is not\n"); - printf( -" explicitly marked by the .poly file, triangles in that region are\n"); - printf( -" assigned an attribute of zero. The -A switch has an effect only\n"); - printf(" when the -p switch is used and the -r switch is not.\n"); - printf( -" -c Creates segments on the convex hull of the triangulation. If you\n"); - printf( -" are triangulating a point set, this switch causes a .poly file to\n"); - printf( -" be written, containing all edges in the convex hull. (By default,\n" -); - printf( -" a .poly file is written only if a .poly file is read.) If you are\n" -); - printf( -" triangulating a PSLG, this switch specifies that the interior of\n"); - printf( -" the convex hull of the PSLG should be triangulated. If you do not\n" -); - printf( -" use this switch when triangulating a PSLG, it is assumed that you\n"); - printf( -" have identified the region to be triangulated by surrounding it\n"); - printf( -" with segments of the input PSLG. Beware: if you are not careful,\n" -); - printf( -" this switch can cause the introduction of an extremely thin angle\n"); - printf( -" between a PSLG segment and a convex hull segment, which can cause\n"); - printf( -" overrefinement or failure if Triangle runs out of precision. If\n"); - printf( -" you are refining a mesh, the -c switch works differently; it\n"); - printf( -" generates the set of boundary edges of the mesh, rather than the\n"); - printf(" convex hull.\n"); - printf( -" -e Outputs (to an .edge file) a list of edges of the triangulation.\n"); - printf( -" -v Outputs the Voronoi diagram associated with the triangulation.\n"); - printf(" Does not attempt to detect degeneracies.\n"); - printf( -" -n Outputs (to a .neigh file) a list of triangles neighboring each\n"); - printf(" triangle.\n"); - printf( -" -g Outputs the mesh to an Object File Format (.off) file, suitable for\n" -); - printf(" viewing with the Geometry Center's Geomview package.\n"); - printf( -" -B No boundary markers in the output .node, .poly, and .edge output\n"); - printf( -" files. See the detailed discussion of boundary markers below.\n"); - printf( -" -P No output .poly file. Saves disk space, but you lose the ability\n"); - printf( -" to impose segment constraints on later refinements of the mesh.\n"); - printf(" -N No output .node file.\n"); - printf(" -E No output .ele file.\n"); - printf( -" -I No iteration numbers. Suppresses the output of .node and .poly\n"); - printf( -" files, so your input files won't be overwritten. (If your input is\n" -); - printf( -" a .poly file only, a .node file will be written.) Cannot be used\n"); - printf( -" with the -r switch, because that would overwrite your input .ele\n"); - printf( -" file. Shouldn't be used with the -s, -q, or -a switch if you are\n"); - printf( -" using a .node file for input, because no .node file will be\n"); - printf(" written, so there will be no record of any added points.\n"); - printf(" -O No holes. Ignores the holes in the .poly file.\n"); - printf( -" -X No exact arithmetic. Normally, Triangle uses exact floating-point\n" -); - printf( -" arithmetic for certain tests if it thinks the inexact tests are not\n" -); - printf( -" accurate enough. Exact arithmetic ensures the robustness of the\n"); - printf( -" triangulation algorithms, despite floating-point roundoff error.\n"); - printf( -" Disabling exact arithmetic with the -X switch will cause a small\n"); - printf( -" improvement in speed and create the possibility (albeit small) that\n" -); - printf( -" Triangle will fail to produce a valid mesh. Not recommended.\n"); - printf( -" -z Numbers all items starting from zero (rather than one). Note that\n" -); - printf( -" this switch is normally overrided by the value used to number the\n"); - printf( -" first point of the input .node or .poly file. However, this switch\n" -); - printf(" is useful when calling Triangle from another program.\n"); - printf( -" -o2 Generates second-order subparametric elements with six nodes each.\n" -); - printf( -" -Y No new points on the boundary. This switch is useful when the mesh\n" -); - printf( -" boundary must be preserved so that it conforms to some adjacent\n"); - printf( -" mesh. Be forewarned that you will probably sacrifice some of the\n"); - printf( -" quality of the mesh; Triangle will try, but the resulting mesh may\n" -); - printf( -" contain triangles of poor aspect ratio. Works well if all the\n"); - printf( -" boundary points are closely spaced. Specify this switch twice\n"); - printf( -" (`-YY') to prevent all segment splitting, including internal\n"); - printf(" boundaries.\n"); - printf( -" -S Specifies the maximum number of Steiner points (points that are not\n" -); - printf( -" in the input, but are added to meet the constraints of minimum\n"); - printf( -" angle and maximum area). The default is to allow an unlimited\n"); - printf( -" number. If you specify this switch with no number after it,\n"); - printf( -" the limit is set to zero. Triangle always adds points at segment\n"); - printf( -" intersections, even if it needs to use more points than the limit\n"); - printf( -" you set. When Triangle inserts segments by splitting (-s), it\n"); - printf( -" always adds enough points to ensure that all the segments appear in\n" -); - printf( -" the triangulation, again ignoring the limit. Be forewarned that\n"); - printf( -" the -S switch may result in a conforming triangulation that is not\n" -); - printf( -" truly Delaunay, because Triangle may be forced to stop adding\n"); - printf( -" points when the mesh is in a state where a segment is non-Delaunay\n" -); - printf( -" and needs to be split. If so, Triangle will print a warning.\n"); - printf( -" -i Uses an incremental rather than divide-and-conquer algorithm to\n"); - printf( -" form a Delaunay triangulation. Try it if the divide-and-conquer\n"); - printf(" algorithm fails.\n"); - printf( -" -F Uses Steven Fortune's sweepline algorithm to form a Delaunay\n"); - printf( -" triangulation. Warning: does not use exact arithmetic for all\n"); - printf(" calculations. An exact result is not guaranteed.\n"); - printf( -" -l Uses only vertical cuts in the divide-and-conquer algorithm. By\n"); - printf( -" default, Triangle uses alternating vertical and horizontal cuts,\n"); - printf( -" which usually improve the speed except with point sets that are\n"); - printf( -" small or short and wide. This switch is primarily of theoretical\n"); - printf(" interest.\n"); - printf( -" -s Specifies that segments should be forced into the triangulation by\n" -); - printf( -" recursively splitting them at their midpoints, rather than by\n"); - printf( -" generating a constrained Delaunay triangulation. Segment splitting\n" -); - printf( -" is true to Ruppert's original algorithm, but can create needlessly\n" -); - printf(" small triangles near external small features.\n"); - printf( -" -C Check the consistency of the final mesh. Uses exact arithmetic for\n" -); - printf( -" checking, even if the -X switch is used. Useful if you suspect\n"); - printf(" Triangle is buggy.\n"); - printf( -" -Q Quiet: Suppresses all explanation of what Triangle is doing, unless\n" -); - printf(" an error occurs.\n"); - printf( -" -V Verbose: Gives detailed information about what Triangle is doing.\n"); - printf( -" Add more `V's for increasing amount of detail. `-V' gives\n"); - printf( -" information on algorithmic progress and more detailed statistics.\n"); - printf( -" `-VV' gives point-by-point details, and will print so much that\n"); - printf( -" Triangle will run much more slowly. `-VVV' gives information only\n" -); - printf(" a debugger could love.\n"); - printf(" -h Help: Displays these instructions.\n"); - printf("\n"); - printf("Definitions:\n"); - printf("\n"); - printf( -" A Delaunay triangulation of a point set is a triangulation whose vertices\n" -); - printf( -" are the point set, having the property that no point in the point set\n"); - printf( -" falls in the interior of the circumcircle (circle that passes through all\n" -); - printf(" three vertices) of any triangle in the triangulation.\n\n"); - printf( -" A Voronoi diagram of a point set is a subdivision of the plane into\n"); - printf( -" polygonal regions (some of which may be infinite), where each region is\n"); - printf( -" the set of points in the plane that are closer to some input point than\n"); - printf( -" to any other input point. (The Voronoi diagram is the geometric dual of\n" -); - printf(" the Delaunay triangulation.)\n\n"); - printf( -" A Planar Straight Line Graph (PSLG) is a collection of points and\n"); - printf( -" segments. Segments are simply edges, whose endpoints are points in the\n"); - printf( -" PSLG. The file format for PSLGs (.poly files) is described below.\n"); - printf("\n"); - printf( -" A constrained Delaunay triangulation of a PSLG is similar to a Delaunay\n"); - printf( -" triangulation, but each PSLG segment is present as a single edge in the\n"); - printf( -" triangulation. (A constrained Delaunay triangulation is not truly a\n"); - printf(" Delaunay triangulation.)\n\n"); - printf( -" A conforming Delaunay triangulation of a PSLG is a true Delaunay\n"); - printf( -" triangulation in which each PSLG segment may have been subdivided into\n"); - printf( -" several edges by the insertion of additional points. These inserted\n"); - printf( -" points are necessary to allow the segments to exist in the mesh while\n"); - printf(" maintaining the Delaunay property.\n\n"); - printf("File Formats:\n\n"); - printf( -" All files may contain comments prefixed by the character '#'. Points,\n"); - printf( -" triangles, edges, holes, and maximum area constraints must be numbered\n"); - printf( -" consecutively, starting from either 1 or 0. Whichever you choose, all\n"); - printf( -" input files must be consistent; if the nodes are numbered from 1, so must\n" -); - printf( -" be all other objects. Triangle automatically detects your choice while\n"); - printf( -" reading the .node (or .poly) file. (When calling Triangle from another\n"); - printf( -" program, use the -z switch if you wish to number objects from zero.)\n"); - printf(" Examples of these file formats are given below.\n\n"); - printf(" .node files:\n"); - printf( -" First line: <# of points> <# of attributes>\n"); - printf( -" <# of boundary markers (0 or 1)>\n" -); - printf( -" Remaining lines: [attributes] [boundary marker]\n"); - printf("\n"); - printf( -" The attributes, which are typically floating-point values of physical\n"); - printf( -" quantities (such as mass or conductivity) associated with the nodes of\n" -); - printf( -" a finite element mesh, are copied unchanged to the output mesh. If -s,\n" -); - printf( -" -q, or -a is selected, each new Steiner point added to the mesh will\n"); - printf(" have attributes assigned to it by linear interpolation.\n\n"); - printf( -" If the fourth entry of the first line is `1', the last column of the\n"); - printf( -" remainder of the file is assumed to contain boundary markers. Boundary\n" -); - printf( -" markers are used to identify boundary points and points resting on PSLG\n" -); - printf( -" segments; a complete description appears in a section below. The .node\n" -); - printf( -" file produced by Triangle will contain boundary markers in the last\n"); - printf(" column unless they are suppressed by the -B switch.\n\n"); - printf(" .ele files:\n"); - printf( -" First line: <# of triangles> <# of attributes>\n"); - printf( -" Remaining lines: ... [attributes]\n" -); - printf("\n"); - printf( -" Points are indices into the corresponding .node file. The first three\n" -); - printf( -" points are the corners, and are listed in counterclockwise order around\n" -); - printf( -" each triangle. (The remaining points, if any, depend on the type of\n"); - printf( -" finite element used.) The attributes are just like those of .node\n"); - printf( -" files. Because there is no simple mapping from input to output\n"); - printf( -" triangles, an attempt is made to interpolate attributes, which may\n"); - printf( -" result in a good deal of diffusion of attributes among nearby triangles\n" -); - printf( -" as the triangulation is refined. Diffusion does not occur across\n"); - printf( -" segments, so attributes used to identify segment-bounded regions remain\n" -); - printf( -" intact. In output .ele files, all triangles have three points each\n"); - printf( -" unless the -o2 switch is used, in which case they have six, and the\n"); - printf( -" fourth, fifth, and sixth points lie on the midpoints of the edges\n"); - printf(" opposite the first, second, and third corners.\n\n"); - printf(" .poly files:\n"); - printf( -" First line: <# of points> <# of attributes>\n"); - printf( -" <# of boundary markers (0 or 1)>\n" -); - printf( -" Following lines: [attributes] [boundary marker]\n"); - printf(" One line: <# of segments> <# of boundary markers (0 or 1)>\n"); - printf( -" Following lines: [boundary marker]\n"); - printf(" One line: <# of holes>\n"); - printf(" Following lines: \n"); - printf( -" Optional line: <# of regional attributes and/or area constraints>\n"); - printf( -" Optional following lines: \n"); - printf("\n"); - printf( -" A .poly file represents a PSLG, as well as some additional information.\n" -); - printf( -" The first section lists all the points, and is identical to the format\n" -); - printf( -" of .node files. <# of points> may be set to zero to indicate that the\n" -); - printf( -" points are listed in a separate .node file; .poly files produced by\n"); - printf( -" Triangle always have this format. This has the advantage that a point\n" -); - printf( -" set may easily be triangulated with or without segments. (The same\n"); - printf( -" effect can be achieved, albeit using more disk space, by making a copy\n" -); - printf( -" of the .poly file with the extension .node; all sections of the file\n"); - printf(" but the first are ignored.)\n\n"); - printf( -" The second section lists the segments. Segments are edges whose\n"); - printf( -" presence in the triangulation is enforced. Each segment is specified\n"); - printf( -" by listing the indices of its two endpoints. This means that you must\n" -); - printf( -" include its endpoints in the point list. If -s, -q, and -a are not\n"); - printf( -" selected, Triangle will produce a constrained Delaunay triangulation,\n"); - printf( -" in which each segment appears as a single edge in the triangulation.\n"); - printf( -" If -q or -a is selected, Triangle will produce a conforming Delaunay\n"); - printf( -" triangulation, in which segments may be subdivided into smaller edges.\n" -); - printf(" Each segment, like each point, may have a boundary marker.\n\n"); - printf( -" The third section lists holes (and concavities, if -c is selected) in\n"); - printf( -" the triangulation. Holes are specified by identifying a point inside\n"); - printf( -" each hole. After the triangulation is formed, Triangle creates holes\n"); - printf( -" by eating triangles, spreading out from each hole point until its\n"); - printf( -" progress is blocked by PSLG segments; you must be careful to enclose\n"); - printf( -" each hole in segments, or your whole triangulation may be eaten away.\n"); - printf( -" If the two triangles abutting a segment are eaten, the segment itself\n"); - printf( -" is also eaten. Do not place a hole directly on a segment; if you do,\n"); - printf(" Triangle will choose one side of the segment arbitrarily.\n\n"); - printf( -" The optional fourth section lists regional attributes (to be assigned\n"); - printf( -" to all triangles in a region) and regional constraints on the maximum\n"); - printf( -" triangle area. Triangle will read this section only if the -A switch\n"); - printf( -" is used or the -a switch is used without a number following it, and the\n" -); - printf( -" -r switch is not used. Regional attributes and area constraints are\n"); - printf( -" propagated in the same manner as holes; you specify a point for each\n"); - printf( -" attribute and/or constraint, and the attribute and/or constraint will\n"); - printf( -" affect the whole region (bounded by segments) containing the point. If\n" -); - printf( -" two values are written on a line after the x and y coordinate, the\n"); - printf( -" former is assumed to be a regional attribute (but will only be applied\n" -); - printf( -" if the -A switch is selected), and the latter is assumed to be a\n"); - printf( -" regional area constraint (but will only be applied if the -a switch is\n" -); - printf( -" selected). You may also specify just one value after the coordinates,\n" -); - printf( -" which can serve as both an attribute and an area constraint, depending\n" -); - printf( -" on the choice of switches. If you are using the -A and -a switches\n"); - printf( -" simultaneously and wish to assign an attribute to some region without\n"); - printf(" imposing an area constraint, use a negative maximum area.\n\n"); - printf( -" When a triangulation is created from a .poly file, you must either\n"); - printf( -" enclose the entire region to be triangulated in PSLG segments, or\n"); - printf( -" use the -c switch, which encloses the convex hull of the input point\n"); - printf( -" set. If you do not use the -c switch, Triangle will eat all triangles\n" -); - printf( -" on the outer boundary that are not protected by segments; if you are\n"); - printf( -" not careful, your whole triangulation may be eaten away. If you do\n"); - printf( -" use the -c switch, you can still produce concavities by appropriate\n"); - printf(" placement of holes just inside the convex hull.\n\n"); - printf( -" An ideal PSLG has no intersecting segments, nor any points that lie\n"); - printf( -" upon segments (except, of course, the endpoints of each segment.) You\n" -); - printf( -" aren't required to make your .poly files ideal, but you should be aware\n" -); - printf( -" of what can go wrong. Segment intersections are relatively safe -\n"); - printf( -" Triangle will calculate the intersection points for you and add them to\n" -); - printf( -" the triangulation - as long as your machine's floating-point precision\n" -); - printf( -" doesn't become a problem. You are tempting the fates if you have three\n" -); - printf( -" segments that cross at the same location, and expect Triangle to figure\n" -); - printf( -" out where the intersection point is. Thanks to floating-point roundoff\n" -); - printf( -" error, Triangle will probably decide that the three segments intersect\n" -); - printf( -" at three different points, and you will find a minuscule triangle in\n"); - printf( -" your output - unless Triangle tries to refine the tiny triangle, uses\n"); - printf( -" up the last bit of machine precision, and fails to terminate at all.\n"); - printf( -" You're better off putting the intersection point in the input files,\n"); - printf( -" and manually breaking up each segment into two. Similarly, if you\n"); - printf( -" place a point at the middle of a segment, and hope that Triangle will\n"); - printf( -" break up the segment at that point, you might get lucky. On the other\n" -); - printf( -" hand, Triangle might decide that the point doesn't lie precisely on the\n" -); - printf( -" line, and you'll have a needle-sharp triangle in your output - or a lot\n" -); - printf(" of tiny triangles if you're generating a quality mesh.\n\n"); - printf( -" When Triangle reads a .poly file, it also writes a .poly file, which\n"); - printf( -" includes all edges that are part of input segments. If the -c switch\n"); - printf( -" is used, the output .poly file will also include all of the edges on\n"); - printf( -" the convex hull. Hence, the output .poly file is useful for finding\n"); - printf( -" edges associated with input segments and setting boundary conditions in\n" -); - printf( -" finite element simulations. More importantly, you will need it if you\n" -); - printf( -" plan to refine the output mesh, and don't want segments to be missing\n"); - printf(" in later triangulations.\n\n"); - printf(" .area files:\n"); - printf(" First line: <# of triangles>\n"); - printf(" Following lines: \n\n"); - printf( -" An .area file associates with each triangle a maximum area that is used\n" -); - printf( -" for mesh refinement. As with other file formats, every triangle must\n"); - printf( -" be represented, and they must be numbered consecutively. A triangle\n"); - printf( -" may be left unconstrained by assigning it a negative maximum area.\n"); - printf("\n"); - printf(" .edge files:\n"); - printf(" First line: <# of edges> <# of boundary markers (0 or 1)>\n"); - printf( -" Following lines: [boundary marker]\n"); - printf("\n"); - printf( -" Endpoints are indices into the corresponding .node file. Triangle can\n" -); - printf( -" produce .edge files (use the -e switch), but cannot read them. The\n"); - printf( -" optional column of boundary markers is suppressed by the -B switch.\n"); - printf("\n"); - printf( -" In Voronoi diagrams, one also finds a special kind of edge that is an\n"); - printf( -" infinite ray with only one endpoint. For these edges, a different\n"); - printf(" format is used:\n\n"); - printf(" -1 \n\n"); - printf( -" The `direction' is a floating-point vector that indicates the direction\n" -); - printf(" of the infinite ray.\n\n"); - printf(" .neigh files:\n"); - printf( -" First line: <# of triangles> <# of neighbors per triangle (always 3)>\n" -); - printf( -" Following lines: \n"); - printf("\n"); - printf( -" Neighbors are indices into the corresponding .ele file. An index of -1\n" -); - printf( -" indicates a mesh boundary, and therefore no neighbor. Triangle can\n"); - printf( -" produce .neigh files (use the -n switch), but cannot read them.\n"); - printf("\n"); - printf( -" The first neighbor of triangle i is opposite the first corner of\n"); - printf(" triangle i, and so on.\n\n"); - printf("Boundary Markers:\n\n"); - printf( -" Boundary markers are tags used mainly to identify which output points and\n" -); - printf( -" edges are associated with which PSLG segment, and to identify which\n"); - printf( -" points and edges occur on a boundary of the triangulation. A common use\n" -); - printf( -" is to determine where boundary conditions should be applied to a finite\n"); - printf( -" element mesh. You can prevent boundary markers from being written into\n"); - printf(" files produced by Triangle by using the -B switch.\n\n"); - printf( -" The boundary marker associated with each segment in an output .poly file\n" -); - printf(" or edge in an output .edge file is chosen as follows:\n"); - printf( -" - If an output edge is part or all of a PSLG segment with a nonzero\n"); - printf( -" boundary marker, then the edge is assigned the same marker.\n"); - printf( -" - Otherwise, if the edge occurs on a boundary of the triangulation\n"); - printf( -" (including boundaries of holes), then the edge is assigned the marker\n" -); - printf(" one (1).\n"); - printf(" - Otherwise, the edge is assigned the marker zero (0).\n"); - printf( -" The boundary marker associated with each point in an output .node file is\n" -); - printf(" chosen as follows:\n"); - printf( -" - If a point is assigned a nonzero boundary marker in the input file,\n"); - printf( -" then it is assigned the same marker in the output .node file.\n"); - printf( -" - Otherwise, if the point lies on a PSLG segment (including the\n"); - printf( -" segment's endpoints) with a nonzero boundary marker, then the point\n"); - printf( -" is assigned the same marker. If the point lies on several such\n"); - printf(" segments, one of the markers is chosen arbitrarily.\n"); - printf( -" - Otherwise, if the point occurs on a boundary of the triangulation,\n"); - printf(" then the point is assigned the marker one (1).\n"); - printf(" - Otherwise, the point is assigned the marker zero (0).\n"); - printf("\n"); - printf( -" If you want Triangle to determine for you which points and edges are on\n"); - printf( -" the boundary, assign them the boundary marker zero (or use no markers at\n" -); - printf( -" all) in your input files. Alternatively, you can mark some of them and\n"); - printf(" leave others marked zero, allowing Triangle to label them.\n\n"); - printf("Triangulation Iteration Numbers:\n\n"); - printf( -" Because Triangle can read and refine its own triangulations, input\n"); - printf( -" and output files have iteration numbers. For instance, Triangle might\n"); - printf( -" read the files mesh.3.node, mesh.3.ele, and mesh.3.poly, refine the\n"); - printf( -" triangulation, and output the files mesh.4.node, mesh.4.ele, and\n"); - printf(" mesh.4.poly. Files with no iteration number are treated as if\n"); - printf( -" their iteration number is zero; hence, Triangle might read the file\n"); - printf( -" points.node, triangulate it, and produce the files points.1.node and\n"); - printf(" points.1.ele.\n\n"); - printf( -" Iteration numbers allow you to create a sequence of successively finer\n"); - printf( -" meshes suitable for multigrid methods. They also allow you to produce a\n" -); - printf( -" sequence of meshes using error estimate-driven mesh refinement.\n"); - printf("\n"); - printf( -" If you're not using refinement or quality meshing, and you don't like\n"); - printf( -" iteration numbers, use the -I switch to disable them. This switch will\n"); - printf( -" also disable output of .node and .poly files to prevent your input files\n" -); - printf( -" from being overwritten. (If the input is a .poly file that contains its\n" -); - printf(" own points, a .node file will be written.)\n\n"); - printf("Examples of How to Use Triangle:\n\n"); - printf( -" `triangle dots' will read points from dots.node, and write their Delaunay\n" -); - printf( -" triangulation to dots.1.node and dots.1.ele. (dots.1.node will be\n"); - printf( -" identical to dots.node.) `triangle -I dots' writes the triangulation to\n" -); - printf( -" dots.ele instead. (No additional .node file is needed, so none is\n"); - printf(" written.)\n\n"); - printf( -" `triangle -pe object.1' will read a PSLG from object.1.poly (and possibly\n" -); - printf( -" object.1.node, if the points are omitted from object.1.poly) and write\n"); - printf(" their constrained Delaunay triangulation to object.2.node and\n"); - printf( -" object.2.ele. The segments will be copied to object.2.poly, and all\n"); - printf(" edges will be written to object.2.edge.\n\n"); - printf( -" `triangle -pq31.5a.1 object' will read a PSLG from object.poly (and\n"); - printf( -" possibly object.node), generate a mesh whose angles are all greater than\n" -); - printf( -" 31.5 degrees and whose triangles all have area smaller than 0.1, and\n"); - printf( -" write the mesh to object.1.node and object.1.ele. Each segment may have\n" -); - printf( -" been broken up into multiple edges; the resulting constrained edges are\n"); - printf(" written to object.1.poly.\n\n"); - printf( -" Here is a sample file `box.poly' describing a square with a square hole:\n" -); - printf("\n"); - printf( -" # A box with eight points in 2D, no attributes, one boundary marker.\n"); - printf(" 8 2 0 1\n"); - printf(" # Outer box has these vertices:\n"); - printf(" 1 0 0 0\n"); - printf(" 2 0 3 0\n"); - printf(" 3 3 0 0\n"); - printf(" 4 3 3 33 # A special marker for this point.\n"); - printf(" # Inner square has these vertices:\n"); - printf(" 5 1 1 0\n"); - printf(" 6 1 2 0\n"); - printf(" 7 2 1 0\n"); - printf(" 8 2 2 0\n"); - printf(" # Five segments with boundary markers.\n"); - printf(" 5 1\n"); - printf(" 1 1 2 5 # Left side of outer box.\n"); - printf(" 2 5 7 0 # Segments 2 through 5 enclose the hole.\n"); - printf(" 3 7 8 0\n"); - printf(" 4 8 6 10\n"); - printf(" 5 6 5 0\n"); - printf(" # One hole in the middle of the inner square.\n"); - printf(" 1\n"); - printf(" 1 1.5 1.5\n\n"); - printf( -" Note that some segments are missing from the outer square, so one must\n"); - printf( -" use the `-c' switch. After `triangle -pqc box.poly', here is the output\n" -); - printf( -" file `box.1.node', with twelve points. The last four points were added\n"); - printf( -" to meet the angle constraint. Points 1, 2, and 9 have markers from\n"); - printf( -" segment 1. Points 6 and 8 have markers from segment 4. All the other\n"); - printf( -" points but 4 have been marked to indicate that they lie on a boundary.\n"); - printf("\n"); - printf(" 12 2 0 1\n"); - printf(" 1 0 0 5\n"); - printf(" 2 0 3 5\n"); - printf(" 3 3 0 1\n"); - printf(" 4 3 3 33\n"); - printf(" 5 1 1 1\n"); - printf(" 6 1 2 10\n"); - printf(" 7 2 1 1\n"); - printf(" 8 2 2 10\n"); - printf(" 9 0 1.5 5\n"); - printf(" 10 1.5 0 1\n"); - printf(" 11 3 1.5 1\n"); - printf(" 12 1.5 3 1\n"); - printf(" # Generated by triangle -pqc box.poly\n\n"); - printf(" Here is the output file `box.1.ele', with twelve triangles.\n\n"); - printf(" 12 3 0\n"); - printf(" 1 5 6 9\n"); - printf(" 2 10 3 7\n"); - printf(" 3 6 8 12\n"); - printf(" 4 9 1 5\n"); - printf(" 5 6 2 9\n"); - printf(" 6 7 3 11\n"); - printf(" 7 11 4 8\n"); - printf(" 8 7 5 10\n"); - printf(" 9 12 2 6\n"); - printf(" 10 8 7 11\n"); - printf(" 11 5 1 10\n"); - printf(" 12 8 4 12\n"); - printf(" # Generated by triangle -pqc box.poly\n\n"); - printf( -" Here is the output file `box.1.poly'. Note that segments have been added\n" -); - printf( -" to represent the convex hull, and some segments have been split by newly\n" -); - printf( -" added points. Note also that <# of points> is set to zero to indicate\n"); - printf(" that the points should be read from the .node file.\n\n"); - printf(" 0 2 0 1\n"); - printf(" 12 1\n"); - printf(" 1 1 9 5\n"); - printf(" 2 5 7 1\n"); - printf(" 3 8 7 1\n"); - printf(" 4 6 8 10\n"); - printf(" 5 5 6 1\n"); - printf(" 6 3 10 1\n"); - printf(" 7 4 11 1\n"); - printf(" 8 2 12 1\n"); - printf(" 9 9 2 5\n"); - printf(" 10 10 1 1\n"); - printf(" 11 11 3 1\n"); - printf(" 12 12 4 1\n"); - printf(" 1\n"); - printf(" 1 1.5 1.5\n"); - printf(" # Generated by triangle -pqc box.poly\n\n"); - printf("Refinement and Area Constraints:\n\n"); - printf( -" The -r switch causes a mesh (.node and .ele files) to be read and\n"); - printf( -" refined. If the -p switch is also used, a .poly file is read and used to\n" -); - printf( -" specify edges that are constrained and cannot be eliminated (although\n"); - printf( -" they can be divided into smaller edges) by the refinement process.\n"); - printf("\n"); - printf( -" When you refine a mesh, you generally want to impose tighter quality\n"); - printf( -" constraints. One way to accomplish this is to use -q with a larger\n"); - printf( -" angle, or -a followed by a smaller area than you used to generate the\n"); - printf( -" mesh you are refining. Another way to do this is to create an .area\n"); - printf( -" file, which specifies a maximum area for each triangle, and use the -a\n"); - printf( -" switch (without a number following). Each triangle's area constraint is\n" -); - printf( -" applied to that triangle. Area constraints tend to diffuse as the mesh\n"); - printf( -" is refined, so if there are large variations in area constraint between\n"); - printf(" adjacent triangles, you may not get the results you want.\n\n"); - printf( -" If you are refining a mesh composed of linear (three-node) elements, the\n" -); - printf( -" output mesh will contain all the nodes present in the input mesh, in the\n" -); - printf( -" same order, with new nodes added at the end of the .node file. However,\n" -); - printf( -" there is no guarantee that each output element is contained in a single\n"); - printf( -" input element. Often, output elements will overlap two input elements,\n"); - printf( -" and input edges are not present in the output mesh. Hence, a sequence of\n" -); - printf( -" refined meshes will form a hierarchy of nodes, but not a hierarchy of\n"); - printf( -" elements. If you a refining a mesh of higher-order elements, the\n"); - printf( -" hierarchical property applies only to the nodes at the corners of an\n"); - printf(" element; other nodes may not be present in the refined mesh.\n\n"); - printf( -" It is important to understand that maximum area constraints in .poly\n"); - printf( -" files are handled differently from those in .area files. A maximum area\n" -); - printf( -" in a .poly file applies to the whole (segment-bounded) region in which a\n" -); - printf( -" point falls, whereas a maximum area in an .area file applies to only one\n" -); - printf( -" triangle. Area constraints in .poly files are used only when a mesh is\n"); - printf( -" first generated, whereas area constraints in .area files are used only to\n" -); - printf( -" refine an existing mesh, and are typically based on a posteriori error\n"); - printf( -" estimates resulting from a finite element simulation on that mesh.\n"); - printf("\n"); - printf( -" `triangle -rq25 object.1' will read object.1.node and object.1.ele, then\n" -); - printf( -" refine the triangulation to enforce a 25 degree minimum angle, and then\n"); - printf( -" write the refined triangulation to object.2.node and object.2.ele.\n"); - printf("\n"); - printf( -" `triangle -rpaa6.2 z.3' will read z.3.node, z.3.ele, z.3.poly, and\n"); - printf( -" z.3.area. After reconstructing the mesh and its segments, Triangle will\n" -); - printf( -" refine the mesh so that no triangle has area greater than 6.2, and\n"); - printf( -" furthermore the triangles satisfy the maximum area constraints in\n"); - printf( -" z.3.area. The output is written to z.4.node, z.4.ele, and z.4.poly.\n"); - printf("\n"); - printf( -" The sequence `triangle -qa1 x', `triangle -rqa.3 x.1', `triangle -rqa.1\n"); - printf( -" x.2' creates a sequence of successively finer meshes x.1, x.2, and x.3,\n"); - printf(" suitable for multigrid.\n\n"); - printf("Convex Hulls and Mesh Boundaries:\n\n"); - printf( -" If the input is a point set (rather than a PSLG), Triangle produces its\n"); - printf( -" convex hull as a by-product in the output .poly file if you use the -c\n"); - printf( -" switch. There are faster algorithms for finding a two-dimensional convex\n" -); - printf( -" hull than triangulation, of course, but this one comes for free. If the\n" -); - printf( -" input is an unconstrained mesh (you are using the -r switch but not the\n"); - printf( -" -p switch), Triangle produces a list of its boundary edges (including\n"); - printf(" hole boundaries) as a by-product if you use the -c switch.\n\n"); - printf("Voronoi Diagrams:\n\n"); - printf( -" The -v switch produces a Voronoi diagram, in files suffixed .v.node and\n"); - printf( -" .v.edge. For example, `triangle -v points' will read points.node,\n"); - printf( -" produce its Delaunay triangulation in points.1.node and points.1.ele,\n"); - printf( -" and produce its Voronoi diagram in points.1.v.node and points.1.v.edge.\n"); - printf( -" The .v.node file contains a list of all Voronoi vertices, and the .v.edge\n" -); - printf( -" file contains a list of all Voronoi edges, some of which may be infinite\n" -); - printf( -" rays. (The choice of filenames makes it easy to run the set of Voronoi\n"); - printf(" vertices through Triangle, if so desired.)\n\n"); - printf( -" This implementation does not use exact arithmetic to compute the Voronoi\n" -); - printf( -" vertices, and does not check whether neighboring vertices are identical.\n" -); - printf( -" Be forewarned that if the Delaunay triangulation is degenerate or\n"); - printf( -" near-degenerate, the Voronoi diagram may have duplicate points, crossing\n" -); - printf( -" edges, or infinite rays whose direction vector is zero. Also, if you\n"); - printf( -" generate a constrained (as opposed to conforming) Delaunay triangulation,\n" -); - printf( -" or if the triangulation has holes, the corresponding Voronoi diagram is\n"); - printf(" likely to have crossing edges and unlikely to make sense.\n\n"); - printf("Mesh Topology:\n\n"); - printf( -" You may wish to know which triangles are adjacent to a certain Delaunay\n"); - printf( -" edge in an .edge file, which Voronoi regions are adjacent to a certain\n"); - printf( -" Voronoi edge in a .v.edge file, or which Voronoi regions are adjacent to\n" -); - printf( -" each other. All of this information can be found by cross-referencing\n"); - printf( -" output files with the recollection that the Delaunay triangulation and\n"); - printf(" the Voronoi diagrams are planar duals.\n\n"); - printf( -" Specifically, edge i of an .edge file is the dual of Voronoi edge i of\n"); - printf( -" the corresponding .v.edge file, and is rotated 90 degrees counterclock-\n"); - printf( -" wise from the Voronoi edge. Triangle j of an .ele file is the dual of\n"); - printf( -" vertex j of the corresponding .v.node file; and Voronoi region k is the\n"); - printf(" dual of point k of the corresponding .node file.\n\n"); - printf( -" Hence, to find the triangles adjacent to a Delaunay edge, look at the\n"); - printf( -" vertices of the corresponding Voronoi edge; their dual triangles are on\n"); - printf( -" the left and right of the Delaunay edge, respectively. To find the\n"); - printf( -" Voronoi regions adjacent to a Voronoi edge, look at the endpoints of the\n" -); - printf( -" corresponding Delaunay edge; their dual regions are on the right and left\n" -); - printf( -" of the Voronoi edge, respectively. To find which Voronoi regions are\n"); - printf(" adjacent to each other, just read the list of Delaunay edges.\n"); - printf("\n"); - printf("Statistics:\n"); - printf("\n"); - printf( -" After generating a mesh, Triangle prints a count of the number of points,\n" -); - printf( -" triangles, edges, boundary edges, and segments in the output mesh. If\n"); - printf( -" you've forgotten the statistics for an existing mesh, the -rNEP switches\n" -); - printf( -" (or -rpNEP if you've got a .poly file for the existing mesh) will\n"); - printf(" regenerate these statistics without writing any output.\n\n"); - printf( -" The -V switch produces extended statistics, including a rough estimate\n"); - printf( -" of memory use and a histogram of triangle aspect ratios and angles in the\n" -); - printf(" mesh.\n\n"); - printf("Exact Arithmetic:\n\n"); - printf( -" Triangle uses adaptive exact arithmetic to perform what computational\n"); - printf( -" geometers call the `orientation' and `incircle' tests. If the floating-\n" -); - printf( -" point arithmetic of your machine conforms to the IEEE 754 standard (as\n"); - printf( -" most workstations do), and does not use extended precision internal\n"); - printf( -" registers, then your output is guaranteed to be an absolutely true\n"); - printf(" Delaunay or conforming Delaunay triangulation, roundoff error\n"); - printf( -" notwithstanding. The word `adaptive' implies that these arithmetic\n"); - printf( -" routines compute the result only to the precision necessary to guarantee\n" -); - printf( -" correctness, so they are usually nearly as fast as their approximate\n"); - printf( -" counterparts. The exact tests can be disabled with the -X switch. On\n"); - printf( -" most inputs, this switch will reduce the computation time by about eight\n" -); - printf( -" percent - it's not worth the risk. There are rare difficult inputs\n"); - printf( -" (having many collinear and cocircular points), however, for which the\n"); - printf( -" difference could be a factor of two. These are precisely the inputs most\n" -); - printf(" likely to cause errors if you use the -X switch.\n\n"); - printf( -" Unfortunately, these routines don't solve every numerical problem. Exact\n" -); - printf( -" arithmetic is not used to compute the positions of points, because the\n"); - printf( -" bit complexity of point coordinates would grow without bound. Hence,\n"); - printf( -" segment intersections aren't computed exactly; in very unusual cases,\n"); - printf( -" roundoff error in computing an intersection point might actually lead to\n" -); - printf( -" an inverted triangle and an invalid triangulation. (This is one reason\n"); - printf( -" to compute your own intersection points in your .poly files.) Similarly,\n" -); - printf( -" exact arithmetic is not used to compute the vertices of the Voronoi\n"); - printf(" diagram.\n\n"); - printf( -" Underflow and overflow can also cause difficulties; the exact arithmetic\n" -); - printf( -" routines do not ameliorate out-of-bounds exponents, which can arise\n"); - printf( -" during the orientation and incircle tests. As a rule of thumb, you\n"); - printf( -" should ensure that your input values are within a range such that their\n"); - printf( -" third powers can be taken without underflow or overflow. Underflow can\n"); - printf( -" silently prevent the tests from being performed exactly, while overflow\n"); - printf(" will typically cause a floating exception.\n\n"); - printf("Calling Triangle from Another Program:\n\n"); - printf(" Read the file triangle.h for details.\n\n"); - printf("Troubleshooting:\n\n"); - printf(" Please read this section before mailing me bugs.\n\n"); - printf(" `My output mesh has no triangles!'\n\n"); - printf( -" If you're using a PSLG, you've probably failed to specify a proper set\n" -); - printf( -" of bounding segments, or forgotten to use the -c switch. Or you may\n"); - printf( -" have placed a hole badly. To test these possibilities, try again with\n" -); - printf( -" the -c and -O switches. Alternatively, all your input points may be\n"); - printf( -" collinear, in which case you can hardly expect to triangulate them.\n"); - printf("\n"); - printf(" `Triangle doesn't terminate, or just crashes.'\n"); - printf("\n"); - printf( -" Bad things can happen when triangles get so small that the distance\n"); - printf( -" between their vertices isn't much larger than the precision of your\n"); - printf( -" machine's arithmetic. If you've compiled Triangle for single-precision\n" -); - printf( -" arithmetic, you might do better by recompiling it for double-precision.\n" -); - printf( -" Then again, you might just have to settle for more lenient constraints\n" -); - printf( -" on the minimum angle and the maximum area than you had planned.\n"); - printf("\n"); - printf( -" You can minimize precision problems by ensuring that the origin lies\n"); - printf( -" inside your point set, or even inside the densest part of your\n"); - printf( -" mesh. On the other hand, if you're triangulating an object whose x\n"); - printf( -" coordinates all fall between 6247133 and 6247134, you're not leaving\n"); - printf(" much floating-point precision for Triangle to work with.\n\n"); - printf( -" Precision problems can occur covertly if the input PSLG contains two\n"); - printf( -" segments that meet (or intersect) at a very small angle, or if such an\n" -); - printf( -" angle is introduced by the -c switch, which may occur if a point lies\n"); - printf( -" ever-so-slightly inside the convex hull, and is connected by a PSLG\n"); - printf( -" segment to a point on the convex hull. If you don't realize that a\n"); - printf( -" small angle is being formed, you might never discover why Triangle is\n"); - printf( -" crashing. To check for this possibility, use the -S switch (with an\n"); - printf( -" appropriate limit on the number of Steiner points, found by trial-and-\n" -); - printf( -" error) to stop Triangle early, and view the output .poly file with\n"); - printf( -" Show Me (described below). Look carefully for small angles between\n"); - printf( -" segments; zoom in closely, as such segments might look like a single\n"); - printf(" segment from a distance.\n\n"); - printf( -" If some of the input values are too large, Triangle may suffer a\n"); - printf( -" floating exception due to overflow when attempting to perform an\n"); - printf( -" orientation or incircle test. (Read the section on exact arithmetic\n"); - printf( -" above.) Again, I recommend compiling Triangle for double (rather\n"); - printf(" than single) precision arithmetic.\n\n"); - printf( -" `The numbering of the output points doesn't match the input points.'\n"); - printf("\n"); - printf( -" You may have eaten some of your input points with a hole, or by placing\n" -); - printf(" them outside the area enclosed by segments.\n\n"); - printf( -" `Triangle executes without incident, but when I look at the resulting\n"); - printf( -" mesh, it has overlapping triangles or other geometric inconsistencies.'\n"); - printf("\n"); - printf( -" If you select the -X switch, Triangle's divide-and-conquer Delaunay\n"); - printf( -" triangulation algorithm occasionally makes mistakes due to floating-\n"); - printf( -" point roundoff error. Although these errors are rare, don't use the -X\n" -); - printf(" switch. If you still have problems, please report the bug.\n"); - printf("\n"); - printf( -" Strange things can happen if you've taken liberties with your PSLG. Do\n"); - printf( -" you have a point lying in the middle of a segment? Triangle sometimes\n"); - printf( -" copes poorly with that sort of thing. Do you want to lay out a collinear\n" -); - printf( -" row of evenly spaced, segment-connected points? Have you simply defined\n" -); - printf( -" one long segment connecting the leftmost point to the rightmost point,\n"); - printf( -" and a bunch of points lying along it? This method occasionally works,\n"); - printf( -" especially with horizontal and vertical lines, but often it doesn't, and\n" -); - printf( -" you'll have to connect each adjacent pair of points with a separate\n"); - printf(" segment. If you don't like it, tough.\n\n"); - printf( -" Furthermore, if you have segments that intersect other than at their\n"); - printf( -" endpoints, try not to let the intersections fall extremely close to PSLG\n" -); - printf(" points or each other.\n\n"); - printf( -" If you have problems refining a triangulation not produced by Triangle:\n"); - printf( -" Are you sure the triangulation is geometrically valid? Is it formatted\n"); - printf( -" correctly for Triangle? Are the triangles all listed so the first three\n" -); - printf(" points are their corners in counterclockwise order?\n\n"); - printf("Show Me:\n\n"); - printf( -" Triangle comes with a separate program named `Show Me', whose primary\n"); - printf( -" purpose is to draw meshes on your screen or in PostScript. Its secondary\n" -); - printf( -" purpose is to check the validity of your input files, and do so more\n"); - printf( -" thoroughly than Triangle does. Show Me requires that you have the X\n"); - printf( -" Windows system. If you didn't receive Show Me with Triangle, complain to\n" -); - printf(" whomever you obtained Triangle from, then send me mail.\n\n"); - printf("Triangle on the Web:\n\n"); - printf( -" To see an illustrated, updated version of these instructions, check out\n"); - printf("\n"); - printf(" http://www.cs.cmu.edu/~quake/triangle.html\n"); - printf("\n"); - printf("A Brief Plea:\n"); - printf("\n"); - printf( -" If you use Triangle, and especially if you use it to accomplish real\n"); - printf( -" work, I would like very much to hear from you. A short letter or email\n"); - printf( -" (to jrs@cs.cmu.edu) describing how you use Triangle will mean a lot to\n"); - printf( -" me. The more people I know are using this program, the more easily I can\n" -); - printf( -" justify spending time on improvements and on the three-dimensional\n"); - printf( -" successor to Triangle, which in turn will benefit you. Also, I can put\n"); - printf( -" you on a list to receive email whenever a new version of Triangle is\n"); - printf(" available.\n\n"); - printf( -" If you use a mesh generated by Triangle in a publication, please include\n" -); - printf(" an acknowledgment as well.\n\n"); - printf("Research credit:\n\n"); - printf( -" Of course, I can take credit for only a fraction of the ideas that made\n"); - printf( -" this mesh generator possible. Triangle owes its existence to the efforts\n" -); - printf( -" of many fine computational geometers and other researchers, including\n"); - printf( -" Marshall Bern, L. Paul Chew, Boris Delaunay, Rex A. Dwyer, David\n"); - printf( -" Eppstein, Steven Fortune, Leonidas J. Guibas, Donald E. Knuth, C. L.\n"); - printf( -" Lawson, Der-Tsai Lee, Ernst P. Mucke, Douglas M. Priest, Jim Ruppert,\n"); - printf( -" Isaac Saias, Bruce J. Schachter, Micha Sharir, Jorge Stolfi, Christopher\n" -); - printf( -" J. Van Wyk, David F. Watson, and Binhai Zhu. See the comments at the\n"); - printf(" beginning of the source code for references.\n\n"); - exit(0); -} - -#endif /* not TRILIBRARY */ - -/*****************************************************************************/ -/* */ -/* internalerror() Ask the user to send me the defective product. Exit. */ -/* */ -/*****************************************************************************/ - -void internalerror() -{ - printf(" Please report this bug to jrs@cs.cmu.edu\n"); - printf(" Include the message above, your input data set, and the exact\n"); - printf(" command line you used to run Triangle.\n"); - exit(1); -} - -/*****************************************************************************/ -/* */ -/* parsecommandline() Read the command line, identify switches, and set */ -/* up options and file names. */ -/* */ -/* The effects of this routine are felt entirely through global variables. */ -/* */ -/*****************************************************************************/ - -void parsecommandline(argc, argv) -int argc; -char **argv; -{ -#ifdef TRILIBRARY -#define STARTINDEX 0 -#else /* not TRILIBRARY */ -#define STARTINDEX 1 - int increment; - int meshnumber; -#endif /* not TRILIBRARY */ - int i, j, k; - char workstring[FILENAMESIZE]; - - poly = refine = quality = vararea = fixedarea = regionattrib = convex = 0; - firstnumber = 1; - edgesout = voronoi = neighbors = geomview = 0; - nobound = nopolywritten = nonodewritten = noelewritten = noiterationnum = 0; - noholes = noexact = 0; - incremental = sweepline = 0; - dwyer = 1; - splitseg = 0; - docheck = 0; - nobisect = 0; - steiner = -1; - order = 1; - minangle = 0.0; - maxarea = -1.0; - quiet = verbose = 0; -#ifndef TRILIBRARY - innodefilename[0] = '\0'; -#endif /* not TRILIBRARY */ - - for (i = STARTINDEX; i < argc; i++) { -#ifndef TRILIBRARY - if (argv[i][0] == '-') { -#endif /* not TRILIBRARY */ - for (j = STARTINDEX; argv[i][j] != '\0'; j++) { - if (argv[i][j] == 'p') { - poly = 1; - } -#ifndef CDT_ONLY - if (argv[i][j] == 'r') { - refine = 1; - } - if (argv[i][j] == 'q') { - quality = 1; - if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || - (argv[i][j + 1] == '.')) { - k = 0; - while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || - (argv[i][j + 1] == '.')) { - j++; - workstring[k] = argv[i][j]; - k++; - } - workstring[k] = '\0'; - minangle = (REAL) strtod(workstring, (char **) NULL); - } else { - minangle = 20.0; - } - } - if (argv[i][j] == 'a') { - quality = 1; - if (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || - (argv[i][j + 1] == '.')) { - fixedarea = 1; - k = 0; - while (((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) || - (argv[i][j + 1] == '.')) { - j++; - workstring[k] = argv[i][j]; - k++; - } - workstring[k] = '\0'; - maxarea = (REAL) strtod(workstring, (char **) NULL); - if (maxarea <= 0.0) { - printf("Error: Maximum area must be greater than zero.\n"); - exit(1); - } - } else { - vararea = 1; - } - } -#endif /* not CDT_ONLY */ - if (argv[i][j] == 'A') { - regionattrib = 1; - } - if (argv[i][j] == 'c') { - convex = 1; - } - if (argv[i][j] == 'z') { - firstnumber = 0; - } - if (argv[i][j] == 'e') { - edgesout = 1; - } - if (argv[i][j] == 'v') { - voronoi = 1; - } - if (argv[i][j] == 'n') { - neighbors = 1; - } - if (argv[i][j] == 'g') { - geomview = 1; - } - if (argv[i][j] == 'B') { - nobound = 1; - } - if (argv[i][j] == 'P') { - nopolywritten = 1; - } - if (argv[i][j] == 'N') { - nonodewritten = 1; - } - if (argv[i][j] == 'E') { - noelewritten = 1; - } -#ifndef TRILIBRARY - if (argv[i][j] == 'I') { - noiterationnum = 1; - } -#endif /* not TRILIBRARY */ - if (argv[i][j] == 'O') { - noholes = 1; - } - if (argv[i][j] == 'X') { - noexact = 1; - } - if (argv[i][j] == 'o') { - if (argv[i][j + 1] == '2') { - j++; - order = 2; - } - } -#ifndef CDT_ONLY - if (argv[i][j] == 'Y') { - nobisect++; - } - if (argv[i][j] == 'S') { - steiner = 0; - while ((argv[i][j + 1] >= '0') && (argv[i][j + 1] <= '9')) { - j++; - steiner = steiner * 10 + (int) (argv[i][j] - '0'); - } - } -#endif /* not CDT_ONLY */ -#ifndef REDUCED - if (argv[i][j] == 'i') { - incremental = 1; - } - if (argv[i][j] == 'F') { - sweepline = 1; - } -#endif /* not REDUCED */ - if (argv[i][j] == 'l') { - dwyer = 0; - } -#ifndef REDUCED -#ifndef CDT_ONLY - if (argv[i][j] == 's') { - splitseg = 1; - } -#endif /* not CDT_ONLY */ - if (argv[i][j] == 'C') { - docheck = 1; - } -#endif /* not REDUCED */ - if (argv[i][j] == 'Q') { - quiet = 1; - } - if (argv[i][j] == 'V') { - verbose++; - } -#ifndef TRILIBRARY - if ((argv[i][j] == 'h') || (argv[i][j] == 'H') || - (argv[i][j] == '?')) { - info(); - } -#endif /* not TRILIBRARY */ - } -#ifndef TRILIBRARY - } else { - strncpy(innodefilename, argv[i], FILENAMESIZE - 1); - innodefilename[FILENAMESIZE - 1] = '\0'; - } -#endif /* not TRILIBRARY */ - } -#ifndef TRILIBRARY - if (innodefilename[0] == '\0') { - syntax(); - } - if (!strcmp(&innodefilename[strlen(innodefilename) - 5], ".node")) { - innodefilename[strlen(innodefilename) - 5] = '\0'; - } - if (!strcmp(&innodefilename[strlen(innodefilename) - 5], ".poly")) { - innodefilename[strlen(innodefilename) - 5] = '\0'; - poly = 1; - } -#ifndef CDT_ONLY - if (!strcmp(&innodefilename[strlen(innodefilename) - 4], ".ele")) { - innodefilename[strlen(innodefilename) - 4] = '\0'; - refine = 1; - } - if (!strcmp(&innodefilename[strlen(innodefilename) - 5], ".area")) { - innodefilename[strlen(innodefilename) - 5] = '\0'; - refine = 1; - quality = 1; - vararea = 1; - } -#endif /* not CDT_ONLY */ -#endif /* not TRILIBRARY */ - steinerleft = steiner; - useshelles = poly || refine || quality || convex; - goodangle = cos(minangle * PI / 180.0); - goodangle *= goodangle; - if (refine && noiterationnum) { - printf( - "Error: You cannot use the -I switch when refining a triangulation.\n"); - exit(1); - } - /* Be careful not to allocate space for element area constraints that */ - /* will never be assigned any value (other than the default -1.0). */ - if (!refine && !poly) { - vararea = 0; - } - /* Be careful not to add an extra attribute to each element unless the */ - /* input supports it (PSLG in, but not refining a preexisting mesh). */ - if (refine || !poly) { - regionattrib = 0; - } - -#ifndef TRILIBRARY - strcpy(inpolyfilename, innodefilename); - strcpy(inelefilename, innodefilename); - strcpy(areafilename, innodefilename); - increment = 0; - strcpy(workstring, innodefilename); - j = 1; - while (workstring[j] != '\0') { - if ((workstring[j] == '.') && (workstring[j + 1] != '\0')) { - increment = j + 1; - } - j++; - } - meshnumber = 0; - if (increment > 0) { - j = increment; - do { - if ((workstring[j] >= '0') && (workstring[j] <= '9')) { - meshnumber = meshnumber * 10 + (int) (workstring[j] - '0'); - } else { - increment = 0; - } - j++; - } while (workstring[j] != '\0'); - } - if (noiterationnum) { - strcpy(outnodefilename, innodefilename); - strcpy(outelefilename, innodefilename); - strcpy(edgefilename, innodefilename); - strcpy(vnodefilename, innodefilename); - strcpy(vedgefilename, innodefilename); - strcpy(neighborfilename, innodefilename); - strcpy(offfilename, innodefilename); - strcat(outnodefilename, ".node"); - strcat(outelefilename, ".ele"); - strcat(edgefilename, ".edge"); - strcat(vnodefilename, ".v.node"); - strcat(vedgefilename, ".v.edge"); - strcat(neighborfilename, ".neigh"); - strcat(offfilename, ".off"); - } else if (increment == 0) { - strcpy(outnodefilename, innodefilename); - strcpy(outpolyfilename, innodefilename); - strcpy(outelefilename, innodefilename); - strcpy(edgefilename, innodefilename); - strcpy(vnodefilename, innodefilename); - strcpy(vedgefilename, innodefilename); - strcpy(neighborfilename, innodefilename); - strcpy(offfilename, innodefilename); - strcat(outnodefilename, ".1.node"); - strcat(outpolyfilename, ".1.poly"); - strcat(outelefilename, ".1.ele"); - strcat(edgefilename, ".1.edge"); - strcat(vnodefilename, ".1.v.node"); - strcat(vedgefilename, ".1.v.edge"); - strcat(neighborfilename, ".1.neigh"); - strcat(offfilename, ".1.off"); - } else { - workstring[increment] = '%'; - workstring[increment + 1] = 'd'; - workstring[increment + 2] = '\0'; - sprintf(outnodefilename, workstring, meshnumber + 1); - strcpy(outpolyfilename, outnodefilename); - strcpy(outelefilename, outnodefilename); - strcpy(edgefilename, outnodefilename); - strcpy(vnodefilename, outnodefilename); - strcpy(vedgefilename, outnodefilename); - strcpy(neighborfilename, outnodefilename); - strcpy(offfilename, outnodefilename); - strcat(outnodefilename, ".node"); - strcat(outpolyfilename, ".poly"); - strcat(outelefilename, ".ele"); - strcat(edgefilename, ".edge"); - strcat(vnodefilename, ".v.node"); - strcat(vedgefilename, ".v.edge"); - strcat(neighborfilename, ".neigh"); - strcat(offfilename, ".off"); - } - strcat(innodefilename, ".node"); - strcat(inpolyfilename, ".poly"); - strcat(inelefilename, ".ele"); - strcat(areafilename, ".area"); -#endif /* not TRILIBRARY */ -} - -/** **/ -/** **/ -/********* User interaction routines begin here *********/ - -/********* Debugging routines begin here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* printtriangle() Print out the details of a triangle/edge handle. */ -/* */ -/* I originally wrote this procedure to simplify debugging; it can be */ -/* called directly from the debugger, and presents information about a */ -/* triangle/edge handle in digestible form. It's also used when the */ -/* highest level of verbosity (`-VVV') is specified. */ -/* */ -/*****************************************************************************/ - -void printtriangle(t) -struct triedge *t; -{ - struct triedge printtri; - struct edge printsh; - point printpoint; - - printf("triangle x%lx with orientation %d:\n", (unsigned long) t->tri, - t->orient); - decode(t->tri[0], printtri); - if (printtri.tri == dummytri) { - printf(" [0] = Outer space\n"); - } else { - printf(" [0] = x%lx %d\n", (unsigned long) printtri.tri, - printtri.orient); - } - decode(t->tri[1], printtri); - if (printtri.tri == dummytri) { - printf(" [1] = Outer space\n"); - } else { - printf(" [1] = x%lx %d\n", (unsigned long) printtri.tri, - printtri.orient); - } - decode(t->tri[2], printtri); - if (printtri.tri == dummytri) { - printf(" [2] = Outer space\n"); - } else { - printf(" [2] = x%lx %d\n", (unsigned long) printtri.tri, - printtri.orient); - } - org(*t, printpoint); - if (printpoint == (point) NULL) - printf(" Origin[%d] = NULL\n", (t->orient + 1) % 3 + 3); - else - printf(" Origin[%d] = x%lx (%.12g, %.12g)\n", - (t->orient + 1) % 3 + 3, (unsigned long) printpoint, - printpoint[0], printpoint[1]); - dest(*t, printpoint); - if (printpoint == (point) NULL) - printf(" Dest [%d] = NULL\n", (t->orient + 2) % 3 + 3); - else - printf(" Dest [%d] = x%lx (%.12g, %.12g)\n", - (t->orient + 2) % 3 + 3, (unsigned long) printpoint, - printpoint[0], printpoint[1]); - apex(*t, printpoint); - if (printpoint == (point) NULL) - printf(" Apex [%d] = NULL\n", t->orient + 3); - else - printf(" Apex [%d] = x%lx (%.12g, %.12g)\n", - t->orient + 3, (unsigned long) printpoint, - printpoint[0], printpoint[1]); - if (useshelles) { - sdecode(t->tri[6], printsh); - if (printsh.sh != dummysh) { - printf(" [6] = x%lx %d\n", (unsigned long) printsh.sh, - printsh.shorient); - } - sdecode(t->tri[7], printsh); - if (printsh.sh != dummysh) { - printf(" [7] = x%lx %d\n", (unsigned long) printsh.sh, - printsh.shorient); - } - sdecode(t->tri[8], printsh); - if (printsh.sh != dummysh) { - printf(" [8] = x%lx %d\n", (unsigned long) printsh.sh, - printsh.shorient); - } - } - if (vararea) { - printf(" Area constraint: %.4g\n", areabound(*t)); - } -} - -/*****************************************************************************/ -/* */ -/* printshelle() Print out the details of a shell edge handle. */ -/* */ -/* I originally wrote this procedure to simplify debugging; it can be */ -/* called directly from the debugger, and presents information about a */ -/* shell edge handle in digestible form. It's also used when the highest */ -/* level of verbosity (`-VVV') is specified. */ -/* */ -/*****************************************************************************/ - -void printshelle(s) -struct edge *s; -{ - struct edge printsh; - struct triedge printtri; - point printpoint; - - printf("shell edge x%lx with orientation %d and mark %d:\n", - (unsigned long) s->sh, s->shorient, mark(*s)); - sdecode(s->sh[0], printsh); - if (printsh.sh == dummysh) { - printf(" [0] = No shell\n"); - } else { - printf(" [0] = x%lx %d\n", (unsigned long) printsh.sh, - printsh.shorient); - } - sdecode(s->sh[1], printsh); - if (printsh.sh == dummysh) { - printf(" [1] = No shell\n"); - } else { - printf(" [1] = x%lx %d\n", (unsigned long) printsh.sh, - printsh.shorient); - } - sorg(*s, printpoint); - if (printpoint == (point) NULL) - printf(" Origin[%d] = NULL\n", 2 + s->shorient); - else - printf(" Origin[%d] = x%lx (%.12g, %.12g)\n", - 2 + s->shorient, (unsigned long) printpoint, - printpoint[0], printpoint[1]); - sdest(*s, printpoint); - if (printpoint == (point) NULL) - printf(" Dest [%d] = NULL\n", 3 - s->shorient); - else - printf(" Dest [%d] = x%lx (%.12g, %.12g)\n", - 3 - s->shorient, (unsigned long) printpoint, - printpoint[0], printpoint[1]); - decode(s->sh[4], printtri); - if (printtri.tri == dummytri) { - printf(" [4] = Outer space\n"); - } else { - printf(" [4] = x%lx %d\n", (unsigned long) printtri.tri, - printtri.orient); - } - decode(s->sh[5], printtri); - if (printtri.tri == dummytri) { - printf(" [5] = Outer space\n"); - } else { - printf(" [5] = x%lx %d\n", (unsigned long) printtri.tri, - printtri.orient); - } -} - -/** **/ -/** **/ -/********* Debugging routines end here *********/ - -/********* Memory management routines begin here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* poolinit() Initialize a pool of memory for allocation of items. */ -/* */ -/* This routine initializes the machinery for allocating items. A `pool' */ -/* is created whose records have size at least `bytecount'. Items will be */ -/* allocated in `itemcount'-item blocks. Each item is assumed to be a */ -/* collection of words, and either pointers or floating-point values are */ -/* assumed to be the "primary" word type. (The "primary" word type is used */ -/* to determine alignment of items.) If `alignment' isn't zero, all items */ -/* will be `alignment'-byte aligned in memory. `alignment' must be either */ -/* a multiple or a factor of the primary word size; powers of two are safe. */ -/* `alignment' is normally used to create a few unused bits at the bottom */ -/* of each item's pointer, in which information may be stored. */ -/* */ -/* Don't change this routine unless you understand it. */ -/* */ -/*****************************************************************************/ - -void poolinit(pool, bytecount, itemcount, wtype, alignment) -struct memorypool *pool; -int bytecount; -int itemcount; -enum wordtype wtype; -int alignment; -{ - int wordsize; - - /* Initialize values in the pool. */ - pool->itemwordtype = wtype; - wordsize = (pool->itemwordtype == POINTER) ? sizeof(VOID *) : sizeof(REAL); - /* Find the proper alignment, which must be at least as large as: */ - /* - The parameter `alignment'. */ - /* - The primary word type, to avoid unaligned accesses. */ - /* - sizeof(VOID *), so the stack of dead items can be maintained */ - /* without unaligned accesses. */ - if (alignment > wordsize) { - pool->alignbytes = alignment; - } else { - pool->alignbytes = wordsize; - } - if (sizeof(VOID *) > pool->alignbytes) { - pool->alignbytes = sizeof(VOID *); - } - pool->itemwords = ((bytecount + pool->alignbytes - 1) / pool->alignbytes) - * (pool->alignbytes / wordsize); - pool->itembytes = pool->itemwords * wordsize; - pool->itemsperblock = itemcount; - - /* Allocate a block of items. Space for `itemsperblock' items and one */ - /* pointer (to point to the next block) are allocated, as well as space */ - /* to ensure alignment of the items. */ - pool->firstblock = (VOID **) malloc(pool->itemsperblock * pool->itembytes - + sizeof(VOID *) + pool->alignbytes); - if (pool->firstblock == (VOID **) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - /* Set the next block pointer to NULL. */ - *(pool->firstblock) = (VOID *) NULL; - poolrestart(pool); -} - -/*****************************************************************************/ -/* */ -/* poolrestart() Deallocate all items in a pool. */ -/* */ -/* The pool is returned to its starting state, except that no memory is */ -/* freed to the operating system. Rather, the previously allocated blocks */ -/* are ready to be reused. */ -/* */ -/*****************************************************************************/ - -void poolrestart(pool) -struct memorypool *pool; -{ - unsigned long alignptr; - - pool->items = 0; - pool->maxitems = 0; - - /* Set the currently active block. */ - pool->nowblock = pool->firstblock; - /* Find the first item in the pool. Increment by the size of (VOID *). */ - alignptr = (unsigned long) (pool->nowblock + 1); - /* Align the item on an `alignbytes'-byte boundary. */ - pool->nextitem = (VOID *) - (alignptr + (unsigned long) pool->alignbytes - - (alignptr % (unsigned long) pool->alignbytes)); - /* There are lots of unallocated items left in this block. */ - pool->unallocateditems = pool->itemsperblock; - /* The stack of deallocated items is empty. */ - pool->deaditemstack = (VOID *) NULL; -} - -/*****************************************************************************/ -/* */ -/* pooldeinit() Free to the operating system all memory taken by a pool. */ -/* */ -/*****************************************************************************/ - -void pooldeinit(pool) -struct memorypool *pool; -{ - while (pool->firstblock != (VOID **) NULL) { - pool->nowblock = (VOID **) *(pool->firstblock); - free(pool->firstblock); - pool->firstblock = pool->nowblock; - } -} - -/*****************************************************************************/ -/* */ -/* poolalloc() Allocate space for an item. */ -/* */ -/*****************************************************************************/ - -VOID *poolalloc(pool) -struct memorypool *pool; -{ - VOID *newitem; - VOID **newblock; - unsigned long alignptr; - - /* First check the linked list of dead items. If the list is not */ - /* empty, allocate an item from the list rather than a fresh one. */ - if (pool->deaditemstack != (VOID *) NULL) { - newitem = pool->deaditemstack; /* Take first item in list. */ - pool->deaditemstack = * (VOID **) pool->deaditemstack; - } else { - /* Check if there are any free items left in the current block. */ - if (pool->unallocateditems == 0) { - /* Check if another block must be allocated. */ - if (*(pool->nowblock) == (VOID *) NULL) { - /* Allocate a new block of items, pointed to by the previous block. */ - newblock = (VOID **) malloc(pool->itemsperblock * pool->itembytes - + sizeof(VOID *) + pool->alignbytes); - if (newblock == (VOID **) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - *(pool->nowblock) = (VOID *) newblock; - /* The next block pointer is NULL. */ - *newblock = (VOID *) NULL; - } - /* Move to the new block. */ - pool->nowblock = (VOID **) *(pool->nowblock); - /* Find the first item in the block. */ - /* Increment by the size of (VOID *). */ - alignptr = (unsigned long) (pool->nowblock + 1); - /* Align the item on an `alignbytes'-byte boundary. */ - pool->nextitem = (VOID *) - (alignptr + (unsigned long) pool->alignbytes - - (alignptr % (unsigned long) pool->alignbytes)); - /* There are lots of unallocated items left in this block. */ - pool->unallocateditems = pool->itemsperblock; - } - /* Allocate a new item. */ - newitem = pool->nextitem; - /* Advance `nextitem' pointer to next free item in block. */ - if (pool->itemwordtype == POINTER) { - pool->nextitem = (VOID *) ((VOID **) pool->nextitem + pool->itemwords); - } else { - pool->nextitem = (VOID *) ((REAL *) pool->nextitem + pool->itemwords); - } - pool->unallocateditems--; - pool->maxitems++; - } - pool->items++; - return newitem; -} - -/*****************************************************************************/ -/* */ -/* pooldealloc() Deallocate space for an item. */ -/* */ -/* The deallocated space is stored in a queue for later reuse. */ -/* */ -/*****************************************************************************/ - -void pooldealloc(pool, dyingitem) -struct memorypool *pool; -VOID *dyingitem; -{ - /* Push freshly killed item onto stack. */ - *((VOID **) dyingitem) = pool->deaditemstack; - pool->deaditemstack = dyingitem; - pool->items--; -} - -/*****************************************************************************/ -/* */ -/* traversalinit() Prepare to traverse the entire list of items. */ -/* */ -/* This routine is used in conjunction with traverse(). */ -/* */ -/*****************************************************************************/ - -void traversalinit(pool) -struct memorypool *pool; -{ - unsigned long alignptr; - - /* Begin the traversal in the first block. */ - pool->pathblock = pool->firstblock; - /* Find the first item in the block. Increment by the size of (VOID *). */ - alignptr = (unsigned long) (pool->pathblock + 1); - /* Align with item on an `alignbytes'-byte boundary. */ - pool->pathitem = (VOID *) - (alignptr + (unsigned long) pool->alignbytes - - (alignptr % (unsigned long) pool->alignbytes)); - /* Set the number of items left in the current block. */ - pool->pathitemsleft = pool->itemsperblock; -} - -/*****************************************************************************/ -/* */ -/* traverse() Find the next item in the list. */ -/* */ -/* This routine is used in conjunction with traversalinit(). Be forewarned */ -/* that this routine successively returns all items in the list, including */ -/* deallocated ones on the deaditemqueue. It's up to you to figure out */ -/* which ones are actually dead. Why? I don't want to allocate extra */ -/* space just to demarcate dead items. It can usually be done more */ -/* space-efficiently by a routine that knows something about the structure */ -/* of the item. */ -/* */ -/*****************************************************************************/ - -VOID *traverse(pool) -struct memorypool *pool; -{ - VOID *newitem; - unsigned long alignptr; - - /* Stop upon exhausting the list of items. */ - if (pool->pathitem == pool->nextitem) { - return (VOID *) NULL; - } - /* Check whether any untraversed items remain in the current block. */ - if (pool->pathitemsleft == 0) { - /* Find the next block. */ - pool->pathblock = (VOID **) *(pool->pathblock); - /* Find the first item in the block. Increment by the size of (VOID *). */ - alignptr = (unsigned long) (pool->pathblock + 1); - /* Align with item on an `alignbytes'-byte boundary. */ - pool->pathitem = (VOID *) - (alignptr + (unsigned long) pool->alignbytes - - (alignptr % (unsigned long) pool->alignbytes)); - /* Set the number of items left in the current block. */ - pool->pathitemsleft = pool->itemsperblock; - } - newitem = pool->pathitem; - /* Find the next item in the block. */ - if (pool->itemwordtype == POINTER) { - pool->pathitem = (VOID *) ((VOID **) pool->pathitem + pool->itemwords); - } else { - pool->pathitem = (VOID *) ((REAL *) pool->pathitem + pool->itemwords); - } - pool->pathitemsleft--; - return newitem; -} - -/*****************************************************************************/ -/* */ -/* dummyinit() Initialize the triangle that fills "outer space" and the */ -/* omnipresent shell edge. */ -/* */ -/* The triangle that fills "outer space", called `dummytri', is pointed to */ -/* by every triangle and shell edge on a boundary (be it outer or inner) of */ -/* the triangulation. Also, `dummytri' points to one of the triangles on */ -/* the convex hull (until the holes and concavities are carved), making it */ -/* possible to find a starting triangle for point location. */ -/* */ -/* The omnipresent shell edge, `dummysh', is pointed to by every triangle */ -/* or shell edge that doesn't have a full complement of real shell edges */ -/* to point to. */ -/* */ -/*****************************************************************************/ - -void dummyinit(trianglewords, shellewords) -int trianglewords; -int shellewords; -{ - unsigned long alignptr; - - /* `triwords' and `shwords' are used by the mesh manipulation primitives */ - /* to extract orientations of triangles and shell edges from pointers. */ - triwords = trianglewords; /* Initialize `triwords' once and for all. */ - shwords = shellewords; /* Initialize `shwords' once and for all. */ - - /* Set up `dummytri', the `triangle' that occupies "outer space". */ - dummytribase = (triangle *) malloc(triwords * sizeof(triangle) - + triangles.alignbytes); - if (dummytribase == (triangle *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - /* Align `dummytri' on a `triangles.alignbytes'-byte boundary. */ - alignptr = (unsigned long) dummytribase; - dummytri = (triangle *) - (alignptr + (unsigned long) triangles.alignbytes - - (alignptr % (unsigned long) triangles.alignbytes)); - /* Initialize the three adjoining triangles to be "outer space". These */ - /* will eventually be changed by various bonding operations, but their */ - /* values don't really matter, as long as they can legally be */ - /* dereferenced. */ - dummytri[0] = (triangle) dummytri; - dummytri[1] = (triangle) dummytri; - dummytri[2] = (triangle) dummytri; - /* Three NULL vertex points. */ - dummytri[3] = (triangle) NULL; - dummytri[4] = (triangle) NULL; - dummytri[5] = (triangle) NULL; - - if (useshelles) { - /* Set up `dummysh', the omnipresent "shell edge" pointed to by any */ - /* triangle side or shell edge end that isn't attached to a real shell */ - /* edge. */ - dummyshbase = (shelle *) malloc(shwords * sizeof(shelle) - + shelles.alignbytes); - if (dummyshbase == (shelle *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - /* Align `dummysh' on a `shelles.alignbytes'-byte boundary. */ - alignptr = (unsigned long) dummyshbase; - dummysh = (shelle *) - (alignptr + (unsigned long) shelles.alignbytes - - (alignptr % (unsigned long) shelles.alignbytes)); - /* Initialize the two adjoining shell edges to be the omnipresent shell */ - /* edge. These will eventually be changed by various bonding */ - /* operations, but their values don't really matter, as long as they */ - /* can legally be dereferenced. */ - dummysh[0] = (shelle) dummysh; - dummysh[1] = (shelle) dummysh; - /* Two NULL vertex points. */ - dummysh[2] = (shelle) NULL; - dummysh[3] = (shelle) NULL; - /* Initialize the two adjoining triangles to be "outer space". */ - dummysh[4] = (shelle) dummytri; - dummysh[5] = (shelle) dummytri; - /* Set the boundary marker to zero. */ - * (int *) (dummysh + 6) = 0; - - /* Initialize the three adjoining shell edges of `dummytri' to be */ - /* the omnipresent shell edge. */ - dummytri[6] = (triangle) dummysh; - dummytri[7] = (triangle) dummysh; - dummytri[8] = (triangle) dummysh; - } -} - -/*****************************************************************************/ -/* */ -/* initializepointpool() Calculate the size of the point data structure */ -/* and initialize its memory pool. */ -/* */ -/* This routine also computes the `pointmarkindex' and `point2triindex' */ -/* indices used to find values within each point. */ -/* */ -/*****************************************************************************/ - -void initializepointpool() -{ - int pointsize; - - /* The index within each point at which the boundary marker is found. */ - /* Ensure the point marker is aligned to a sizeof(int)-byte address. */ - pointmarkindex = ((mesh_dim + nextras) * sizeof(REAL) + sizeof(int) - 1) - / sizeof(int); - pointsize = (pointmarkindex + 1) * sizeof(int); - if (poly) { - /* The index within each point at which a triangle pointer is found. */ - /* Ensure the pointer is aligned to a sizeof(triangle)-byte address. */ - point2triindex = (pointsize + sizeof(triangle) - 1) / sizeof(triangle); - pointsize = (point2triindex + 1) * sizeof(triangle); - } - /* Initialize the pool of points. */ - poolinit(&points, pointsize, POINTPERBLOCK, - (sizeof(REAL) >= sizeof(triangle)) ? FLOATINGPOINT : POINTER, 0); -} - -/*****************************************************************************/ -/* */ -/* initializetrisegpools() Calculate the sizes of the triangle and shell */ -/* edge data structures and initialize their */ -/* memory pools. */ -/* */ -/* This routine also computes the `highorderindex', `elemattribindex', and */ -/* `areaboundindex' indices used to find values within each triangle. */ -/* */ -/*****************************************************************************/ - -void initializetrisegpools() -{ - int trisize; - - /* The index within each triangle at which the extra nodes (above three) */ - /* associated with high order elements are found. There are three */ - /* pointers to other triangles, three pointers to corners, and possibly */ - /* three pointers to shell edges before the extra nodes. */ - highorderindex = 6 + (useshelles * 3); - /* The number of bytes occupied by a triangle. */ - trisize = ((order + 1) * (order + 2) / 2 + (highorderindex - 3)) * - sizeof(triangle); - /* The index within each triangle at which its attributes are found, */ - /* where the index is measured in REALs. */ - elemattribindex = (trisize + sizeof(REAL) - 1) / sizeof(REAL); - /* The index within each triangle at which the maximum area constraint */ - /* is found, where the index is measured in REALs. Note that if the */ - /* `regionattrib' flag is set, an additional attribute will be added. */ - areaboundindex = elemattribindex + eextras + regionattrib; - /* If triangle attributes or an area bound are needed, increase the number */ - /* of bytes occupied by a triangle. */ - if (vararea) { - trisize = (areaboundindex + 1) * sizeof(REAL); - } else if (eextras + regionattrib > 0) { - trisize = areaboundindex * sizeof(REAL); - } - /* If a Voronoi diagram or triangle neighbor graph is requested, make */ - /* sure there's room to store an integer index in each triangle. This */ - /* integer index can occupy the same space as the shell edges or */ - /* attributes or area constraint or extra nodes. */ - if ((voronoi || neighbors) && - (trisize < 6 * sizeof(triangle) + sizeof(int))) { - trisize = 6 * sizeof(triangle) + sizeof(int); - } - /* Having determined the memory size of a triangle, initialize the pool. */ - poolinit(&triangles, trisize, TRIPERBLOCK, POINTER, 4); - - if (useshelles) { - /* Initialize the pool of shell edges. */ - poolinit(&shelles, 6 * sizeof(triangle) + sizeof(int), SHELLEPERBLOCK, - POINTER, 4); - - /* Initialize the "outer space" triangle and omnipresent shell edge. */ - dummyinit(triangles.itemwords, shelles.itemwords); - } else { - /* Initialize the "outer space" triangle. */ - dummyinit(triangles.itemwords, 0); - } -} - -/*****************************************************************************/ -/* */ -/* triangledealloc() Deallocate space for a triangle, marking it dead. */ -/* */ -/*****************************************************************************/ - -void triangledealloc(dyingtriangle) -triangle *dyingtriangle; -{ - /* Set triangle's vertices to NULL. This makes it possible to */ - /* detect dead triangles when traversing the list of all triangles. */ - dyingtriangle[3] = (triangle) NULL; - dyingtriangle[4] = (triangle) NULL; - dyingtriangle[5] = (triangle) NULL; - pooldealloc(&triangles, (VOID *) dyingtriangle); -} - -/*****************************************************************************/ -/* */ -/* triangletraverse() Traverse the triangles, skipping dead ones. */ -/* */ -/*****************************************************************************/ - -triangle *triangletraverse() -{ - triangle *newtriangle; - - do { - newtriangle = (triangle *) traverse(&triangles); - if (newtriangle == (triangle *) NULL) { - return (triangle *) NULL; - } - } while (newtriangle[3] == (triangle) NULL); /* Skip dead ones. */ - return newtriangle; -} - -/*****************************************************************************/ -/* */ -/* shelledealloc() Deallocate space for a shell edge, marking it dead. */ -/* */ -/*****************************************************************************/ - -void shelledealloc(dyingshelle) -shelle *dyingshelle; -{ - /* Set shell edge's vertices to NULL. This makes it possible to */ - /* detect dead shells when traversing the list of all shells. */ - dyingshelle[2] = (shelle) NULL; - dyingshelle[3] = (shelle) NULL; - pooldealloc(&shelles, (VOID *) dyingshelle); -} - -/*****************************************************************************/ -/* */ -/* shelletraverse() Traverse the shell edges, skipping dead ones. */ -/* */ -/*****************************************************************************/ - -shelle *shelletraverse() -{ - shelle *newshelle; - - do { - newshelle = (shelle *) traverse(&shelles); - if (newshelle == (shelle *) NULL) { - return (shelle *) NULL; - } - } while (newshelle[2] == (shelle) NULL); /* Skip dead ones. */ - return newshelle; -} - -/*****************************************************************************/ -/* */ -/* pointdealloc() Deallocate space for a point, marking it dead. */ -/* */ -/*****************************************************************************/ - -void pointdealloc(dyingpoint) -point dyingpoint; -{ - /* Mark the point as dead. This makes it possible to detect dead points */ - /* when traversing the list of all points. */ - setpointmark(dyingpoint, DEADPOINT); - pooldealloc(&points, (VOID *) dyingpoint); -} - -/*****************************************************************************/ -/* */ -/* pointtraverse() Traverse the points, skipping dead ones. */ -/* */ -/*****************************************************************************/ - -point pointtraverse() -{ - point newpoint; - - do { - newpoint = (point) traverse(&points); - if (newpoint == (point) NULL) { - return (point) NULL; - } - } while (pointmark(newpoint) == DEADPOINT); /* Skip dead ones. */ - return newpoint; -} - -/*****************************************************************************/ -/* */ -/* badsegmentdealloc() Deallocate space for a bad segment, marking it */ -/* dead. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -void badsegmentdealloc(dyingseg) -struct edge *dyingseg; -{ - /* Set segment's orientation to -1. This makes it possible to */ - /* detect dead segments when traversing the list of all segments. */ - dyingseg->shorient = -1; - pooldealloc(&badsegments, (VOID *) dyingseg); -} - -#endif /* not CDT_ONLY */ - -/*****************************************************************************/ -/* */ -/* badsegmenttraverse() Traverse the bad segments, skipping dead ones. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -struct edge *badsegmenttraverse() -{ - struct edge *newseg; - - do { - newseg = (struct edge *) traverse(&badsegments); - if (newseg == (struct edge *) NULL) { - return (struct edge *) NULL; - } - } while (newseg->shorient == -1); /* Skip dead ones. */ - return newseg; -} - -#endif /* not CDT_ONLY */ - -/*****************************************************************************/ -/* */ -/* getpoint() Get a specific point, by number, from the list. */ -/* */ -/* The first point is number 'firstnumber'. */ -/* */ -/* Note that this takes O(n) time (with a small constant, if POINTPERBLOCK */ -/* is large). I don't care to take the trouble to make it work in constant */ -/* time. */ -/* */ -/*****************************************************************************/ - -point getpoint(number) -int number; -{ - VOID **getblock; - point foundpoint; - unsigned long alignptr; - int current; - - getblock = points.firstblock; - current = firstnumber; - /* Find the right block. */ - while (current + points.itemsperblock <= number) { - getblock = (VOID **) *getblock; - current += points.itemsperblock; - } - /* Now find the right point. */ - alignptr = (unsigned long) (getblock + 1); - foundpoint = (point) (alignptr + (unsigned long) points.alignbytes - - (alignptr % (unsigned long) points.alignbytes)); - while (current < number) { - foundpoint += points.itemwords; - current++; - } - return foundpoint; -} - -/*****************************************************************************/ -/* */ -/* triangledeinit() Free all remaining allocated memory. */ -/* */ -/*****************************************************************************/ - -void triangledeinit() -{ - pooldeinit(&triangles); - free(dummytribase); - if (useshelles) { - pooldeinit(&shelles); - free(dummyshbase); - } - pooldeinit(&points); -#ifndef CDT_ONLY - if (quality) { - pooldeinit(&badsegments); - if ((minangle > 0.0) || vararea || fixedarea) { - pooldeinit(&badtriangles); - } - } -#endif /* not CDT_ONLY */ -} - -/** **/ -/** **/ -/********* Memory management routines end here *********/ - -/********* Constructors begin here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* maketriangle() Create a new triangle with orientation zero. */ -/* */ -/*****************************************************************************/ - -void maketriangle(newtriedge) -struct triedge *newtriedge; -{ - int i; - - newtriedge->tri = (triangle *) poolalloc(&triangles); - /* Initialize the three adjoining triangles to be "outer space". */ - newtriedge->tri[0] = (triangle) dummytri; - newtriedge->tri[1] = (triangle) dummytri; - newtriedge->tri[2] = (triangle) dummytri; - /* Three NULL vertex points. */ - newtriedge->tri[3] = (triangle) NULL; - newtriedge->tri[4] = (triangle) NULL; - newtriedge->tri[5] = (triangle) NULL; - /* Initialize the three adjoining shell edges to be the omnipresent */ - /* shell edge. */ - if (useshelles) { - newtriedge->tri[6] = (triangle) dummysh; - newtriedge->tri[7] = (triangle) dummysh; - newtriedge->tri[8] = (triangle) dummysh; - } - for (i = 0; i < eextras; i++) { - setelemattribute(*newtriedge, i, 0.0); - } - if (vararea) { - setareabound(*newtriedge, -1.0); - } - - newtriedge->orient = 0; -} - -/*****************************************************************************/ -/* */ -/* makeshelle() Create a new shell edge with orientation zero. */ -/* */ -/*****************************************************************************/ - -void makeshelle(newedge) -struct edge *newedge; -{ - newedge->sh = (shelle *) poolalloc(&shelles); - /* Initialize the two adjoining shell edges to be the omnipresent */ - /* shell edge. */ - newedge->sh[0] = (shelle) dummysh; - newedge->sh[1] = (shelle) dummysh; - /* Two NULL vertex points. */ - newedge->sh[2] = (shelle) NULL; - newedge->sh[3] = (shelle) NULL; - /* Initialize the two adjoining triangles to be "outer space". */ - newedge->sh[4] = (shelle) dummytri; - newedge->sh[5] = (shelle) dummytri; - /* Set the boundary marker to zero. */ - setmark(*newedge, 0); - - newedge->shorient = 0; -} - -/** **/ -/** **/ -/********* Constructors end here *********/ - -/********* Determinant evaluation routines begin here *********/ -/** **/ -/** **/ - -/* The adaptive exact arithmetic geometric predicates implemented herein are */ -/* described in detail in my Technical Report CMU-CS-96-140. The complete */ -/* reference is given in the header. */ - -/* Which of the following two methods of finding the absolute values is */ -/* fastest is compiler-dependent. A few compilers can inline and optimize */ -/* the fabs() call; but most will incur the overhead of a function call, */ -/* which is disastrously slow. A faster way on IEEE machines might be to */ -/* mask the appropriate bit, but that's difficult to do in C. */ - -#define Absolute(a) ((a) >= 0.0 ? (a) : -(a)) -/* #define Absolute(a) fabs(a) */ - -/* Many of the operations are broken up into two pieces, a main part that */ -/* performs an approximate operation, and a "tail" that computes the */ -/* roundoff error of that operation. */ -/* */ -/* The operations Fast_Two_Sum(), Fast_Two_Diff(), Two_Sum(), Two_Diff(), */ -/* Split(), and Two_Product() are all implemented as described in the */ -/* reference. Each of these macros requires certain variables to be */ -/* defined in the calling routine. The variables `bvirt', `c', `abig', */ -/* `_i', `_j', `_k', `_l', `_m', and `_n' are declared `INEXACT' because */ -/* they store the result of an operation that may incur roundoff error. */ -/* The input parameter `x' (or the highest numbered `x_' parameter) must */ -/* also be declared `INEXACT'. */ - -#define Fast_Two_Sum_Tail(a, b, x, y) \ - bvirt = x - a; \ - y = b - bvirt - -#define Fast_Two_Sum(a, b, x, y) \ - x = (REAL) (a + b); \ - Fast_Two_Sum_Tail(a, b, x, y) - -#define Two_Sum_Tail(a, b, x, y) \ - bvirt = (REAL) (x - a); \ - avirt = x - bvirt; \ - bround = b - bvirt; \ - around = a - avirt; \ - y = around + bround - -#define Two_Sum(a, b, x, y) \ - x = (REAL) (a + b); \ - Two_Sum_Tail(a, b, x, y) - -#define Two_Diff_Tail(a, b, x, y) \ - bvirt = (REAL) (a - x); \ - avirt = x + bvirt; \ - bround = bvirt - b; \ - around = a - avirt; \ - y = around + bround - -#define Two_Diff(a, b, x, y) \ - x = (REAL) (a - b); \ - Two_Diff_Tail(a, b, x, y) - -#define Split(a, ahi, alo) \ - c = (REAL) (splitter * a); \ - abig = (REAL) (c - a); \ - ahi = c - abig; \ - alo = a - ahi - -#define Two_Product_Tail(a, b, x, y) \ - Split(a, ahi, alo); \ - Split(b, bhi, blo); \ - err1 = x - (ahi * bhi); \ - err2 = err1 - (alo * bhi); \ - err3 = err2 - (ahi * blo); \ - y = (alo * blo) - err3 - -#define Two_Product(a, b, x, y) \ - x = (REAL) (a * b); \ - Two_Product_Tail(a, b, x, y) - -/* Two_Product_Presplit() is Two_Product() where one of the inputs has */ -/* already been split. Avoids redundant splitting. */ - -#define Two_Product_Presplit(a, b, bhi, blo, x, y) \ - x = (REAL) (a * b); \ - Split(a, ahi, alo); \ - err1 = x - (ahi * bhi); \ - err2 = err1 - (alo * bhi); \ - err3 = err2 - (ahi * blo); \ - y = (alo * blo) - err3 - -/* Square() can be done more quickly than Two_Product(). */ - -#define Square_Tail(a, x, y) \ - Split(a, ahi, alo); \ - err1 = x - (ahi * ahi); \ - err3 = err1 - ((ahi + ahi) * alo); \ - y = (alo * alo) - err3 - -#define Square(a, x, y) \ - x = (REAL) (a * a); \ - Square_Tail(a, x, y) - -/* Macros for summing expansions of various fixed lengths. These are all */ -/* unrolled versions of Expansion_Sum(). */ - -#define Two_One_Sum(a1, a0, b, x2, x1, x0) \ - Two_Sum(a0, b , _i, x0); \ - Two_Sum(a1, _i, x2, x1) - -#define Two_One_Diff(a1, a0, b, x2, x1, x0) \ - Two_Diff(a0, b , _i, x0); \ - Two_Sum( a1, _i, x2, x1) - -#define Two_Two_Sum(a1, a0, b1, b0, x3, x2, x1, x0) \ - Two_One_Sum(a1, a0, b0, _j, _0, x0); \ - Two_One_Sum(_j, _0, b1, x3, x2, x1) - -#define Two_Two_Diff(a1, a0, b1, b0, x3, x2, x1, x0) \ - Two_One_Diff(a1, a0, b0, _j, _0, x0); \ - Two_One_Diff(_j, _0, b1, x3, x2, x1) - -/*****************************************************************************/ -/* */ -/* exactinit() Initialize the variables used for exact arithmetic. */ -/* */ -/* `epsilon' is the largest power of two such that 1.0 + epsilon = 1.0 in */ -/* floating-point arithmetic. `epsilon' bounds the relative roundoff */ -/* error. It is used for floating-point error analysis. */ -/* */ -/* `splitter' is used to split floating-point numbers into two half- */ -/* length significands for exact multiplication. */ -/* */ -/* I imagine that a highly optimizing compiler might be too smart for its */ -/* own good, and somehow cause this routine to fail, if it pretends that */ -/* floating-point arithmetic is too much like real arithmetic. */ -/* */ -/* Don't change this routine unless you fully understand it. */ -/* */ -/*****************************************************************************/ - -void exactinit() -{ - REAL half; - REAL check, lastcheck; - int every_other; - - every_other = 1; - half = 0.5; - epsilon = 1.0; - splitter = 1.0; - check = 1.0; - /* Repeatedly divide `epsilon' by two until it is too small to add to */ - /* one without causing roundoff. (Also check if the sum is equal to */ - /* the previous sum, for machines that round up instead of using exact */ - /* rounding. Not that these routines will work on such machines anyway. */ - do { - lastcheck = check; - epsilon *= half; - if (every_other) { - splitter *= 2.0; - } - every_other = !every_other; - check = 1.0 + epsilon; - } while ((check != 1.0) && (check != lastcheck)); - splitter += 1.0; - if (verbose > 1) { - printf("Floating point roundoff is of magnitude %.17g\n", epsilon); - printf("Floating point splitter is %.17g\n", splitter); - } - /* Error bounds for orientation and incircle tests. */ - resulterrbound = (3.0 + 8.0 * epsilon) * epsilon; - ccwerrboundA = (3.0 + 16.0 * epsilon) * epsilon; - ccwerrboundB = (2.0 + 12.0 * epsilon) * epsilon; - ccwerrboundC = (9.0 + 64.0 * epsilon) * epsilon * epsilon; - iccerrboundA = (10.0 + 96.0 * epsilon) * epsilon; - iccerrboundB = (4.0 + 48.0 * epsilon) * epsilon; - iccerrboundC = (44.0 + 576.0 * epsilon) * epsilon * epsilon; -} - -/*****************************************************************************/ -/* */ -/* fast_expansion_sum_zeroelim() Sum two expansions, eliminating zero */ -/* components from the output expansion. */ -/* */ -/* Sets h = e + f. See my Robust Predicates paper for details. */ -/* */ -/* If round-to-even is used (as with IEEE 754), maintains the strongly */ -/* nonoverlapping property. (That is, if e is strongly nonoverlapping, h */ -/* will be also.) Does NOT maintain the nonoverlapping or nonadjacent */ -/* properties. */ -/* */ -/*****************************************************************************/ - -int fast_expansion_sum_zeroelim(elen, e, flen, f, h) /* h cannot be e or f. */ -int elen; -REAL *e; -int flen; -REAL *f; -REAL *h; -{ - REAL Q; - INEXACT REAL Qnew; - INEXACT REAL hh; - INEXACT REAL bvirt; - REAL avirt, bround, around; - int eindex, findex, hindex; - REAL enow, fnow; - - enow = e[0]; - fnow = f[0]; - eindex = findex = 0; - if ((fnow > enow) == (fnow > -enow)) { - Q = enow; - enow = e[++eindex]; - } else { - Q = fnow; - fnow = f[++findex]; - } - hindex = 0; - if ((eindex < elen) && (findex < flen)) { - if ((fnow > enow) == (fnow > -enow)) { - Fast_Two_Sum(enow, Q, Qnew, hh); - enow = e[++eindex]; - } else { - Fast_Two_Sum(fnow, Q, Qnew, hh); - fnow = f[++findex]; - } - Q = Qnew; - if (hh != 0.0) { - h[hindex++] = hh; - } - while ((eindex < elen) && (findex < flen)) { - if ((fnow > enow) == (fnow > -enow)) { - Two_Sum(Q, enow, Qnew, hh); - enow = e[++eindex]; - } else { - Two_Sum(Q, fnow, Qnew, hh); - fnow = f[++findex]; - } - Q = Qnew; - if (hh != 0.0) { - h[hindex++] = hh; - } - } - } - while (eindex < elen) { - Two_Sum(Q, enow, Qnew, hh); - enow = e[++eindex]; - Q = Qnew; - if (hh != 0.0) { - h[hindex++] = hh; - } - } - while (findex < flen) { - Two_Sum(Q, fnow, Qnew, hh); - fnow = f[++findex]; - Q = Qnew; - if (hh != 0.0) { - h[hindex++] = hh; - } - } - if ((Q != 0.0) || (hindex == 0)) { - h[hindex++] = Q; - } - return hindex; -} - -/*****************************************************************************/ -/* */ -/* scale_expansion_zeroelim() Multiply an expansion by a scalar, */ -/* eliminating zero components from the */ -/* output expansion. */ -/* */ -/* Sets h = be. See my Robust Predicates paper for details. */ -/* */ -/* Maintains the nonoverlapping property. If round-to-even is used (as */ -/* with IEEE 754), maintains the strongly nonoverlapping and nonadjacent */ -/* properties as well. (That is, if e has one of these properties, so */ -/* will h.) */ -/* */ -/*****************************************************************************/ - -int scale_expansion_zeroelim(elen, e, b, h) /* e and h cannot be the same. */ -int elen; -REAL *e; -REAL b; -REAL *h; -{ - INEXACT REAL Q, sum; - REAL hh; - INEXACT REAL product1; - REAL product0; - int eindex, hindex; - REAL enow; - INEXACT REAL bvirt; - REAL avirt, bround, around; - INEXACT REAL c; - INEXACT REAL abig; - REAL ahi, alo, bhi, blo; - REAL err1, err2, err3; - - Split(b, bhi, blo); - Two_Product_Presplit(e[0], b, bhi, blo, Q, hh); - hindex = 0; - if (hh != 0) { - h[hindex++] = hh; - } - for (eindex = 1; eindex < elen; eindex++) { - enow = e[eindex]; - Two_Product_Presplit(enow, b, bhi, blo, product1, product0); - Two_Sum(Q, product0, sum, hh); - if (hh != 0) { - h[hindex++] = hh; - } - Fast_Two_Sum(product1, sum, Q, hh); - if (hh != 0) { - h[hindex++] = hh; - } - } - if ((Q != 0.0) || (hindex == 0)) { - h[hindex++] = Q; - } - return hindex; -} - -/*****************************************************************************/ -/* */ -/* estimate() Produce a one-word estimate of an expansion's value. */ -/* */ -/* See my Robust Predicates paper for details. */ -/* */ -/*****************************************************************************/ - -REAL estimate(elen, e) -int elen; -REAL *e; -{ - REAL Q; - int eindex; - - Q = e[0]; - for (eindex = 1; eindex < elen; eindex++) { - Q += e[eindex]; - } - return Q; -} - -/*****************************************************************************/ -/* */ -/* counterclockwise() Return a positive value if the points pa, pb, and */ -/* pc occur in counterclockwise order; a negative */ -/* value if they occur in clockwise order; and zero */ -/* if they are collinear. The result is also a rough */ -/* approximation of twice the signed area of the */ -/* triangle defined by the three points. */ -/* */ -/* Uses exact arithmetic if necessary to ensure a correct answer. The */ -/* result returned is the determinant of a matrix. This determinant is */ -/* computed adaptively, in the sense that exact arithmetic is used only to */ -/* the degree it is needed to ensure that the returned value has the */ -/* correct sign. Hence, this function is usually quite fast, but will run */ -/* more slowly when the input points are collinear or nearly so. */ -/* */ -/* See my Robust Predicates paper for details. */ -/* */ -/*****************************************************************************/ - -REAL counterclockwiseadapt(pa, pb, pc, detsum) -point pa; -point pb; -point pc; -REAL detsum; -{ - INEXACT REAL acx, acy, bcx, bcy; - REAL acxtail, acytail, bcxtail, bcytail; - INEXACT REAL detleft, detright; - REAL detlefttail, detrighttail; - REAL det, errbound; - REAL B[4], C1[8], C2[12], D[16]; - INEXACT REAL B3; - int C1length, C2length, Dlength; - REAL u[4]; - INEXACT REAL u3; - INEXACT REAL s1, t1; - REAL s0, t0; - - INEXACT REAL bvirt; - REAL avirt, bround, around; - INEXACT REAL c; - INEXACT REAL abig; - REAL ahi, alo, bhi, blo; - REAL err1, err2, err3; - INEXACT REAL _i, _j; - REAL _0; - - acx = (REAL) (pa[0] - pc[0]); - bcx = (REAL) (pb[0] - pc[0]); - acy = (REAL) (pa[1] - pc[1]); - bcy = (REAL) (pb[1] - pc[1]); - - Two_Product(acx, bcy, detleft, detlefttail); - Two_Product(acy, bcx, detright, detrighttail); - - Two_Two_Diff(detleft, detlefttail, detright, detrighttail, - B3, B[2], B[1], B[0]); - B[3] = B3; - - det = estimate(4, B); - errbound = ccwerrboundB * detsum; - if ((det >= errbound) || (-det >= errbound)) { - return det; - } - - Two_Diff_Tail(pa[0], pc[0], acx, acxtail); - Two_Diff_Tail(pb[0], pc[0], bcx, bcxtail); - Two_Diff_Tail(pa[1], pc[1], acy, acytail); - Two_Diff_Tail(pb[1], pc[1], bcy, bcytail); - - if ((acxtail == 0.0) && (acytail == 0.0) - && (bcxtail == 0.0) && (bcytail == 0.0)) { - return det; - } - - errbound = ccwerrboundC * detsum + resulterrbound * Absolute(det); - det += (acx * bcytail + bcy * acxtail) - - (acy * bcxtail + bcx * acytail); - if ((det >= errbound) || (-det >= errbound)) { - return det; - } - - Two_Product(acxtail, bcy, s1, s0); - Two_Product(acytail, bcx, t1, t0); - Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); - u[3] = u3; - C1length = fast_expansion_sum_zeroelim(4, B, 4, u, C1); - - Two_Product(acx, bcytail, s1, s0); - Two_Product(acy, bcxtail, t1, t0); - Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); - u[3] = u3; - C2length = fast_expansion_sum_zeroelim(C1length, C1, 4, u, C2); - - Two_Product(acxtail, bcytail, s1, s0); - Two_Product(acytail, bcxtail, t1, t0); - Two_Two_Diff(s1, s0, t1, t0, u3, u[2], u[1], u[0]); - u[3] = u3; - Dlength = fast_expansion_sum_zeroelim(C2length, C2, 4, u, D); - - return(D[Dlength - 1]); -} - -REAL counterclockwise(pa, pb, pc) -point pa; -point pb; -point pc; -{ - REAL detleft, detright, det; - REAL detsum, errbound; - - counterclockcount++; - - detleft = (pa[0] - pc[0]) * (pb[1] - pc[1]); - detright = (pa[1] - pc[1]) * (pb[0] - pc[0]); - det = detleft - detright; - - if (noexact) { - return det; - } - - if (detleft > 0.0) { - if (detright <= 0.0) { - return det; - } else { - detsum = detleft + detright; - } - } else if (detleft < 0.0) { - if (detright >= 0.0) { - return det; - } else { - detsum = -detleft - detright; - } - } else { - return det; - } - - errbound = ccwerrboundA * detsum; - if ((det >= errbound) || (-det >= errbound)) { - return det; - } - - return counterclockwiseadapt(pa, pb, pc, detsum); -} - -/*****************************************************************************/ -/* */ -/* incircle() Return a positive value if the point pd lies inside the */ -/* circle passing through pa, pb, and pc; a negative value if */ -/* it lies outside; and zero if the four points are cocircular.*/ -/* The points pa, pb, and pc must be in counterclockwise */ -/* order, or the sign of the result will be reversed. */ -/* */ -/* Uses exact arithmetic if necessary to ensure a correct answer. The */ -/* result returned is the determinant of a matrix. This determinant is */ -/* computed adaptively, in the sense that exact arithmetic is used only to */ -/* the degree it is needed to ensure that the returned value has the */ -/* correct sign. Hence, this function is usually quite fast, but will run */ -/* more slowly when the input points are cocircular or nearly so. */ -/* */ -/* See my Robust Predicates paper for details. */ -/* */ -/*****************************************************************************/ - -REAL incircleadapt(pa, pb, pc, pd, permanent) -point pa; -point pb; -point pc; -point pd; -REAL permanent; -{ - INEXACT REAL adx, bdx, cdx, ady, bdy, cdy; - REAL det, errbound; - - INEXACT REAL bdxcdy1, cdxbdy1, cdxady1, adxcdy1, adxbdy1, bdxady1; - REAL bdxcdy0, cdxbdy0, cdxady0, adxcdy0, adxbdy0, bdxady0; - REAL bc[4], ca[4], ab[4]; - INEXACT REAL bc3, ca3, ab3; - REAL axbc[8], axxbc[16], aybc[8], ayybc[16], adet[32]; - int axbclen, axxbclen, aybclen, ayybclen, alen; - REAL bxca[8], bxxca[16], byca[8], byyca[16], bdet[32]; - int bxcalen, bxxcalen, bycalen, byycalen, blen; - REAL cxab[8], cxxab[16], cyab[8], cyyab[16], cdet[32]; - int cxablen, cxxablen, cyablen, cyyablen, clen; - REAL abdet[64]; - int ablen; - REAL fin1[1152], fin2[1152]; - REAL *finnow, *finother, *finswap; - int finlength; - - REAL adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail; - INEXACT REAL adxadx1, adyady1, bdxbdx1, bdybdy1, cdxcdx1, cdycdy1; - REAL adxadx0, adyady0, bdxbdx0, bdybdy0, cdxcdx0, cdycdy0; - REAL aa[4], bb[4], cc[4]; - INEXACT REAL aa3, bb3, cc3; - INEXACT REAL ti1, tj1; - REAL ti0, tj0; - REAL u[4], v[4]; - INEXACT REAL u3, v3; - REAL temp8[8], temp16a[16], temp16b[16], temp16c[16]; - REAL temp32a[32], temp32b[32], temp48[48], temp64[64]; - int temp8len, temp16alen, temp16blen, temp16clen; - int temp32alen, temp32blen, temp48len, temp64len; - REAL axtbb[8], axtcc[8], aytbb[8], aytcc[8]; - int axtbblen, axtcclen, aytbblen, aytcclen; - REAL bxtaa[8], bxtcc[8], bytaa[8], bytcc[8]; - int bxtaalen, bxtcclen, bytaalen, bytcclen; - REAL cxtaa[8], cxtbb[8], cytaa[8], cytbb[8]; - int cxtaalen, cxtbblen, cytaalen, cytbblen; - REAL axtbc[8], aytbc[8], bxtca[8], bytca[8], cxtab[8], cytab[8]; - int axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen; - REAL axtbct[16], aytbct[16], bxtcat[16], bytcat[16], cxtabt[16], cytabt[16]; - int axtbctlen, aytbctlen, bxtcatlen, bytcatlen, cxtabtlen, cytabtlen; - REAL axtbctt[8], aytbctt[8], bxtcatt[8]; - REAL bytcatt[8], cxtabtt[8], cytabtt[8]; - int axtbcttlen, aytbcttlen, bxtcattlen, bytcattlen, cxtabttlen, cytabttlen; - REAL abt[8], bct[8], cat[8]; - int abtlen, bctlen, catlen; - REAL abtt[4], bctt[4], catt[4]; - int abttlen, bcttlen, cattlen; - INEXACT REAL abtt3, bctt3, catt3; - REAL negate; - - INEXACT REAL bvirt; - REAL avirt, bround, around; - INEXACT REAL c; - INEXACT REAL abig; - REAL ahi, alo, bhi, blo; - REAL err1, err2, err3; - INEXACT REAL _i, _j; - REAL _0; - - adx = (REAL) (pa[0] - pd[0]); - bdx = (REAL) (pb[0] - pd[0]); - cdx = (REAL) (pc[0] - pd[0]); - ady = (REAL) (pa[1] - pd[1]); - bdy = (REAL) (pb[1] - pd[1]); - cdy = (REAL) (pc[1] - pd[1]); - - Two_Product(bdx, cdy, bdxcdy1, bdxcdy0); - Two_Product(cdx, bdy, cdxbdy1, cdxbdy0); - Two_Two_Diff(bdxcdy1, bdxcdy0, cdxbdy1, cdxbdy0, bc3, bc[2], bc[1], bc[0]); - bc[3] = bc3; - axbclen = scale_expansion_zeroelim(4, bc, adx, axbc); - axxbclen = scale_expansion_zeroelim(axbclen, axbc, adx, axxbc); - aybclen = scale_expansion_zeroelim(4, bc, ady, aybc); - ayybclen = scale_expansion_zeroelim(aybclen, aybc, ady, ayybc); - alen = fast_expansion_sum_zeroelim(axxbclen, axxbc, ayybclen, ayybc, adet); - - Two_Product(cdx, ady, cdxady1, cdxady0); - Two_Product(adx, cdy, adxcdy1, adxcdy0); - Two_Two_Diff(cdxady1, cdxady0, adxcdy1, adxcdy0, ca3, ca[2], ca[1], ca[0]); - ca[3] = ca3; - bxcalen = scale_expansion_zeroelim(4, ca, bdx, bxca); - bxxcalen = scale_expansion_zeroelim(bxcalen, bxca, bdx, bxxca); - bycalen = scale_expansion_zeroelim(4, ca, bdy, byca); - byycalen = scale_expansion_zeroelim(bycalen, byca, bdy, byyca); - blen = fast_expansion_sum_zeroelim(bxxcalen, bxxca, byycalen, byyca, bdet); - - Two_Product(adx, bdy, adxbdy1, adxbdy0); - Two_Product(bdx, ady, bdxady1, bdxady0); - Two_Two_Diff(adxbdy1, adxbdy0, bdxady1, bdxady0, ab3, ab[2], ab[1], ab[0]); - ab[3] = ab3; - cxablen = scale_expansion_zeroelim(4, ab, cdx, cxab); - cxxablen = scale_expansion_zeroelim(cxablen, cxab, cdx, cxxab); - cyablen = scale_expansion_zeroelim(4, ab, cdy, cyab); - cyyablen = scale_expansion_zeroelim(cyablen, cyab, cdy, cyyab); - clen = fast_expansion_sum_zeroelim(cxxablen, cxxab, cyyablen, cyyab, cdet); - - ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet); - finlength = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, fin1); - - det = estimate(finlength, fin1); - errbound = iccerrboundB * permanent; - if ((det >= errbound) || (-det >= errbound)) { - return det; - } - - Two_Diff_Tail(pa[0], pd[0], adx, adxtail); - Two_Diff_Tail(pa[1], pd[1], ady, adytail); - Two_Diff_Tail(pb[0], pd[0], bdx, bdxtail); - Two_Diff_Tail(pb[1], pd[1], bdy, bdytail); - Two_Diff_Tail(pc[0], pd[0], cdx, cdxtail); - Two_Diff_Tail(pc[1], pd[1], cdy, cdytail); - if ((adxtail == 0.0) && (bdxtail == 0.0) && (cdxtail == 0.0) - && (adytail == 0.0) && (bdytail == 0.0) && (cdytail == 0.0)) { - return det; - } - - errbound = iccerrboundC * permanent + resulterrbound * Absolute(det); - det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - - (bdy * cdxtail + cdx * bdytail)) - + 2.0 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) - + ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - - (cdy * adxtail + adx * cdytail)) - + 2.0 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) - + ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - - (ady * bdxtail + bdx * adytail)) - + 2.0 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx)); - if ((det >= errbound) || (-det >= errbound)) { - return det; - } - - finnow = fin1; - finother = fin2; - - if ((bdxtail != 0.0) || (bdytail != 0.0) - || (cdxtail != 0.0) || (cdytail != 0.0)) { - Square(adx, adxadx1, adxadx0); - Square(ady, adyady1, adyady0); - Two_Two_Sum(adxadx1, adxadx0, adyady1, adyady0, aa3, aa[2], aa[1], aa[0]); - aa[3] = aa3; - } - if ((cdxtail != 0.0) || (cdytail != 0.0) - || (adxtail != 0.0) || (adytail != 0.0)) { - Square(bdx, bdxbdx1, bdxbdx0); - Square(bdy, bdybdy1, bdybdy0); - Two_Two_Sum(bdxbdx1, bdxbdx0, bdybdy1, bdybdy0, bb3, bb[2], bb[1], bb[0]); - bb[3] = bb3; - } - if ((adxtail != 0.0) || (adytail != 0.0) - || (bdxtail != 0.0) || (bdytail != 0.0)) { - Square(cdx, cdxcdx1, cdxcdx0); - Square(cdy, cdycdy1, cdycdy0); - Two_Two_Sum(cdxcdx1, cdxcdx0, cdycdy1, cdycdy0, cc3, cc[2], cc[1], cc[0]); - cc[3] = cc3; - } - - if (adxtail != 0.0) { - axtbclen = scale_expansion_zeroelim(4, bc, adxtail, axtbc); - temp16alen = scale_expansion_zeroelim(axtbclen, axtbc, 2.0 * adx, - temp16a); - - axtcclen = scale_expansion_zeroelim(4, cc, adxtail, axtcc); - temp16blen = scale_expansion_zeroelim(axtcclen, axtcc, bdy, temp16b); - - axtbblen = scale_expansion_zeroelim(4, bb, adxtail, axtbb); - temp16clen = scale_expansion_zeroelim(axtbblen, axtbb, -cdy, temp16c); - - temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (adytail != 0.0) { - aytbclen = scale_expansion_zeroelim(4, bc, adytail, aytbc); - temp16alen = scale_expansion_zeroelim(aytbclen, aytbc, 2.0 * ady, - temp16a); - - aytbblen = scale_expansion_zeroelim(4, bb, adytail, aytbb); - temp16blen = scale_expansion_zeroelim(aytbblen, aytbb, cdx, temp16b); - - aytcclen = scale_expansion_zeroelim(4, cc, adytail, aytcc); - temp16clen = scale_expansion_zeroelim(aytcclen, aytcc, -bdx, temp16c); - - temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (bdxtail != 0.0) { - bxtcalen = scale_expansion_zeroelim(4, ca, bdxtail, bxtca); - temp16alen = scale_expansion_zeroelim(bxtcalen, bxtca, 2.0 * bdx, - temp16a); - - bxtaalen = scale_expansion_zeroelim(4, aa, bdxtail, bxtaa); - temp16blen = scale_expansion_zeroelim(bxtaalen, bxtaa, cdy, temp16b); - - bxtcclen = scale_expansion_zeroelim(4, cc, bdxtail, bxtcc); - temp16clen = scale_expansion_zeroelim(bxtcclen, bxtcc, -ady, temp16c); - - temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (bdytail != 0.0) { - bytcalen = scale_expansion_zeroelim(4, ca, bdytail, bytca); - temp16alen = scale_expansion_zeroelim(bytcalen, bytca, 2.0 * bdy, - temp16a); - - bytcclen = scale_expansion_zeroelim(4, cc, bdytail, bytcc); - temp16blen = scale_expansion_zeroelim(bytcclen, bytcc, adx, temp16b); - - bytaalen = scale_expansion_zeroelim(4, aa, bdytail, bytaa); - temp16clen = scale_expansion_zeroelim(bytaalen, bytaa, -cdx, temp16c); - - temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (cdxtail != 0.0) { - cxtablen = scale_expansion_zeroelim(4, ab, cdxtail, cxtab); - temp16alen = scale_expansion_zeroelim(cxtablen, cxtab, 2.0 * cdx, - temp16a); - - cxtbblen = scale_expansion_zeroelim(4, bb, cdxtail, cxtbb); - temp16blen = scale_expansion_zeroelim(cxtbblen, cxtbb, ady, temp16b); - - cxtaalen = scale_expansion_zeroelim(4, aa, cdxtail, cxtaa); - temp16clen = scale_expansion_zeroelim(cxtaalen, cxtaa, -bdy, temp16c); - - temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (cdytail != 0.0) { - cytablen = scale_expansion_zeroelim(4, ab, cdytail, cytab); - temp16alen = scale_expansion_zeroelim(cytablen, cytab, 2.0 * cdy, - temp16a); - - cytaalen = scale_expansion_zeroelim(4, aa, cdytail, cytaa); - temp16blen = scale_expansion_zeroelim(cytaalen, cytaa, bdx, temp16b); - - cytbblen = scale_expansion_zeroelim(4, bb, cdytail, cytbb); - temp16clen = scale_expansion_zeroelim(cytbblen, cytbb, -adx, temp16c); - - temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - - if ((adxtail != 0.0) || (adytail != 0.0)) { - if ((bdxtail != 0.0) || (bdytail != 0.0) - || (cdxtail != 0.0) || (cdytail != 0.0)) { - Two_Product(bdxtail, cdy, ti1, ti0); - Two_Product(bdx, cdytail, tj1, tj0); - Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); - u[3] = u3; - negate = -bdy; - Two_Product(cdxtail, negate, ti1, ti0); - negate = -bdytail; - Two_Product(cdx, negate, tj1, tj0); - Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); - v[3] = v3; - bctlen = fast_expansion_sum_zeroelim(4, u, 4, v, bct); - - Two_Product(bdxtail, cdytail, ti1, ti0); - Two_Product(cdxtail, bdytail, tj1, tj0); - Two_Two_Diff(ti1, ti0, tj1, tj0, bctt3, bctt[2], bctt[1], bctt[0]); - bctt[3] = bctt3; - bcttlen = 4; - } else { - bct[0] = 0.0; - bctlen = 1; - bctt[0] = 0.0; - bcttlen = 1; - } - - if (adxtail != 0.0) { - temp16alen = scale_expansion_zeroelim(axtbclen, axtbc, adxtail, temp16a); - axtbctlen = scale_expansion_zeroelim(bctlen, bct, adxtail, axtbct); - temp32alen = scale_expansion_zeroelim(axtbctlen, axtbct, 2.0 * adx, - temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - if (bdytail != 0.0) { - temp8len = scale_expansion_zeroelim(4, cc, adxtail, temp8); - temp16alen = scale_expansion_zeroelim(temp8len, temp8, bdytail, - temp16a); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, - temp16a, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (cdytail != 0.0) { - temp8len = scale_expansion_zeroelim(4, bb, -adxtail, temp8); - temp16alen = scale_expansion_zeroelim(temp8len, temp8, cdytail, - temp16a); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, - temp16a, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - - temp32alen = scale_expansion_zeroelim(axtbctlen, axtbct, adxtail, - temp32a); - axtbcttlen = scale_expansion_zeroelim(bcttlen, bctt, adxtail, axtbctt); - temp16alen = scale_expansion_zeroelim(axtbcttlen, axtbctt, 2.0 * adx, - temp16a); - temp16blen = scale_expansion_zeroelim(axtbcttlen, axtbctt, adxtail, - temp16b); - temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32b); - temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, - temp32blen, temp32b, temp64); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, - temp64, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (adytail != 0.0) { - temp16alen = scale_expansion_zeroelim(aytbclen, aytbc, adytail, temp16a); - aytbctlen = scale_expansion_zeroelim(bctlen, bct, adytail, aytbct); - temp32alen = scale_expansion_zeroelim(aytbctlen, aytbct, 2.0 * ady, - temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - - - temp32alen = scale_expansion_zeroelim(aytbctlen, aytbct, adytail, - temp32a); - aytbcttlen = scale_expansion_zeroelim(bcttlen, bctt, adytail, aytbctt); - temp16alen = scale_expansion_zeroelim(aytbcttlen, aytbctt, 2.0 * ady, - temp16a); - temp16blen = scale_expansion_zeroelim(aytbcttlen, aytbctt, adytail, - temp16b); - temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32b); - temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, - temp32blen, temp32b, temp64); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, - temp64, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - } - if ((bdxtail != 0.0) || (bdytail != 0.0)) { - if ((cdxtail != 0.0) || (cdytail != 0.0) - || (adxtail != 0.0) || (adytail != 0.0)) { - Two_Product(cdxtail, ady, ti1, ti0); - Two_Product(cdx, adytail, tj1, tj0); - Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); - u[3] = u3; - negate = -cdy; - Two_Product(adxtail, negate, ti1, ti0); - negate = -cdytail; - Two_Product(adx, negate, tj1, tj0); - Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); - v[3] = v3; - catlen = fast_expansion_sum_zeroelim(4, u, 4, v, cat); - - Two_Product(cdxtail, adytail, ti1, ti0); - Two_Product(adxtail, cdytail, tj1, tj0); - Two_Two_Diff(ti1, ti0, tj1, tj0, catt3, catt[2], catt[1], catt[0]); - catt[3] = catt3; - cattlen = 4; - } else { - cat[0] = 0.0; - catlen = 1; - catt[0] = 0.0; - cattlen = 1; - } - - if (bdxtail != 0.0) { - temp16alen = scale_expansion_zeroelim(bxtcalen, bxtca, bdxtail, temp16a); - bxtcatlen = scale_expansion_zeroelim(catlen, cat, bdxtail, bxtcat); - temp32alen = scale_expansion_zeroelim(bxtcatlen, bxtcat, 2.0 * bdx, - temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - if (cdytail != 0.0) { - temp8len = scale_expansion_zeroelim(4, aa, bdxtail, temp8); - temp16alen = scale_expansion_zeroelim(temp8len, temp8, cdytail, - temp16a); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, - temp16a, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (adytail != 0.0) { - temp8len = scale_expansion_zeroelim(4, cc, -bdxtail, temp8); - temp16alen = scale_expansion_zeroelim(temp8len, temp8, adytail, - temp16a); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, - temp16a, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - - temp32alen = scale_expansion_zeroelim(bxtcatlen, bxtcat, bdxtail, - temp32a); - bxtcattlen = scale_expansion_zeroelim(cattlen, catt, bdxtail, bxtcatt); - temp16alen = scale_expansion_zeroelim(bxtcattlen, bxtcatt, 2.0 * bdx, - temp16a); - temp16blen = scale_expansion_zeroelim(bxtcattlen, bxtcatt, bdxtail, - temp16b); - temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32b); - temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, - temp32blen, temp32b, temp64); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, - temp64, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (bdytail != 0.0) { - temp16alen = scale_expansion_zeroelim(bytcalen, bytca, bdytail, temp16a); - bytcatlen = scale_expansion_zeroelim(catlen, cat, bdytail, bytcat); - temp32alen = scale_expansion_zeroelim(bytcatlen, bytcat, 2.0 * bdy, - temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - - - temp32alen = scale_expansion_zeroelim(bytcatlen, bytcat, bdytail, - temp32a); - bytcattlen = scale_expansion_zeroelim(cattlen, catt, bdytail, bytcatt); - temp16alen = scale_expansion_zeroelim(bytcattlen, bytcatt, 2.0 * bdy, - temp16a); - temp16blen = scale_expansion_zeroelim(bytcattlen, bytcatt, bdytail, - temp16b); - temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32b); - temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, - temp32blen, temp32b, temp64); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, - temp64, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - } - if ((cdxtail != 0.0) || (cdytail != 0.0)) { - if ((adxtail != 0.0) || (adytail != 0.0) - || (bdxtail != 0.0) || (bdytail != 0.0)) { - Two_Product(adxtail, bdy, ti1, ti0); - Two_Product(adx, bdytail, tj1, tj0); - Two_Two_Sum(ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0]); - u[3] = u3; - negate = -ady; - Two_Product(bdxtail, negate, ti1, ti0); - negate = -adytail; - Two_Product(bdx, negate, tj1, tj0); - Two_Two_Sum(ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0]); - v[3] = v3; - abtlen = fast_expansion_sum_zeroelim(4, u, 4, v, abt); - - Two_Product(adxtail, bdytail, ti1, ti0); - Two_Product(bdxtail, adytail, tj1, tj0); - Two_Two_Diff(ti1, ti0, tj1, tj0, abtt3, abtt[2], abtt[1], abtt[0]); - abtt[3] = abtt3; - abttlen = 4; - } else { - abt[0] = 0.0; - abtlen = 1; - abtt[0] = 0.0; - abttlen = 1; - } - - if (cdxtail != 0.0) { - temp16alen = scale_expansion_zeroelim(cxtablen, cxtab, cdxtail, temp16a); - cxtabtlen = scale_expansion_zeroelim(abtlen, abt, cdxtail, cxtabt); - temp32alen = scale_expansion_zeroelim(cxtabtlen, cxtabt, 2.0 * cdx, - temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - if (adytail != 0.0) { - temp8len = scale_expansion_zeroelim(4, bb, cdxtail, temp8); - temp16alen = scale_expansion_zeroelim(temp8len, temp8, adytail, - temp16a); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, - temp16a, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (bdytail != 0.0) { - temp8len = scale_expansion_zeroelim(4, aa, -cdxtail, temp8); - temp16alen = scale_expansion_zeroelim(temp8len, temp8, bdytail, - temp16a); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp16alen, - temp16a, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - - temp32alen = scale_expansion_zeroelim(cxtabtlen, cxtabt, cdxtail, - temp32a); - cxtabttlen = scale_expansion_zeroelim(abttlen, abtt, cdxtail, cxtabtt); - temp16alen = scale_expansion_zeroelim(cxtabttlen, cxtabtt, 2.0 * cdx, - temp16a); - temp16blen = scale_expansion_zeroelim(cxtabttlen, cxtabtt, cdxtail, - temp16b); - temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32b); - temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, - temp32blen, temp32b, temp64); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, - temp64, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - if (cdytail != 0.0) { - temp16alen = scale_expansion_zeroelim(cytablen, cytab, cdytail, temp16a); - cytabtlen = scale_expansion_zeroelim(abtlen, abt, cdytail, cytabt); - temp32alen = scale_expansion_zeroelim(cytabtlen, cytabt, 2.0 * cdy, - temp32a); - temp48len = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp32alen, temp32a, temp48); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len, - temp48, finother); - finswap = finnow; finnow = finother; finother = finswap; - - - temp32alen = scale_expansion_zeroelim(cytabtlen, cytabt, cdytail, - temp32a); - cytabttlen = scale_expansion_zeroelim(abttlen, abtt, cdytail, cytabtt); - temp16alen = scale_expansion_zeroelim(cytabttlen, cytabtt, 2.0 * cdy, - temp16a); - temp16blen = scale_expansion_zeroelim(cytabttlen, cytabtt, cdytail, - temp16b); - temp32blen = fast_expansion_sum_zeroelim(temp16alen, temp16a, - temp16blen, temp16b, temp32b); - temp64len = fast_expansion_sum_zeroelim(temp32alen, temp32a, - temp32blen, temp32b, temp64); - finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp64len, - temp64, finother); - finswap = finnow; finnow = finother; finother = finswap; - } - } - - return finnow[finlength - 1]; -} - -REAL incircle(pa, pb, pc, pd) -point pa; -point pb; -point pc; -point pd; -{ - REAL adx, bdx, cdx, ady, bdy, cdy; - REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady; - REAL alift, blift, clift; - REAL det; - REAL permanent, errbound; - - incirclecount++; - - adx = pa[0] - pd[0]; - bdx = pb[0] - pd[0]; - cdx = pc[0] - pd[0]; - ady = pa[1] - pd[1]; - bdy = pb[1] - pd[1]; - cdy = pc[1] - pd[1]; - - bdxcdy = bdx * cdy; - cdxbdy = cdx * bdy; - alift = adx * adx + ady * ady; - - cdxady = cdx * ady; - adxcdy = adx * cdy; - blift = bdx * bdx + bdy * bdy; - - adxbdy = adx * bdy; - bdxady = bdx * ady; - clift = cdx * cdx + cdy * cdy; - - det = alift * (bdxcdy - cdxbdy) - + blift * (cdxady - adxcdy) - + clift * (adxbdy - bdxady); - - if (noexact) { - return det; - } - - permanent = (Absolute(bdxcdy) + Absolute(cdxbdy)) * alift - + (Absolute(cdxady) + Absolute(adxcdy)) * blift - + (Absolute(adxbdy) + Absolute(bdxady)) * clift; - errbound = iccerrboundA * permanent; - if ((det > errbound) || (-det > errbound)) { - return det; - } - - return incircleadapt(pa, pb, pc, pd, permanent); -} - -/** **/ -/** **/ -/********* Determinant evaluation routines end here *********/ - -/*****************************************************************************/ -/* */ -/* triangleinit() Initialize some variables. */ -/* */ -/*****************************************************************************/ - -void triangleinit() -{ - points.maxitems = triangles.maxitems = shelles.maxitems = viri.maxitems = - badsegments.maxitems = badtriangles.maxitems = splaynodes.maxitems = 0l; - points.itembytes = triangles.itembytes = shelles.itembytes = viri.itembytes = - badsegments.itembytes = badtriangles.itembytes = splaynodes.itembytes = 0; - recenttri.tri = (triangle *) NULL; /* No triangle has been visited yet. */ - samples = 1; /* Point location should take at least one sample. */ - checksegments = 0; /* There are no segments in the triangulation yet. */ - incirclecount = counterclockcount = hyperbolacount = 0; - circumcentercount = circletopcount = 0; - randomseed = 1; - - exactinit(); /* Initialize exact arithmetic constants. */ -} - -/*****************************************************************************/ -/* */ -/* randomnation() Generate a random number between 0 and `choices' - 1. */ -/* */ -/* This is a simple linear congruential random number generator. Hence, it */ -/* is a bad random number generator, but good enough for most randomized */ -/* geometric algorithms. */ -/* */ -/*****************************************************************************/ - -unsigned long randomnation(choices) -unsigned int choices; -{ - randomseed = (randomseed * 1366l + 150889l) % 714025l; - return randomseed / (714025l / choices + 1); -} - -/********* Mesh quality testing routines begin here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* checkmesh() Test the mesh for topological consistency. */ -/* */ -/*****************************************************************************/ - -#ifndef REDUCED - -void checkmesh() -{ - struct triedge triangleloop; - struct triedge oppotri, oppooppotri; - point triorg, tridest, triapex; - point oppoorg, oppodest; - int horrors; - int saveexact; - triangle ptr; /* Temporary variable used by sym(). */ - - /* Temporarily turn on exact arithmetic if it's off. */ - saveexact = noexact; - noexact = 0; - if (!quiet) { - printf(" Checking consistency of mesh...\n"); - } - horrors = 0; - /* Run through the list of triangles, checking each one. */ - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - while (triangleloop.tri != (triangle *) NULL) { - /* Check all three edges of the triangle. */ - for (triangleloop.orient = 0; triangleloop.orient < 3; - triangleloop.orient++) { - org(triangleloop, triorg); - dest(triangleloop, tridest); - if (triangleloop.orient == 0) { /* Only test for inversion once. */ - /* Test if the triangle is flat or inverted. */ - apex(triangleloop, triapex); - if (counterclockwise(triorg, tridest, triapex) <= 0.0) { - printf(" !! !! Inverted "); - printtriangle(&triangleloop); - horrors++; - } - } - /* Find the neighboring triangle on this edge. */ - sym(triangleloop, oppotri); - if (oppotri.tri != dummytri) { - /* Check that the triangle's neighbor knows it's a neighbor. */ - sym(oppotri, oppooppotri); - if ((triangleloop.tri != oppooppotri.tri) - || (triangleloop.orient != oppooppotri.orient)) { - printf(" !! !! Asymmetric triangle-triangle bond:\n"); - if (triangleloop.tri == oppooppotri.tri) { - printf(" (Right triangle, wrong orientation)\n"); - } - printf(" First "); - printtriangle(&triangleloop); - printf(" Second (nonreciprocating) "); - printtriangle(&oppotri); - horrors++; - } - /* Check that both triangles agree on the identities */ - /* of their shared vertices. */ - org(oppotri, oppoorg); - dest(oppotri, oppodest); - if ((triorg != oppodest) || (tridest != oppoorg)) { - printf(" !! !! Mismatched edge coordinates between two triangles:\n" - ); - printf(" First mismatched "); - printtriangle(&triangleloop); - printf(" Second mismatched "); - printtriangle(&oppotri); - horrors++; - } - } - } - triangleloop.tri = triangletraverse(); - } - if (horrors == 0) { - if (!quiet) { - printf(" In my studied opinion, the mesh appears to be consistent.\n"); - } - } else if (horrors == 1) { - printf(" !! !! !! !! Precisely one festering wound discovered.\n"); - } else { - printf(" !! !! !! !! %d abominations witnessed.\n", horrors); - } - /* Restore the status of exact arithmetic. */ - noexact = saveexact; -} - -#endif /* not REDUCED */ - -/*****************************************************************************/ -/* */ -/* checkdelaunay() Ensure that the mesh is (constrained) Delaunay. */ -/* */ -/*****************************************************************************/ - -#ifndef REDUCED - -void checkdelaunay() -{ - struct triedge triangleloop; - struct triedge oppotri; - struct edge opposhelle; - point triorg, tridest, triapex; - point oppoapex; - int shouldbedelaunay; - int horrors; - int saveexact; - triangle ptr; /* Temporary variable used by sym(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - - /* Temporarily turn on exact arithmetic if it's off. */ - saveexact = noexact; - noexact = 0; - if (!quiet) { - printf(" Checking Delaunay property of mesh...\n"); - } - horrors = 0; - /* Run through the list of triangles, checking each one. */ - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - while (triangleloop.tri != (triangle *) NULL) { - /* Check all three edges of the triangle. */ - for (triangleloop.orient = 0; triangleloop.orient < 3; - triangleloop.orient++) { - org(triangleloop, triorg); - dest(triangleloop, tridest); - apex(triangleloop, triapex); - sym(triangleloop, oppotri); - apex(oppotri, oppoapex); - /* Only test that the edge is locally Delaunay if there is an */ - /* adjoining triangle whose pointer is larger (to ensure that */ - /* each pair isn't tested twice). */ - shouldbedelaunay = (oppotri.tri != dummytri) - && (triapex != (point) NULL) && (oppoapex != (point) NULL) - && (triangleloop.tri < oppotri.tri); - if (checksegments && shouldbedelaunay) { - /* If a shell edge separates the triangles, then the edge is */ - /* constrained, so no local Delaunay test should be done. */ - tspivot(triangleloop, opposhelle); - if (opposhelle.sh != dummysh){ - shouldbedelaunay = 0; - } - } - if (shouldbedelaunay) { - if (incircle(triorg, tridest, triapex, oppoapex) > 0.0) { - printf(" !! !! Non-Delaunay pair of triangles:\n"); - printf(" First non-Delaunay "); - printtriangle(&triangleloop); - printf(" Second non-Delaunay "); - printtriangle(&oppotri); - horrors++; - } - } - } - triangleloop.tri = triangletraverse(); - } - if (horrors == 0) { - if (!quiet) { - printf( - " By virtue of my perceptive intelligence, I declare the mesh Delaunay.\n"); - } - } else if (horrors == 1) { - printf( - " !! !! !! !! Precisely one terrifying transgression identified.\n"); - } else { - printf(" !! !! !! !! %d obscenities viewed with horror.\n", horrors); - } - /* Restore the status of exact arithmetic. */ - noexact = saveexact; -} - -#endif /* not REDUCED */ - -/*****************************************************************************/ -/* */ -/* enqueuebadtri() Add a bad triangle to the end of a queue. */ -/* */ -/* The queue is actually a set of 64 queues. I use multiple queues to give */ -/* priority to smaller angles. I originally implemented a heap, but the */ -/* queues are (to my surprise) much faster. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -void enqueuebadtri(instri, angle, insapex, insorg, insdest) -struct triedge *instri; -REAL angle; -point insapex; -point insorg; -point insdest; -{ - struct badface *newface; - int queuenumber; - - if (verbose > 2) { - printf(" Queueing bad triangle:\n"); - printf(" (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", insorg[0], - insorg[1], insdest[0], insdest[1], insapex[0], insapex[1]); - } - /* Allocate space for the bad triangle. */ - newface = (struct badface *) poolalloc(&badtriangles); - triedgecopy(*instri, newface->badfacetri); - newface->key = angle; - newface->faceapex = insapex; - newface->faceorg = insorg; - newface->facedest = insdest; - newface->nextface = (struct badface *) NULL; - /* Determine the appropriate queue to put the bad triangle into. */ - if (angle > 0.6) { - queuenumber = (int) (160.0 * (angle - 0.6)); - if (queuenumber > 63) { - queuenumber = 63; - } - } else { - /* It's not a bad angle; put the triangle in the lowest-priority queue. */ - queuenumber = 0; - } - /* Add the triangle to the end of a queue. */ - *queuetail[queuenumber] = newface; - /* Maintain a pointer to the NULL pointer at the end of the queue. */ - queuetail[queuenumber] = &newface->nextface; -} - -#endif /* not CDT_ONLY */ - -/*****************************************************************************/ -/* */ -/* dequeuebadtri() Remove a triangle from the front of the queue. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -struct badface *dequeuebadtri() -{ - struct badface *result; - int queuenumber; - - /* Look for a nonempty queue. */ - for (queuenumber = 63; queuenumber >= 0; queuenumber--) { - result = queuefront[queuenumber]; - if (result != (struct badface *) NULL) { - /* Remove the triangle from the queue. */ - queuefront[queuenumber] = result->nextface; - /* Maintain a pointer to the NULL pointer at the end of the queue. */ - if (queuefront[queuenumber] == (struct badface *) NULL) { - queuetail[queuenumber] = &queuefront[queuenumber]; - } - return result; - } - } - return (struct badface *) NULL; -} - -#endif /* not CDT_ONLY */ - -/*****************************************************************************/ -/* */ -/* checkedge4encroach() Check a segment to see if it is encroached; add */ -/* it to the list if it is. */ -/* */ -/* An encroached segment is an unflippable edge that has a point in its */ -/* diametral circle (that is, it faces an angle greater than 90 degrees). */ -/* This definition is due to Ruppert. */ -/* */ -/* Returns a nonzero value if the edge is encroached. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -int checkedge4encroach(testedge) -struct edge *testedge; -{ - struct triedge neighbortri; - struct edge testsym; - struct edge *badedge; - int addtolist; - int sides; - point eorg, edest, eapex; - triangle ptr; /* Temporary variable used by stpivot(). */ - - addtolist = 0; - sides = 0; - - sorg(*testedge, eorg); - sdest(*testedge, edest); - /* Check one neighbor of the shell edge. */ - stpivot(*testedge, neighbortri); - /* Does the neighbor exist, or is this a boundary edge? */ - if (neighbortri.tri != dummytri) { - sides++; - /* Find a vertex opposite this edge. */ - apex(neighbortri, eapex); - /* Check whether the vertex is inside the diametral circle of the */ - /* shell edge. Pythagoras' Theorem is used to check whether the */ - /* angle at the vertex is greater than 90 degrees. */ - if (eapex[0] * (eorg[0] + edest[0]) + eapex[1] * (eorg[1] + edest[1]) > - eapex[0] * eapex[0] + eorg[0] * edest[0] + - eapex[1] * eapex[1] + eorg[1] * edest[1]) { - addtolist = 1; - } - } - /* Check the other neighbor of the shell edge. */ - ssym(*testedge, testsym); - stpivot(testsym, neighbortri); - /* Does the neighbor exist, or is this a boundary edge? */ - if (neighbortri.tri != dummytri) { - sides++; - /* Find the other vertex opposite this edge. */ - apex(neighbortri, eapex); - /* Check whether the vertex is inside the diametral circle of the */ - /* shell edge. Pythagoras' Theorem is used to check whether the */ - /* angle at the vertex is greater than 90 degrees. */ - if (eapex[0] * (eorg[0] + edest[0]) + - eapex[1] * (eorg[1] + edest[1]) > - eapex[0] * eapex[0] + eorg[0] * edest[0] + - eapex[1] * eapex[1] + eorg[1] * edest[1]) { - addtolist += 2; - } - } - - if (addtolist && (!nobisect || ((nobisect == 1) && (sides == 2)))) { - if (verbose > 2) { - printf(" Queueing encroached segment (%.12g, %.12g) (%.12g, %.12g).\n", - eorg[0], eorg[1], edest[0], edest[1]); - } - /* Add the shell edge to the list of encroached segments. */ - /* Be sure to get the orientation right. */ - badedge = (struct edge *) poolalloc(&badsegments); - if (addtolist == 1) { - shellecopy(*testedge, *badedge); - } else { - shellecopy(testsym, *badedge); - } - } - return addtolist; -} - -#endif /* not CDT_ONLY */ - -/*****************************************************************************/ -/* */ -/* testtriangle() Test a face for quality measures. */ -/* */ -/* Tests a triangle to see if it satisfies the minimum angle condition and */ -/* the maximum area condition. Triangles that aren't up to spec are added */ -/* to the bad triangle queue. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -void testtriangle(testtri) -struct triedge *testtri; -{ - struct triedge sametesttri; - struct edge edge1, edge2; - point torg, tdest, tapex; - point anglevertex; - REAL dxod, dyod, dxda, dyda, dxao, dyao; - REAL dxod2, dyod2, dxda2, dyda2, dxao2, dyao2; - REAL apexlen, orglen, destlen; - REAL angle; - REAL area; - shelle sptr; /* Temporary variable used by tspivot(). */ - - org(*testtri, torg); - dest(*testtri, tdest); - apex(*testtri, tapex); - dxod = torg[0] - tdest[0]; - dyod = torg[1] - tdest[1]; - dxda = tdest[0] - tapex[0]; - dyda = tdest[1] - tapex[1]; - dxao = tapex[0] - torg[0]; - dyao = tapex[1] - torg[1]; - dxod2 = dxod * dxod; - dyod2 = dyod * dyod; - dxda2 = dxda * dxda; - dyda2 = dyda * dyda; - dxao2 = dxao * dxao; - dyao2 = dyao * dyao; - /* Find the lengths of the triangle's three edges. */ - apexlen = dxod2 + dyod2; - orglen = dxda2 + dyda2; - destlen = dxao2 + dyao2; - if ((apexlen < orglen) && (apexlen < destlen)) { - /* The edge opposite the apex is shortest. */ - /* Find the square of the cosine of the angle at the apex. */ - angle = dxda * dxao + dyda * dyao; - angle = angle * angle / (orglen * destlen); - anglevertex = tapex; - lnext(*testtri, sametesttri); - tspivot(sametesttri, edge1); - lnextself(sametesttri); - tspivot(sametesttri, edge2); - } else if (orglen < destlen) { - /* The edge opposite the origin is shortest. */ - /* Find the square of the cosine of the angle at the origin. */ - angle = dxod * dxao + dyod * dyao; - angle = angle * angle / (apexlen * destlen); - anglevertex = torg; - tspivot(*testtri, edge1); - lprev(*testtri, sametesttri); - tspivot(sametesttri, edge2); - } else { - /* The edge opposite the destination is shortest. */ - /* Find the square of the cosine of the angle at the destination. */ - angle = dxod * dxda + dyod * dyda; - angle = angle * angle / (apexlen * orglen); - anglevertex = tdest; - tspivot(*testtri, edge1); - lnext(*testtri, sametesttri); - tspivot(sametesttri, edge2); - } - /* Check if both edges that form the angle are segments. */ - if ((edge1.sh != dummysh) && (edge2.sh != dummysh)) { - /* The angle is a segment intersection. */ - if ((angle > 0.9924) && !quiet) { /* Roughly 5 degrees. */ - if (angle > 1.0) { - /* Beware of a floating exception in acos(). */ - angle = 1.0; - } - /* Find the actual angle in degrees, for printing. */ - angle = acos(sqrt(angle)) * (180.0 / PI); - printf( - "Warning: Small angle (%.4g degrees) between segments at point\n", - angle); - printf(" (%.12g, %.12g)\n", anglevertex[0], anglevertex[1]); - } - /* Don't add this bad triangle to the list; there's nothing that */ - /* can be done about a small angle between two segments. */ - angle = 0.0; - } - /* Check whether the angle is smaller than permitted. */ - if (angle > goodangle) { - /* Add this triangle to the list of bad triangles. */ - enqueuebadtri(testtri, angle, tapex, torg, tdest); - return; - } - if (vararea || fixedarea) { - /* Check whether the area is larger than permitted. */ - area = 0.5 * (dxod * dyda - dyod * dxda); - -#if 0 - if ( area < 1.0 / (2.0 * 3600.0 * 3600.0) ) { - /* FGFS ADDITION!!! */ - /* small enough, don't add to list of bad triangles */ - printf("REJECTING TRIANGLE OF AREA %.6g\n", area); - } -#endif - - if (fixedarea && (area > maxarea)) { - /* Add this triangle to the list of bad triangles. */ - enqueuebadtri(testtri, angle, tapex, torg, tdest); - } else if (vararea) { - /* Nonpositive area constraints are treated as unconstrained. */ - if ((area > areabound(*testtri)) && (areabound(*testtri) > 0.0)) { - /* Add this triangle to the list of bad triangles. */ - enqueuebadtri(testtri, angle, tapex, torg, tdest); - } - } - } -} - -#endif /* not CDT_ONLY */ - -/** **/ -/** **/ -/********* Mesh quality testing routines end here *********/ - -/********* Point location routines begin here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* makepointmap() Construct a mapping from points to triangles to improve */ -/* the speed of point location for segment insertion. */ -/* */ -/* Traverses all the triangles, and provides each corner of each triangle */ -/* with a pointer to that triangle. Of course, pointers will be */ -/* overwritten by other pointers because (almost) each point is a corner */ -/* of several triangles, but in the end every point will point to some */ -/* triangle that contains it. */ -/* */ -/*****************************************************************************/ - -void makepointmap() -{ - struct triedge triangleloop; - point triorg; - - if (verbose) { - printf(" Constructing mapping from points to triangles.\n"); - } - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - while (triangleloop.tri != (triangle *) NULL) { - /* Check all three points of the triangle. */ - for (triangleloop.orient = 0; triangleloop.orient < 3; - triangleloop.orient++) { - org(triangleloop, triorg); - setpoint2tri(triorg, encode(triangleloop)); - } - triangleloop.tri = triangletraverse(); - } -} - -/*****************************************************************************/ -/* */ -/* preciselocate() Find a triangle or edge containing a given point. */ -/* */ -/* Begins its search from `searchtri'. It is important that `searchtri' */ -/* be a handle with the property that `searchpoint' is strictly to the left */ -/* of the edge denoted by `searchtri', or is collinear with that edge and */ -/* does not intersect that edge. (In particular, `searchpoint' should not */ -/* be the origin or destination of that edge.) */ -/* */ -/* These conditions are imposed because preciselocate() is normally used in */ -/* one of two situations: */ -/* */ -/* (1) To try to find the location to insert a new point. Normally, we */ -/* know an edge that the point is strictly to the left of. In the */ -/* incremental Delaunay algorithm, that edge is a bounding box edge. */ -/* In Ruppert's Delaunay refinement algorithm for quality meshing, */ -/* that edge is the shortest edge of the triangle whose circumcenter */ -/* is being inserted. */ -/* */ -/* (2) To try to find an existing point. In this case, any edge on the */ -/* convex hull is a good starting edge. The possibility that the */ -/* vertex one seeks is an endpoint of the starting edge must be */ -/* screened out before preciselocate() is called. */ -/* */ -/* On completion, `searchtri' is a triangle that contains `searchpoint'. */ -/* */ -/* This implementation differs from that given by Guibas and Stolfi. It */ -/* walks from triangle to triangle, crossing an edge only if `searchpoint' */ -/* is on the other side of the line containing that edge. After entering */ -/* a triangle, there are two edges by which one can leave that triangle. */ -/* If both edges are valid (`searchpoint' is on the other side of both */ -/* edges), one of the two is chosen by drawing a line perpendicular to */ -/* the entry edge (whose endpoints are `forg' and `fdest') passing through */ -/* `fapex'. Depending on which side of this perpendicular `searchpoint' */ -/* falls on, an exit edge is chosen. */ -/* */ -/* This implementation is empirically faster than the Guibas and Stolfi */ -/* point location routine (which I originally used), which tends to spiral */ -/* in toward its target. */ -/* */ -/* Returns ONVERTEX if the point lies on an existing vertex. `searchtri' */ -/* is a handle whose origin is the existing vertex. */ -/* */ -/* Returns ONEDGE if the point lies on a mesh edge. `searchtri' is a */ -/* handle whose primary edge is the edge on which the point lies. */ -/* */ -/* Returns INTRIANGLE if the point lies strictly within a triangle. */ -/* `searchtri' is a handle on the triangle that contains the point. */ -/* */ -/* Returns OUTSIDE if the point lies outside the mesh. `searchtri' is a */ -/* handle whose primary edge the point is to the right of. This might */ -/* occur when the circumcenter of a triangle falls just slightly outside */ -/* the mesh due to floating-point roundoff error. It also occurs when */ -/* seeking a hole or region point that a foolish user has placed outside */ -/* the mesh. */ -/* */ -/* WARNING: This routine is designed for convex triangulations, and will */ -/* not generally work after the holes and concavities have been carved. */ -/* However, it can still be used to find the circumcenter of a triangle, as */ -/* long as the search is begun from the triangle in question. */ -/* */ -/*****************************************************************************/ - -enum locateresult preciselocate(searchpoint, searchtri) -point searchpoint; -struct triedge *searchtri; -{ - struct triedge backtracktri; - point forg, fdest, fapex; - point swappoint; - REAL orgorient, destorient; - int moveleft; - triangle ptr; /* Temporary variable used by sym(). */ - - if (verbose > 2) { - printf(" Searching for point (%.12g, %.12g).\n", - searchpoint[0], searchpoint[1]); - } - /* Where are we? */ - org(*searchtri, forg); - dest(*searchtri, fdest); - apex(*searchtri, fapex); - while (1) { - if (verbose > 2) { - printf(" At (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", - forg[0], forg[1], fdest[0], fdest[1], fapex[0], fapex[1]); - } - /* Check whether the apex is the point we seek. */ - if ((fapex[0] == searchpoint[0]) && (fapex[1] == searchpoint[1])) { - lprevself(*searchtri); - return ONVERTEX; - } - /* Does the point lie on the other side of the line defined by the */ - /* triangle edge opposite the triangle's destination? */ - destorient = counterclockwise(forg, fapex, searchpoint); - /* Does the point lie on the other side of the line defined by the */ - /* triangle edge opposite the triangle's origin? */ - orgorient = counterclockwise(fapex, fdest, searchpoint); - if (destorient > 0.0) { - if (orgorient > 0.0) { - /* Move left if the inner product of (fapex - searchpoint) and */ - /* (fdest - forg) is positive. This is equivalent to drawing */ - /* a line perpendicular to the line (forg, fdest) passing */ - /* through `fapex', and determining which side of this line */ - /* `searchpoint' falls on. */ - moveleft = (fapex[0] - searchpoint[0]) * (fdest[0] - forg[0]) + - (fapex[1] - searchpoint[1]) * (fdest[1] - forg[1]) > 0.0; - } else { - moveleft = 1; - } - } else { - if (orgorient > 0.0) { - moveleft = 0; - } else { - /* The point we seek must be on the boundary of or inside this */ - /* triangle. */ - if (destorient == 0.0) { - lprevself(*searchtri); - return ONEDGE; - } - if (orgorient == 0.0) { - lnextself(*searchtri); - return ONEDGE; - } - return INTRIANGLE; - } - } - - /* Move to another triangle. Leave a trace `backtracktri' in case */ - /* floating-point roundoff or some such bogey causes us to walk */ - /* off a boundary of the triangulation. We can just bounce off */ - /* the boundary as if it were an elastic band. */ - if (moveleft) { - lprev(*searchtri, backtracktri); - fdest = fapex; - } else { - lnext(*searchtri, backtracktri); - forg = fapex; - } - sym(backtracktri, *searchtri); - - /* Check for walking off the edge. */ - if (searchtri->tri == dummytri) { - /* Turn around. */ - triedgecopy(backtracktri, *searchtri); - swappoint = forg; - forg = fdest; - fdest = swappoint; - apex(*searchtri, fapex); - /* Check if the point really is beyond the triangulation boundary. */ - destorient = counterclockwise(forg, fapex, searchpoint); - orgorient = counterclockwise(fapex, fdest, searchpoint); - if ((orgorient < 0.0) && (destorient < 0.0)) { - return OUTSIDE; - } - } else { - apex(*searchtri, fapex); - } - } -} - -/*****************************************************************************/ -/* */ -/* locate() Find a triangle or edge containing a given point. */ -/* */ -/* Searching begins from one of: the input `searchtri', a recently */ -/* encountered triangle `recenttri', or from a triangle chosen from a */ -/* random sample. The choice is made by determining which triangle's */ -/* origin is closest to the point we are searcing for. Normally, */ -/* `searchtri' should be a handle on the convex hull of the triangulation. */ -/* */ -/* Details on the random sampling method can be found in the Mucke, Saias, */ -/* and Zhu paper cited in the header of this code. */ -/* */ -/* On completion, `searchtri' is a triangle that contains `searchpoint'. */ -/* */ -/* Returns ONVERTEX if the point lies on an existing vertex. `searchtri' */ -/* is a handle whose origin is the existing vertex. */ -/* */ -/* Returns ONEDGE if the point lies on a mesh edge. `searchtri' is a */ -/* handle whose primary edge is the edge on which the point lies. */ -/* */ -/* Returns INTRIANGLE if the point lies strictly within a triangle. */ -/* `searchtri' is a handle on the triangle that contains the point. */ -/* */ -/* Returns OUTSIDE if the point lies outside the mesh. `searchtri' is a */ -/* handle whose primary edge the point is to the right of. This might */ -/* occur when the circumcenter of a triangle falls just slightly outside */ -/* the mesh due to floating-point roundoff error. It also occurs when */ -/* seeking a hole or region point that a foolish user has placed outside */ -/* the mesh. */ -/* */ -/* WARNING: This routine is designed for convex triangulations, and will */ -/* not generally work after the holes and concavities have been carved. */ -/* */ -/*****************************************************************************/ - -enum locateresult locate(searchpoint, searchtri) -point searchpoint; -struct triedge *searchtri; -{ - VOID **sampleblock; - triangle *firsttri; - struct triedge sampletri; - point torg, tdest; - unsigned long alignptr; - REAL searchdist, dist; - REAL ahead; - long sampleblocks, samplesperblock, samplenum; - long triblocks; - long i, j; - triangle ptr; /* Temporary variable used by sym(). */ - - if (verbose > 2) { - printf(" Randomly sampling for a triangle near point (%.12g, %.12g).\n", - searchpoint[0], searchpoint[1]); - } - /* Record the distance from the suggested starting triangle to the */ - /* point we seek. */ - org(*searchtri, torg); - searchdist = (searchpoint[0] - torg[0]) * (searchpoint[0] - torg[0]) - + (searchpoint[1] - torg[1]) * (searchpoint[1] - torg[1]); - if (verbose > 2) { - printf(" Boundary triangle has origin (%.12g, %.12g).\n", - torg[0], torg[1]); - } - - /* If a recently encountered triangle has been recorded and has not been */ - /* deallocated, test it as a good starting point. */ - if (recenttri.tri != (triangle *) NULL) { - if (recenttri.tri[3] != (triangle) NULL) { - org(recenttri, torg); - if ((torg[0] == searchpoint[0]) && (torg[1] == searchpoint[1])) { - triedgecopy(recenttri, *searchtri); - return ONVERTEX; - } - dist = (searchpoint[0] - torg[0]) * (searchpoint[0] - torg[0]) - + (searchpoint[1] - torg[1]) * (searchpoint[1] - torg[1]); - if (dist < searchdist) { - triedgecopy(recenttri, *searchtri); - searchdist = dist; - if (verbose > 2) { - printf(" Choosing recent triangle with origin (%.12g, %.12g).\n", - torg[0], torg[1]); - } - } - } - } - - /* The number of random samples taken is proportional to the cube root of */ - /* the number of triangles in the mesh. The next bit of code assumes */ - /* that the number of triangles increases monotonically. */ - while (SAMPLEFACTOR * samples * samples * samples < triangles.items) { - samples++; - } - triblocks = (triangles.maxitems + TRIPERBLOCK - 1) / TRIPERBLOCK; - samplesperblock = 1 + (samples / triblocks); - sampleblocks = samples / samplesperblock; - sampleblock = triangles.firstblock; - sampletri.orient = 0; - for (i = 0; i < sampleblocks; i++) { - alignptr = (unsigned long) (sampleblock + 1); - firsttri = (triangle *) (alignptr + (unsigned long) triangles.alignbytes - - (alignptr % (unsigned long) triangles.alignbytes)); - for (j = 0; j < samplesperblock; j++) { - if (i == triblocks - 1) { - samplenum = randomnation((int) - (triangles.maxitems - (i * TRIPERBLOCK))); - } else { - samplenum = randomnation(TRIPERBLOCK); - } - sampletri.tri = (triangle *) - (firsttri + (samplenum * triangles.itemwords)); - if (sampletri.tri[3] != (triangle) NULL) { - org(sampletri, torg); - dist = (searchpoint[0] - torg[0]) * (searchpoint[0] - torg[0]) - + (searchpoint[1] - torg[1]) * (searchpoint[1] - torg[1]); - if (dist < searchdist) { - triedgecopy(sampletri, *searchtri); - searchdist = dist; - if (verbose > 2) { - printf(" Choosing triangle with origin (%.12g, %.12g).\n", - torg[0], torg[1]); - } - } - } - } - sampleblock = (VOID **) *sampleblock; - } - /* Where are we? */ - org(*searchtri, torg); - dest(*searchtri, tdest); - /* Check the starting triangle's vertices. */ - if ((torg[0] == searchpoint[0]) && (torg[1] == searchpoint[1])) { - return ONVERTEX; - } - if ((tdest[0] == searchpoint[0]) && (tdest[1] == searchpoint[1])) { - lnextself(*searchtri); - return ONVERTEX; - } - /* Orient `searchtri' to fit the preconditions of calling preciselocate(). */ - ahead = counterclockwise(torg, tdest, searchpoint); - if (ahead < 0.0) { - /* Turn around so that `searchpoint' is to the left of the */ - /* edge specified by `searchtri'. */ - symself(*searchtri); - } else if (ahead == 0.0) { - /* Check if `searchpoint' is between `torg' and `tdest'. */ - if (((torg[0] < searchpoint[0]) == (searchpoint[0] < tdest[0])) - && ((torg[1] < searchpoint[1]) == (searchpoint[1] < tdest[1]))) { - return ONEDGE; - } - } - return preciselocate(searchpoint, searchtri); -} - -/** **/ -/** **/ -/********* Point location routines end here *********/ - -/********* Mesh transformation routines begin here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* insertshelle() Create a new shell edge and insert it between two */ -/* triangles. */ -/* */ -/* The new shell edge is inserted at the edge described by the handle */ -/* `tri'. Its vertices are properly initialized. The marker `shellemark' */ -/* is applied to the shell edge and, if appropriate, its vertices. */ -/* */ -/*****************************************************************************/ - -void insertshelle(tri, shellemark) -struct triedge *tri; /* Edge at which to insert the new shell edge. */ -int shellemark; /* Marker for the new shell edge. */ -{ - struct triedge oppotri; - struct edge newshelle; - point triorg, tridest; - triangle ptr; /* Temporary variable used by sym(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - - /* Mark points if possible. */ - org(*tri, triorg); - dest(*tri, tridest); - if (pointmark(triorg) == 0) { - setpointmark(triorg, shellemark); - } - if (pointmark(tridest) == 0) { - setpointmark(tridest, shellemark); - } - /* Check if there's already a shell edge here. */ - tspivot(*tri, newshelle); - if (newshelle.sh == dummysh) { - /* Make new shell edge and initialize its vertices. */ - makeshelle(&newshelle); - setsorg(newshelle, tridest); - setsdest(newshelle, triorg); - /* Bond new shell edge to the two triangles it is sandwiched between. */ - /* Note that the facing triangle `oppotri' might be equal to */ - /* `dummytri' (outer space), but the new shell edge is bonded to it */ - /* all the same. */ - tsbond(*tri, newshelle); - sym(*tri, oppotri); - ssymself(newshelle); - tsbond(oppotri, newshelle); - setmark(newshelle, shellemark); - if (verbose > 2) { - printf(" Inserting new "); - printshelle(&newshelle); - } - } else { - if (mark(newshelle) == 0) { - setmark(newshelle, shellemark); - } - } -} - -/*****************************************************************************/ -/* */ -/* Terminology */ -/* */ -/* A "local transformation" replaces a small set of triangles with another */ -/* set of triangles. This may or may not involve inserting or deleting a */ -/* point. */ -/* */ -/* The term "casing" is used to describe the set of triangles that are */ -/* attached to the triangles being transformed, but are not transformed */ -/* themselves. Think of the casing as a fixed hollow structure inside */ -/* which all the action happens. A "casing" is only defined relative to */ -/* a single transformation; each occurrence of a transformation will */ -/* involve a different casing. */ -/* */ -/* A "shell" is similar to a "casing". The term "shell" describes the set */ -/* of shell edges (if any) that are attached to the triangles being */ -/* transformed. However, I sometimes use "shell" to refer to a single */ -/* shell edge, so don't get confused. */ -/* */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* flip() Transform two triangles to two different triangles by flipping */ -/* an edge within a quadrilateral. */ -/* */ -/* Imagine the original triangles, abc and bad, oriented so that the */ -/* shared edge ab lies in a horizontal plane, with the point b on the left */ -/* and the point a on the right. The point c lies below the edge, and the */ -/* point d lies above the edge. The `flipedge' handle holds the edge ab */ -/* of triangle abc, and is directed left, from vertex a to vertex b. */ -/* */ -/* The triangles abc and bad are deleted and replaced by the triangles cdb */ -/* and dca. The triangles that represent abc and bad are NOT deallocated; */ -/* they are reused for dca and cdb, respectively. Hence, any handles that */ -/* may have held the original triangles are still valid, although not */ -/* directed as they were before. */ -/* */ -/* Upon completion of this routine, the `flipedge' handle holds the edge */ -/* dc of triangle dca, and is directed down, from vertex d to vertex c. */ -/* (Hence, the two triangles have rotated counterclockwise.) */ -/* */ -/* WARNING: This transformation is geometrically valid only if the */ -/* quadrilateral adbc is convex. Furthermore, this transformation is */ -/* valid only if there is not a shell edge between the triangles abc and */ -/* bad. This routine does not check either of these preconditions, and */ -/* it is the responsibility of the calling routine to ensure that they are */ -/* met. If they are not, the streets shall be filled with wailing and */ -/* gnashing of teeth. */ -/* */ -/*****************************************************************************/ - -void flip(flipedge) -struct triedge *flipedge; /* Handle for the triangle abc. */ -{ - struct triedge botleft, botright; - struct triedge topleft, topright; - struct triedge top; - struct triedge botlcasing, botrcasing; - struct triedge toplcasing, toprcasing; - struct edge botlshelle, botrshelle; - struct edge toplshelle, toprshelle; - point leftpoint, rightpoint, botpoint; - point farpoint; - triangle ptr; /* Temporary variable used by sym(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - - /* Identify the vertices of the quadrilateral. */ - org(*flipedge, rightpoint); - dest(*flipedge, leftpoint); - apex(*flipedge, botpoint); - sym(*flipedge, top); -#ifdef SELF_CHECK - if (top.tri == dummytri) { - printf("Internal error in flip(): Attempt to flip on boundary.\n"); - lnextself(*flipedge); - return; - } - if (checksegments) { - tspivot(*flipedge, toplshelle); - if (toplshelle.sh != dummysh) { - printf("Internal error in flip(): Attempt to flip a segment.\n"); - lnextself(*flipedge); - return; - } - } -#endif /* SELF_CHECK */ - apex(top, farpoint); - - /* Identify the casing of the quadrilateral. */ - lprev(top, topleft); - sym(topleft, toplcasing); - lnext(top, topright); - sym(topright, toprcasing); - lnext(*flipedge, botleft); - sym(botleft, botlcasing); - lprev(*flipedge, botright); - sym(botright, botrcasing); - /* Rotate the quadrilateral one-quarter turn counterclockwise. */ - bond(topleft, botlcasing); - bond(botleft, botrcasing); - bond(botright, toprcasing); - bond(topright, toplcasing); - - if (checksegments) { - /* Check for shell edges and rebond them to the quadrilateral. */ - tspivot(topleft, toplshelle); - tspivot(botleft, botlshelle); - tspivot(botright, botrshelle); - tspivot(topright, toprshelle); - if (toplshelle.sh == dummysh) { - tsdissolve(topright); - } else { - tsbond(topright, toplshelle); - } - if (botlshelle.sh == dummysh) { - tsdissolve(topleft); - } else { - tsbond(topleft, botlshelle); - } - if (botrshelle.sh == dummysh) { - tsdissolve(botleft); - } else { - tsbond(botleft, botrshelle); - } - if (toprshelle.sh == dummysh) { - tsdissolve(botright); - } else { - tsbond(botright, toprshelle); - } - } - - /* New point assignments for the rotated quadrilateral. */ - setorg(*flipedge, farpoint); - setdest(*flipedge, botpoint); - setapex(*flipedge, rightpoint); - setorg(top, botpoint); - setdest(top, farpoint); - setapex(top, leftpoint); - if (verbose > 2) { - printf(" Edge flip results in left "); - lnextself(topleft); - printtriangle(&topleft); - printf(" and right "); - printtriangle(flipedge); - } -} - -/*****************************************************************************/ -/* */ -/* insertsite() Insert a vertex into a Delaunay triangulation, */ -/* performing flips as necessary to maintain the Delaunay */ -/* property. */ -/* */ -/* The point `insertpoint' is located. If `searchtri.tri' is not NULL, */ -/* the search for the containing triangle begins from `searchtri'. If */ -/* `searchtri.tri' is NULL, a full point location procedure is called. */ -/* If `insertpoint' is found inside a triangle, the triangle is split into */ -/* three; if `insertpoint' lies on an edge, the edge is split in two, */ -/* thereby splitting the two adjacent triangles into four. Edge flips are */ -/* used to restore the Delaunay property. If `insertpoint' lies on an */ -/* existing vertex, no action is taken, and the value DUPLICATEPOINT is */ -/* returned. On return, `searchtri' is set to a handle whose origin is the */ -/* existing vertex. */ -/* */ -/* Normally, the parameter `splitedge' is set to NULL, implying that no */ -/* segment should be split. In this case, if `insertpoint' is found to */ -/* lie on a segment, no action is taken, and the value VIOLATINGPOINT is */ -/* returned. On return, `searchtri' is set to a handle whose primary edge */ -/* is the violated segment. */ -/* */ -/* If the calling routine wishes to split a segment by inserting a point in */ -/* it, the parameter `splitedge' should be that segment. In this case, */ -/* `searchtri' MUST be the triangle handle reached by pivoting from that */ -/* segment; no point location is done. */ -/* */ -/* `segmentflaws' and `triflaws' are flags that indicate whether or not */ -/* there should be checks for the creation of encroached segments or bad */ -/* quality faces. If a newly inserted point encroaches upon segments, */ -/* these segments are added to the list of segments to be split if */ -/* `segmentflaws' is set. If bad triangles are created, these are added */ -/* to the queue if `triflaws' is set. */ -/* */ -/* If a duplicate point or violated segment does not prevent the point */ -/* from being inserted, the return value will be ENCROACHINGPOINT if the */ -/* point encroaches upon a segment (and checking is enabled), or */ -/* SUCCESSFULPOINT otherwise. In either case, `searchtri' is set to a */ -/* handle whose origin is the newly inserted vertex. */ -/* */ -/* insertsite() does not use flip() for reasons of speed; some */ -/* information can be reused from edge flip to edge flip, like the */ -/* locations of shell edges. */ -/* */ -/*****************************************************************************/ - -enum insertsiteresult insertsite(insertpoint, searchtri, splitedge, - segmentflaws, triflaws) -point insertpoint; -struct triedge *searchtri; -struct edge *splitedge; -int segmentflaws; -int triflaws; -{ - struct triedge horiz; - struct triedge top; - struct triedge botleft, botright; - struct triedge topleft, topright; - struct triedge newbotleft, newbotright; - struct triedge newtopright; - struct triedge botlcasing, botrcasing; - struct triedge toplcasing, toprcasing; - struct triedge testtri; - struct edge botlshelle, botrshelle; - struct edge toplshelle, toprshelle; - struct edge brokenshelle; - struct edge checkshelle; - struct edge rightedge; - struct edge newedge; - struct edge *encroached; - point first; - point leftpoint, rightpoint, botpoint, toppoint, farpoint; - REAL attrib; - REAL area; - enum insertsiteresult success; - enum locateresult intersect; - int doflip; - int mirrorflag; - int i; - triangle ptr; /* Temporary variable used by sym(). */ - shelle sptr; /* Temporary variable used by spivot() and tspivot(). */ - - if (verbose > 1) { - printf(" Inserting (%.12g, %.12g).\n", insertpoint[0], insertpoint[1]); - } - if (splitedge == (struct edge *) NULL) { - /* Find the location of the point to be inserted. Check if a good */ - /* starting triangle has already been provided by the caller. */ - if (searchtri->tri == (triangle *) NULL) { - /* Find a boundary triangle. */ - horiz.tri = dummytri; - horiz.orient = 0; - symself(horiz); - /* Search for a triangle containing `insertpoint'. */ - intersect = locate(insertpoint, &horiz); - } else { - /* Start searching from the triangle provided by the caller. */ - triedgecopy(*searchtri, horiz); - intersect = preciselocate(insertpoint, &horiz); - } - } else { - /* The calling routine provides the edge in which the point is inserted. */ - triedgecopy(*searchtri, horiz); - intersect = ONEDGE; - } - if (intersect == ONVERTEX) { - /* There's already a vertex there. Return in `searchtri' a triangle */ - /* whose origin is the existing vertex. */ - triedgecopy(horiz, *searchtri); - triedgecopy(horiz, recenttri); - return DUPLICATEPOINT; - } - if ((intersect == ONEDGE) || (intersect == OUTSIDE)) { - /* The vertex falls on an edge or boundary. */ - if (checksegments && (splitedge == (struct edge *) NULL)) { - /* Check whether the vertex falls on a shell edge. */ - tspivot(horiz, brokenshelle); - if (brokenshelle.sh != dummysh) { - /* The vertex falls on a shell edge. */ - if (segmentflaws) { - if (nobisect == 0) { - /* Add the shell edge to the list of encroached segments. */ - encroached = (struct edge *) poolalloc(&badsegments); - shellecopy(brokenshelle, *encroached); - } else if ((nobisect == 1) && (intersect == ONEDGE)) { - /* This segment may be split only if it is an internal boundary. */ - sym(horiz, testtri); - if (testtri.tri != dummytri) { - /* Add the shell edge to the list of encroached segments. */ - encroached = (struct edge *) poolalloc(&badsegments); - shellecopy(brokenshelle, *encroached); - } - } - } - /* Return a handle whose primary edge contains the point, */ - /* which has not been inserted. */ - triedgecopy(horiz, *searchtri); - triedgecopy(horiz, recenttri); - return VIOLATINGPOINT; - } - } - /* Insert the point on an edge, dividing one triangle into two (if */ - /* the edge lies on a boundary) or two triangles into four. */ - lprev(horiz, botright); - sym(botright, botrcasing); - sym(horiz, topright); - /* Is there a second triangle? (Or does this edge lie on a boundary?) */ - mirrorflag = topright.tri != dummytri; - if (mirrorflag) { - lnextself(topright); - sym(topright, toprcasing); - maketriangle(&newtopright); - } else { - /* Splitting the boundary edge increases the number of boundary edges. */ - hullsize++; - } - maketriangle(&newbotright); - - /* Set the vertices of changed and new triangles. */ - org(horiz, rightpoint); - dest(horiz, leftpoint); - apex(horiz, botpoint); - setorg(newbotright, botpoint); - setdest(newbotright, rightpoint); - setapex(newbotright, insertpoint); - setorg(horiz, insertpoint); - for (i = 0; i < eextras; i++) { - /* Set the element attributes of a new triangle. */ - setelemattribute(newbotright, i, elemattribute(botright, i)); - } - if (vararea) { - /* Set the area constraint of a new triangle. */ - setareabound(newbotright, areabound(botright)); - } - if (mirrorflag) { - dest(topright, toppoint); - setorg(newtopright, rightpoint); - setdest(newtopright, toppoint); - setapex(newtopright, insertpoint); - setorg(topright, insertpoint); - for (i = 0; i < eextras; i++) { - /* Set the element attributes of another new triangle. */ - setelemattribute(newtopright, i, elemattribute(topright, i)); - } - if (vararea) { - /* Set the area constraint of another new triangle. */ - setareabound(newtopright, areabound(topright)); - } - } - - /* There may be shell edges that need to be bonded */ - /* to the new triangle(s). */ - if (checksegments) { - tspivot(botright, botrshelle); - if (botrshelle.sh != dummysh) { - tsdissolve(botright); - tsbond(newbotright, botrshelle); - } - if (mirrorflag) { - tspivot(topright, toprshelle); - if (toprshelle.sh != dummysh) { - tsdissolve(topright); - tsbond(newtopright, toprshelle); - } - } - } - - /* Bond the new triangle(s) to the surrounding triangles. */ - bond(newbotright, botrcasing); - lprevself(newbotright); - bond(newbotright, botright); - lprevself(newbotright); - if (mirrorflag) { - bond(newtopright, toprcasing); - lnextself(newtopright); - bond(newtopright, topright); - lnextself(newtopright); - bond(newtopright, newbotright); - } - - if (splitedge != (struct edge *) NULL) { - /* Split the shell edge into two. */ - setsdest(*splitedge, insertpoint); - ssymself(*splitedge); - spivot(*splitedge, rightedge); - insertshelle(&newbotright, mark(*splitedge)); - tspivot(newbotright, newedge); - sbond(*splitedge, newedge); - ssymself(newedge); - sbond(newedge, rightedge); - ssymself(*splitedge); - } - -#ifdef SELF_CHECK - if (counterclockwise(rightpoint, leftpoint, botpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle prior to edge point insertion (bottom).\n"); - } - if (mirrorflag) { - if (counterclockwise(leftpoint, rightpoint, toppoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle prior to edge point insertion (top).\n"); - } - if (counterclockwise(rightpoint, toppoint, insertpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle after edge point insertion (top right).\n" - ); - } - if (counterclockwise(toppoint, leftpoint, insertpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle after edge point insertion (top left).\n" - ); - } - } - if (counterclockwise(leftpoint, botpoint, insertpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle after edge point insertion (bottom left).\n" - ); - } - if (counterclockwise(botpoint, rightpoint, insertpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf( - " Clockwise triangle after edge point insertion (bottom right).\n"); - } -#endif /* SELF_CHECK */ - if (verbose > 2) { - printf(" Updating bottom left "); - printtriangle(&botright); - if (mirrorflag) { - printf(" Updating top left "); - printtriangle(&topright); - printf(" Creating top right "); - printtriangle(&newtopright); - } - printf(" Creating bottom right "); - printtriangle(&newbotright); - } - - /* Position `horiz' on the first edge to check for */ - /* the Delaunay property. */ - lnextself(horiz); - } else { - /* Insert the point in a triangle, splitting it into three. */ - lnext(horiz, botleft); - lprev(horiz, botright); - sym(botleft, botlcasing); - sym(botright, botrcasing); - maketriangle(&newbotleft); - maketriangle(&newbotright); - - /* Set the vertices of changed and new triangles. */ - org(horiz, rightpoint); - dest(horiz, leftpoint); - apex(horiz, botpoint); - setorg(newbotleft, leftpoint); - setdest(newbotleft, botpoint); - setapex(newbotleft, insertpoint); - setorg(newbotright, botpoint); - setdest(newbotright, rightpoint); - setapex(newbotright, insertpoint); - setapex(horiz, insertpoint); - for (i = 0; i < eextras; i++) { - /* Set the element attributes of the new triangles. */ - attrib = elemattribute(horiz, i); - setelemattribute(newbotleft, i, attrib); - setelemattribute(newbotright, i, attrib); - } - if (vararea) { - /* Set the area constraint of the new triangles. */ - area = areabound(horiz); - setareabound(newbotleft, area); - setareabound(newbotright, area); - } - - /* There may be shell edges that need to be bonded */ - /* to the new triangles. */ - if (checksegments) { - tspivot(botleft, botlshelle); - if (botlshelle.sh != dummysh) { - tsdissolve(botleft); - tsbond(newbotleft, botlshelle); - } - tspivot(botright, botrshelle); - if (botrshelle.sh != dummysh) { - tsdissolve(botright); - tsbond(newbotright, botrshelle); - } - } - - /* Bond the new triangles to the surrounding triangles. */ - bond(newbotleft, botlcasing); - bond(newbotright, botrcasing); - lnextself(newbotleft); - lprevself(newbotright); - bond(newbotleft, newbotright); - lnextself(newbotleft); - bond(botleft, newbotleft); - lprevself(newbotright); - bond(botright, newbotright); - -#ifdef SELF_CHECK - if (counterclockwise(rightpoint, leftpoint, botpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle prior to point insertion.\n"); - } - if (counterclockwise(rightpoint, leftpoint, insertpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle after point insertion (top).\n"); - } - if (counterclockwise(leftpoint, botpoint, insertpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle after point insertion (left).\n"); - } - if (counterclockwise(botpoint, rightpoint, insertpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle after point insertion (right).\n"); - } -#endif /* SELF_CHECK */ - if (verbose > 2) { - printf(" Updating top "); - printtriangle(&horiz); - printf(" Creating left "); - printtriangle(&newbotleft); - printf(" Creating right "); - printtriangle(&newbotright); - } - } - - /* The insertion is successful by default, unless an encroached */ - /* edge is found. */ - success = SUCCESSFULPOINT; - /* Circle around the newly inserted vertex, checking each edge opposite */ - /* it for the Delaunay property. Non-Delaunay edges are flipped. */ - /* `horiz' is always the edge being checked. `first' marks where to */ - /* stop circling. */ - org(horiz, first); - rightpoint = first; - dest(horiz, leftpoint); - /* Circle until finished. */ - while (1) { - /* By default, the edge will be flipped. */ - doflip = 1; - if (checksegments) { - /* Check for a segment, which cannot be flipped. */ - tspivot(horiz, checkshelle); - if (checkshelle.sh != dummysh) { - /* The edge is a segment and cannot be flipped. */ - doflip = 0; -#ifndef CDT_ONLY - if (segmentflaws) { - /* Does the new point encroach upon this segment? */ - if (checkedge4encroach(&checkshelle)) { - success = ENCROACHINGPOINT; - } - } -#endif /* not CDT_ONLY */ - } - } - if (doflip) { - /* Check if the edge is a boundary edge. */ - sym(horiz, top); - if (top.tri == dummytri) { - /* The edge is a boundary edge and cannot be flipped. */ - doflip = 0; - } else { - /* Find the point on the other side of the edge. */ - apex(top, farpoint); - /* In the incremental Delaunay triangulation algorithm, any of */ - /* `leftpoint', `rightpoint', and `farpoint' could be vertices */ - /* of the triangular bounding box. These vertices must be */ - /* treated as if they are infinitely distant, even though their */ - /* "coordinates" are not. */ - if ((leftpoint == infpoint1) || (leftpoint == infpoint2) - || (leftpoint == infpoint3)) { - /* `leftpoint' is infinitely distant. Check the convexity of */ - /* the boundary of the triangulation. 'farpoint' might be */ - /* infinite as well, but trust me, this same condition */ - /* should be applied. */ - doflip = counterclockwise(insertpoint, rightpoint, farpoint) > 0.0; - } else if ((rightpoint == infpoint1) || (rightpoint == infpoint2) - || (rightpoint == infpoint3)) { - /* `rightpoint' is infinitely distant. Check the convexity of */ - /* the boundary of the triangulation. 'farpoint' might be */ - /* infinite as well, but trust me, this same condition */ - /* should be applied. */ - doflip = counterclockwise(farpoint, leftpoint, insertpoint) > 0.0; - } else if ((farpoint == infpoint1) || (farpoint == infpoint2) - || (farpoint == infpoint3)) { - /* `farpoint' is infinitely distant and cannot be inside */ - /* the circumcircle of the triangle `horiz'. */ - doflip = 0; - } else { - /* Test whether the edge is locally Delaunay. */ - doflip = incircle(leftpoint, insertpoint, rightpoint, farpoint) - > 0.0; - } - if (doflip) { - /* We made it! Flip the edge `horiz' by rotating its containing */ - /* quadrilateral (the two triangles adjacent to `horiz'). */ - /* Identify the casing of the quadrilateral. */ - lprev(top, topleft); - sym(topleft, toplcasing); - lnext(top, topright); - sym(topright, toprcasing); - lnext(horiz, botleft); - sym(botleft, botlcasing); - lprev(horiz, botright); - sym(botright, botrcasing); - /* Rotate the quadrilateral one-quarter turn counterclockwise. */ - bond(topleft, botlcasing); - bond(botleft, botrcasing); - bond(botright, toprcasing); - bond(topright, toplcasing); - if (checksegments) { - /* Check for shell edges and rebond them to the quadrilateral. */ - tspivot(topleft, toplshelle); - tspivot(botleft, botlshelle); - tspivot(botright, botrshelle); - tspivot(topright, toprshelle); - if (toplshelle.sh == dummysh) { - tsdissolve(topright); - } else { - tsbond(topright, toplshelle); - } - if (botlshelle.sh == dummysh) { - tsdissolve(topleft); - } else { - tsbond(topleft, botlshelle); - } - if (botrshelle.sh == dummysh) { - tsdissolve(botleft); - } else { - tsbond(botleft, botrshelle); - } - if (toprshelle.sh == dummysh) { - tsdissolve(botright); - } else { - tsbond(botright, toprshelle); - } - } - /* New point assignments for the rotated quadrilateral. */ - setorg(horiz, farpoint); - setdest(horiz, insertpoint); - setapex(horiz, rightpoint); - setorg(top, insertpoint); - setdest(top, farpoint); - setapex(top, leftpoint); - for (i = 0; i < eextras; i++) { - /* Take the average of the two triangles' attributes. */ - attrib = 0.5 * (elemattribute(top, i) + elemattribute(horiz, i)); - setelemattribute(top, i, attrib); - setelemattribute(horiz, i, attrib); - } - if (vararea) { - if ((areabound(top) <= 0.0) || (areabound(horiz) <= 0.0)) { - area = -1.0; - } else { - /* Take the average of the two triangles' area constraints. */ - /* This prevents small area constraints from migrating a */ - /* long, long way from their original location due to flips. */ - area = 0.5 * (areabound(top) + areabound(horiz)); - } - setareabound(top, area); - setareabound(horiz, area); - } -#ifdef SELF_CHECK - if (insertpoint != (point) NULL) { - if (counterclockwise(leftpoint, insertpoint, rightpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle prior to edge flip (bottom).\n"); - } - /* The following test has been removed because constrainededge() */ - /* sometimes generates inverted triangles that insertsite() */ - /* removes. */ -/* - if (counterclockwise(rightpoint, farpoint, leftpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle prior to edge flip (top).\n"); - } -*/ - if (counterclockwise(farpoint, leftpoint, insertpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle after edge flip (left).\n"); - } - if (counterclockwise(insertpoint, rightpoint, farpoint) < 0.0) { - printf("Internal error in insertsite():\n"); - printf(" Clockwise triangle after edge flip (right).\n"); - } - } -#endif /* SELF_CHECK */ - if (verbose > 2) { - printf(" Edge flip results in left "); - lnextself(topleft); - printtriangle(&topleft); - printf(" and right "); - printtriangle(&horiz); - } - /* On the next iterations, consider the two edges that were */ - /* exposed (this is, are now visible to the newly inserted */ - /* point) by the edge flip. */ - lprevself(horiz); - leftpoint = farpoint; - } - } - } - if (!doflip) { - /* The handle `horiz' is accepted as locally Delaunay. */ -#ifndef CDT_ONLY - if (triflaws) { - /* Check the triangle `horiz' for quality. */ - testtriangle(&horiz); - } -#endif /* not CDT_ONLY */ - /* Look for the next edge around the newly inserted point. */ - lnextself(horiz); - sym(horiz, testtri); - /* Check for finishing a complete revolution about the new point, or */ - /* falling off the edge of the triangulation. The latter will */ - /* happen when a point is inserted at a boundary. */ - if ((leftpoint == first) || (testtri.tri == dummytri)) { - /* We're done. Return a triangle whose origin is the new point. */ - lnext(horiz, *searchtri); - lnext(horiz, recenttri); - return success; - } - /* Finish finding the next edge around the newly inserted point. */ - lnext(testtri, horiz); - rightpoint = leftpoint; - dest(horiz, leftpoint); - } - } -} - -/*****************************************************************************/ -/* */ -/* triangulatepolygon() Find the Delaunay triangulation of a polygon that */ -/* has a certain "nice" shape. This includes the */ -/* polygons that result from deletion of a point or */ -/* insertion of a segment. */ -/* */ -/* This is a conceptually difficult routine. The starting assumption is */ -/* that we have a polygon with n sides. n - 1 of these sides are currently */ -/* represented as edges in the mesh. One side, called the "base", need not */ -/* be. */ -/* */ -/* Inside the polygon is a structure I call a "fan", consisting of n - 1 */ -/* triangles that share a common origin. For each of these triangles, the */ -/* edge opposite the origin is one of the sides of the polygon. The */ -/* primary edge of each triangle is the edge directed from the origin to */ -/* the destination; note that this is not the same edge that is a side of */ -/* the polygon. `firstedge' is the primary edge of the first triangle. */ -/* From there, the triangles follow in counterclockwise order about the */ -/* polygon, until `lastedge', the primary edge of the last triangle. */ -/* `firstedge' and `lastedge' are probably connected to other triangles */ -/* beyond the extremes of the fan, but their identity is not important, as */ -/* long as the fan remains connected to them. */ -/* */ -/* Imagine the polygon oriented so that its base is at the bottom. This */ -/* puts `firstedge' on the far right, and `lastedge' on the far left. */ -/* The right vertex of the base is the destination of `firstedge', and the */ -/* left vertex of the base is the apex of `lastedge'. */ -/* */ -/* The challenge now is to find the right sequence of edge flips to */ -/* transform the fan into a Delaunay triangulation of the polygon. Each */ -/* edge flip effectively removes one triangle from the fan, committing it */ -/* to the polygon. The resulting polygon has one fewer edge. If `doflip' */ -/* is set, the final flip will be performed, resulting in a fan of one */ -/* (useless?) triangle. If `doflip' is not set, the final flip is not */ -/* performed, resulting in a fan of two triangles, and an unfinished */ -/* triangular polygon that is not yet filled out with a single triangle. */ -/* On completion of the routine, `lastedge' is the last remaining triangle, */ -/* or the leftmost of the last two. */ -/* */ -/* Although the flips are performed in the order described above, the */ -/* decisions about what flips to perform are made in precisely the reverse */ -/* order. The recursive triangulatepolygon() procedure makes a decision, */ -/* uses up to two recursive calls to triangulate the "subproblems" */ -/* (polygons with fewer edges), and then performs an edge flip. */ -/* */ -/* The "decision" it makes is which vertex of the polygon should be */ -/* connected to the base. This decision is made by testing every possible */ -/* vertex. Once the best vertex is found, the two edges that connect this */ -/* vertex to the base become the bases for two smaller polygons. These */ -/* are triangulated recursively. Unfortunately, this approach can take */ -/* O(n^2) time not only in the worst case, but in many common cases. It's */ -/* rarely a big deal for point deletion, where n is rarely larger than ten, */ -/* but it could be a big deal for segment insertion, especially if there's */ -/* a lot of long segments that each cut many triangles. I ought to code */ -/* a faster algorithm some time. */ -/* */ -/* The `edgecount' parameter is the number of sides of the polygon, */ -/* including its base. `triflaws' is a flag that determines whether the */ -/* new triangles should be tested for quality, and enqueued if they are */ -/* bad. */ -/* */ -/*****************************************************************************/ - -void triangulatepolygon(firstedge, lastedge, edgecount, doflip, triflaws) -struct triedge *firstedge; -struct triedge *lastedge; -int edgecount; -int doflip; -int triflaws; -{ - struct triedge testtri; - struct triedge besttri; - struct triedge tempedge; - point leftbasepoint, rightbasepoint; - point testpoint; - point bestpoint; - int bestnumber; - int i; - triangle ptr; /* Temporary variable used by sym(), onext(), and oprev(). */ - - /* Identify the base vertices. */ - apex(*lastedge, leftbasepoint); - dest(*firstedge, rightbasepoint); - if (verbose > 2) { - printf(" Triangulating interior polygon at edge\n"); - printf(" (%.12g, %.12g) (%.12g, %.12g)\n", leftbasepoint[0], - leftbasepoint[1], rightbasepoint[0], rightbasepoint[1]); - } - /* Find the best vertex to connect the base to. */ - onext(*firstedge, besttri); - dest(besttri, bestpoint); - triedgecopy(besttri, testtri); - bestnumber = 1; - for (i = 2; i <= edgecount - 2; i++) { - onextself(testtri); - dest(testtri, testpoint); - /* Is this a better vertex? */ - if (incircle(leftbasepoint, rightbasepoint, bestpoint, testpoint) > 0.0) { - triedgecopy(testtri, besttri); - bestpoint = testpoint; - bestnumber = i; - } - } - if (verbose > 2) { - printf(" Connecting edge to (%.12g, %.12g)\n", bestpoint[0], - bestpoint[1]); - } - if (bestnumber > 1) { - /* Recursively triangulate the smaller polygon on the right. */ - oprev(besttri, tempedge); - triangulatepolygon(firstedge, &tempedge, bestnumber + 1, 1, triflaws); - } - if (bestnumber < edgecount - 2) { - /* Recursively triangulate the smaller polygon on the left. */ - sym(besttri, tempedge); - triangulatepolygon(&besttri, lastedge, edgecount - bestnumber, 1, - triflaws); - /* Find `besttri' again; it may have been lost to edge flips. */ - sym(tempedge, besttri); - } - if (doflip) { - /* Do one final edge flip. */ - flip(&besttri); -#ifndef CDT_ONLY - if (triflaws) { - /* Check the quality of the newly committed triangle. */ - sym(besttri, testtri); - testtriangle(&testtri); - } -#endif /* not CDT_ONLY */ - } - /* Return the base triangle. */ - triedgecopy(besttri, *lastedge); -} - -/*****************************************************************************/ -/* */ -/* deletesite() Delete a vertex from a Delaunay triangulation, ensuring */ -/* that the triangulation remains Delaunay. */ -/* */ -/* The origin of `deltri' is deleted. The union of the triangles adjacent */ -/* to this point is a polygon, for which the Delaunay triangulation is */ -/* found. Two triangles are removed from the mesh. */ -/* */ -/* Only interior points that do not lie on segments (shell edges) or */ -/* boundaries may be deleted. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -void deletesite(deltri) -struct triedge *deltri; -{ - struct triedge countingtri; - struct triedge firstedge, lastedge; - struct triedge deltriright; - struct triedge lefttri, righttri; - struct triedge leftcasing, rightcasing; - struct edge leftshelle, rightshelle; - point delpoint; - point neworg; - int edgecount; - triangle ptr; /* Temporary variable used by sym(), onext(), and oprev(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - - org(*deltri, delpoint); - if (verbose > 1) { - printf(" Deleting (%.12g, %.12g).\n", delpoint[0], delpoint[1]); - } - pointdealloc(delpoint); - - /* Count the degree of the point being deleted. */ - onext(*deltri, countingtri); - edgecount = 1; - while (!triedgeequal(*deltri, countingtri)) { -#ifdef SELF_CHECK - if (countingtri.tri == dummytri) { - printf("Internal error in deletesite():\n"); - printf(" Attempt to delete boundary point.\n"); - internalerror(); - } -#endif /* SELF_CHECK */ - edgecount++; - onextself(countingtri); - } - -#ifdef SELF_CHECK - if (edgecount < 3) { - printf("Internal error in deletesite():\n Point has degree %d.\n", - edgecount); - internalerror(); - } -#endif /* SELF_CHECK */ - if (edgecount > 3) { - /* Triangulate the polygon defined by the union of all triangles */ - /* adjacent to the point being deleted. Check the quality of */ - /* the resulting triangles. */ - onext(*deltri, firstedge); - oprev(*deltri, lastedge); - triangulatepolygon(&firstedge, &lastedge, edgecount, 0, !nobisect); - } - /* Splice out two triangles. */ - lprev(*deltri, deltriright); - dnext(*deltri, lefttri); - sym(lefttri, leftcasing); - oprev(deltriright, righttri); - sym(righttri, rightcasing); - bond(*deltri, leftcasing); - bond(deltriright, rightcasing); - tspivot(lefttri, leftshelle); - if (leftshelle.sh != dummysh) { - tsbond(*deltri, leftshelle); - } - tspivot(righttri, rightshelle); - if (rightshelle.sh != dummysh) { - tsbond(deltriright, rightshelle); - } - - /* Set the new origin of `deltri' and check its quality. */ - org(lefttri, neworg); - setorg(*deltri, neworg); - if (!nobisect) { - testtriangle(deltri); - } - - /* Delete the two spliced-out triangles. */ - triangledealloc(lefttri.tri); - triangledealloc(righttri.tri); -} - -#endif /* not CDT_ONLY */ - -/** **/ -/** **/ -/********* Mesh transformation routines end here *********/ - -/********* Divide-and-conquer Delaunay triangulation begins here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* The divide-and-conquer bounding box */ -/* */ -/* I originally implemented the divide-and-conquer and incremental Delaunay */ -/* triangulations using the edge-based data structure presented by Guibas */ -/* and Stolfi. Switching to a triangle-based data structure doubled the */ -/* speed. However, I had to think of a few extra tricks to maintain the */ -/* elegance of the original algorithms. */ -/* */ -/* The "bounding box" used by my variant of the divide-and-conquer */ -/* algorithm uses one triangle for each edge of the convex hull of the */ -/* triangulation. These bounding triangles all share a common apical */ -/* vertex, which is represented by NULL and which represents nothing. */ -/* The bounding triangles are linked in a circular fan about this NULL */ -/* vertex, and the edges on the convex hull of the triangulation appear */ -/* opposite the NULL vertex. You might find it easiest to imagine that */ -/* the NULL vertex is a point in 3D space behind the center of the */ -/* triangulation, and that the bounding triangles form a sort of cone. */ -/* */ -/* This bounding box makes it easy to represent degenerate cases. For */ -/* instance, the triangulation of two vertices is a single edge. This edge */ -/* is represented by two bounding box triangles, one on each "side" of the */ -/* edge. These triangles are also linked together in a fan about the NULL */ -/* vertex. */ -/* */ -/* The bounding box also makes it easy to traverse the convex hull, as the */ -/* divide-and-conquer algorithm needs to do. */ -/* */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* pointsort() Sort an array of points by x-coordinate, using the */ -/* y-coordinate as a secondary key. */ -/* */ -/* Uses quicksort. Randomized O(n log n) time. No, I did not make any of */ -/* the usual quicksort mistakes. */ -/* */ -/*****************************************************************************/ - -void pointsort(sortarray, arraysize) -point *sortarray; -int arraysize; -{ - int left, right; - int pivot; - REAL pivotx, pivoty; - point temp; - - if (arraysize == 2) { - /* Recursive base case. */ - if ((sortarray[0][0] > sortarray[1][0]) || - ((sortarray[0][0] == sortarray[1][0]) && - (sortarray[0][1] > sortarray[1][1]))) { - temp = sortarray[1]; - sortarray[1] = sortarray[0]; - sortarray[0] = temp; - } - return; - } - /* Choose a random pivot to split the array. */ - pivot = (int) randomnation(arraysize); - pivotx = sortarray[pivot][0]; - pivoty = sortarray[pivot][1]; - /* Split the array. */ - left = -1; - right = arraysize; - while (left < right) { - /* Search for a point whose x-coordinate is too large for the left. */ - do { - left++; - } while ((left <= right) && ((sortarray[left][0] < pivotx) || - ((sortarray[left][0] == pivotx) && - (sortarray[left][1] < pivoty)))); - /* Search for a point whose x-coordinate is too small for the right. */ - do { - right--; - } while ((left <= right) && ((sortarray[right][0] > pivotx) || - ((sortarray[right][0] == pivotx) && - (sortarray[right][1] > pivoty)))); - if (left < right) { - /* Swap the left and right points. */ - temp = sortarray[left]; - sortarray[left] = sortarray[right]; - sortarray[right] = temp; - } - } - if (left > 1) { - /* Recursively sort the left subset. */ - pointsort(sortarray, left); - } - if (right < arraysize - 2) { - /* Recursively sort the right subset. */ - pointsort(&sortarray[right + 1], arraysize - right - 1); - } -} - -/*****************************************************************************/ -/* */ -/* pointmedian() An order statistic algorithm, almost. Shuffles an array */ -/* of points so that the first `median' points occur */ -/* lexicographically before the remaining points. */ -/* */ -/* Uses the x-coordinate as the primary key if axis == 0; the y-coordinate */ -/* if axis == 1. Very similar to the pointsort() procedure, but runs in */ -/* randomized linear time. */ -/* */ -/*****************************************************************************/ - -void pointmedian(sortarray, arraysize, median, axis) -point *sortarray; -int arraysize; -int median; -int axis; -{ - int left, right; - int pivot; - REAL pivot1, pivot2; - point temp; - - if (arraysize == 2) { - /* Recursive base case. */ - if ((sortarray[0][axis] > sortarray[1][axis]) || - ((sortarray[0][axis] == sortarray[1][axis]) && - (sortarray[0][1 - axis] > sortarray[1][1 - axis]))) { - temp = sortarray[1]; - sortarray[1] = sortarray[0]; - sortarray[0] = temp; - } - return; - } - /* Choose a random pivot to split the array. */ - pivot = (int) randomnation(arraysize); - pivot1 = sortarray[pivot][axis]; - pivot2 = sortarray[pivot][1 - axis]; - /* Split the array. */ - left = -1; - right = arraysize; - while (left < right) { - /* Search for a point whose x-coordinate is too large for the left. */ - do { - left++; - } while ((left <= right) && ((sortarray[left][axis] < pivot1) || - ((sortarray[left][axis] == pivot1) && - (sortarray[left][1 - axis] < pivot2)))); - /* Search for a point whose x-coordinate is too small for the right. */ - do { - right--; - } while ((left <= right) && ((sortarray[right][axis] > pivot1) || - ((sortarray[right][axis] == pivot1) && - (sortarray[right][1 - axis] > pivot2)))); - if (left < right) { - /* Swap the left and right points. */ - temp = sortarray[left]; - sortarray[left] = sortarray[right]; - sortarray[right] = temp; - } - } - /* Unlike in pointsort(), at most one of the following */ - /* conditionals is true. */ - if (left > median) { - /* Recursively shuffle the left subset. */ - pointmedian(sortarray, left, median, axis); - } - if (right < median - 1) { - /* Recursively shuffle the right subset. */ - pointmedian(&sortarray[right + 1], arraysize - right - 1, - median - right - 1, axis); - } -} - -/*****************************************************************************/ -/* */ -/* alternateaxes() Sorts the points as appropriate for the divide-and- */ -/* conquer algorithm with alternating cuts. */ -/* */ -/* Partitions by x-coordinate if axis == 0; by y-coordinate if axis == 1. */ -/* For the base case, subsets containing only two or three points are */ -/* always sorted by x-coordinate. */ -/* */ -/*****************************************************************************/ - -void alternateaxes(sortarray, arraysize, axis) -point *sortarray; -int arraysize; -int axis; -{ - int divider; - - divider = arraysize >> 1; - if (arraysize <= 3) { - /* Recursive base case: subsets of two or three points will be */ - /* handled specially, and should always be sorted by x-coordinate. */ - axis = 0; - } - /* Partition with a horizontal or vertical cut. */ - pointmedian(sortarray, arraysize, divider, axis); - /* Recursively partition the subsets with a cross cut. */ - if (arraysize - divider >= 2) { - if (divider >= 2) { - alternateaxes(sortarray, divider, 1 - axis); - } - alternateaxes(&sortarray[divider], arraysize - divider, 1 - axis); - } -} - -/*****************************************************************************/ -/* */ -/* mergehulls() Merge two adjacent Delaunay triangulations into a */ -/* single Delaunay triangulation. */ -/* */ -/* This is similar to the algorithm given by Guibas and Stolfi, but uses */ -/* a triangle-based, rather than edge-based, data structure. */ -/* */ -/* The algorithm walks up the gap between the two triangulations, knitting */ -/* them together. As they are merged, some of their bounding triangles */ -/* are converted into real triangles of the triangulation. The procedure */ -/* pulls each hull's bounding triangles apart, then knits them together */ -/* like the teeth of two gears. The Delaunay property determines, at each */ -/* step, whether the next "tooth" is a bounding triangle of the left hull */ -/* or the right. When a bounding triangle becomes real, its apex is */ -/* changed from NULL to a real point. */ -/* */ -/* Only two new triangles need to be allocated. These become new bounding */ -/* triangles at the top and bottom of the seam. They are used to connect */ -/* the remaining bounding triangles (those that have not been converted */ -/* into real triangles) into a single fan. */ -/* */ -/* On entry, `farleft' and `innerleft' are bounding triangles of the left */ -/* triangulation. The origin of `farleft' is the leftmost vertex, and */ -/* the destination of `innerleft' is the rightmost vertex of the */ -/* triangulation. Similarly, `innerright' and `farright' are bounding */ -/* triangles of the right triangulation. The origin of `innerright' and */ -/* destination of `farright' are the leftmost and rightmost vertices. */ -/* */ -/* On completion, the origin of `farleft' is the leftmost vertex of the */ -/* merged triangulation, and the destination of `farright' is the rightmost */ -/* vertex. */ -/* */ -/*****************************************************************************/ - -void mergehulls(farleft, innerleft, innerright, farright, axis) -struct triedge *farleft; -struct triedge *innerleft; -struct triedge *innerright; -struct triedge *farright; -int axis; -{ - struct triedge leftcand, rightcand; - struct triedge baseedge; - struct triedge nextedge; - struct triedge sidecasing, topcasing, outercasing; - struct triedge checkedge; - point innerleftdest; - point innerrightorg; - point innerleftapex, innerrightapex; - point farleftpt, farrightpt; - point farleftapex, farrightapex; - point lowerleft, lowerright; - point upperleft, upperright; - point nextapex; - point checkvertex; - int changemade; - int badedge; - int leftfinished, rightfinished; - triangle ptr; /* Temporary variable used by sym(). */ - - dest(*innerleft, innerleftdest); - apex(*innerleft, innerleftapex); - org(*innerright, innerrightorg); - apex(*innerright, innerrightapex); - /* Special treatment for horizontal cuts. */ - if (dwyer && (axis == 1)) { - org(*farleft, farleftpt); - apex(*farleft, farleftapex); - dest(*farright, farrightpt); - apex(*farright, farrightapex); - /* The pointers to the extremal points are shifted to point to the */ - /* topmost and bottommost point of each hull, rather than the */ - /* leftmost and rightmost points. */ - while (farleftapex[1] < farleftpt[1]) { - lnextself(*farleft); - symself(*farleft); - farleftpt = farleftapex; - apex(*farleft, farleftapex); - } - sym(*innerleft, checkedge); - apex(checkedge, checkvertex); - while (checkvertex[1] > innerleftdest[1]) { - lnext(checkedge, *innerleft); - innerleftapex = innerleftdest; - innerleftdest = checkvertex; - sym(*innerleft, checkedge); - apex(checkedge, checkvertex); - } - while (innerrightapex[1] < innerrightorg[1]) { - lnextself(*innerright); - symself(*innerright); - innerrightorg = innerrightapex; - apex(*innerright, innerrightapex); - } - sym(*farright, checkedge); - apex(checkedge, checkvertex); - while (checkvertex[1] > farrightpt[1]) { - lnext(checkedge, *farright); - farrightapex = farrightpt; - farrightpt = checkvertex; - sym(*farright, checkedge); - apex(checkedge, checkvertex); - } - } - /* Find a line tangent to and below both hulls. */ - do { - changemade = 0; - /* Make innerleftdest the "bottommost" point of the left hull. */ - if (counterclockwise(innerleftdest, innerleftapex, innerrightorg) > 0.0) { - lprevself(*innerleft); - symself(*innerleft); - innerleftdest = innerleftapex; - apex(*innerleft, innerleftapex); - changemade = 1; - } - /* Make innerrightorg the "bottommost" point of the right hull. */ - if (counterclockwise(innerrightapex, innerrightorg, innerleftdest) > 0.0) { - lnextself(*innerright); - symself(*innerright); - innerrightorg = innerrightapex; - apex(*innerright, innerrightapex); - changemade = 1; - } - } while (changemade); - /* Find the two candidates to be the next "gear tooth". */ - sym(*innerleft, leftcand); - sym(*innerright, rightcand); - /* Create the bottom new bounding triangle. */ - maketriangle(&baseedge); - /* Connect it to the bounding boxes of the left and right triangulations. */ - bond(baseedge, *innerleft); - lnextself(baseedge); - bond(baseedge, *innerright); - lnextself(baseedge); - setorg(baseedge, innerrightorg); - setdest(baseedge, innerleftdest); - /* Apex is intentionally left NULL. */ - if (verbose > 2) { - printf(" Creating base bounding "); - printtriangle(&baseedge); - } - /* Fix the extreme triangles if necessary. */ - org(*farleft, farleftpt); - if (innerleftdest == farleftpt) { - lnext(baseedge, *farleft); - } - dest(*farright, farrightpt); - if (innerrightorg == farrightpt) { - lprev(baseedge, *farright); - } - /* The vertices of the current knitting edge. */ - lowerleft = innerleftdest; - lowerright = innerrightorg; - /* The candidate vertices for knitting. */ - apex(leftcand, upperleft); - apex(rightcand, upperright); - /* Walk up the gap between the two triangulations, knitting them together. */ - while (1) { - /* Have we reached the top? (This isn't quite the right question, */ - /* because even though the left triangulation might seem finished now, */ - /* moving up on the right triangulation might reveal a new point of */ - /* the left triangulation. And vice-versa.) */ - leftfinished = counterclockwise(upperleft, lowerleft, lowerright) <= 0.0; - rightfinished = counterclockwise(upperright, lowerleft, lowerright) <= 0.0; - if (leftfinished && rightfinished) { - /* Create the top new bounding triangle. */ - maketriangle(&nextedge); - setorg(nextedge, lowerleft); - setdest(nextedge, lowerright); - /* Apex is intentionally left NULL. */ - /* Connect it to the bounding boxes of the two triangulations. */ - bond(nextedge, baseedge); - lnextself(nextedge); - bond(nextedge, rightcand); - lnextself(nextedge); - bond(nextedge, leftcand); - if (verbose > 2) { - printf(" Creating top bounding "); - printtriangle(&baseedge); - } - /* Special treatment for horizontal cuts. */ - if (dwyer && (axis == 1)) { - org(*farleft, farleftpt); - apex(*farleft, farleftapex); - dest(*farright, farrightpt); - apex(*farright, farrightapex); - sym(*farleft, checkedge); - apex(checkedge, checkvertex); - /* The pointers to the extremal points are restored to the leftmost */ - /* and rightmost points (rather than topmost and bottommost). */ - while (checkvertex[0] < farleftpt[0]) { - lprev(checkedge, *farleft); - farleftapex = farleftpt; - farleftpt = checkvertex; - sym(*farleft, checkedge); - apex(checkedge, checkvertex); - } - while (farrightapex[0] > farrightpt[0]) { - lprevself(*farright); - symself(*farright); - farrightpt = farrightapex; - apex(*farright, farrightapex); - } - } - return; - } - /* Consider eliminating edges from the left triangulation. */ - if (!leftfinished) { - /* What vertex would be exposed if an edge were deleted? */ - lprev(leftcand, nextedge); - symself(nextedge); - apex(nextedge, nextapex); - /* If nextapex is NULL, then no vertex would be exposed; the */ - /* triangulation would have been eaten right through. */ - if (nextapex != (point) NULL) { - /* Check whether the edge is Delaunay. */ - badedge = incircle(lowerleft, lowerright, upperleft, nextapex) > 0.0; - while (badedge) { - /* Eliminate the edge with an edge flip. As a result, the */ - /* left triangulation will have one more boundary triangle. */ - lnextself(nextedge); - sym(nextedge, topcasing); - lnextself(nextedge); - sym(nextedge, sidecasing); - bond(nextedge, topcasing); - bond(leftcand, sidecasing); - lnextself(leftcand); - sym(leftcand, outercasing); - lprevself(nextedge); - bond(nextedge, outercasing); - /* Correct the vertices to reflect the edge flip. */ - setorg(leftcand, lowerleft); - setdest(leftcand, NULL); - setapex(leftcand, nextapex); - setorg(nextedge, NULL); - setdest(nextedge, upperleft); - setapex(nextedge, nextapex); - /* Consider the newly exposed vertex. */ - upperleft = nextapex; - /* What vertex would be exposed if another edge were deleted? */ - triedgecopy(sidecasing, nextedge); - apex(nextedge, nextapex); - if (nextapex != (point) NULL) { - /* Check whether the edge is Delaunay. */ - badedge = incircle(lowerleft, lowerright, upperleft, nextapex) - > 0.0; - } else { - /* Avoid eating right through the triangulation. */ - badedge = 0; - } - } - } - } - /* Consider eliminating edges from the right triangulation. */ - if (!rightfinished) { - /* What vertex would be exposed if an edge were deleted? */ - lnext(rightcand, nextedge); - symself(nextedge); - apex(nextedge, nextapex); - /* If nextapex is NULL, then no vertex would be exposed; the */ - /* triangulation would have been eaten right through. */ - if (nextapex != (point) NULL) { - /* Check whether the edge is Delaunay. */ - badedge = incircle(lowerleft, lowerright, upperright, nextapex) > 0.0; - while (badedge) { - /* Eliminate the edge with an edge flip. As a result, the */ - /* right triangulation will have one more boundary triangle. */ - lprevself(nextedge); - sym(nextedge, topcasing); - lprevself(nextedge); - sym(nextedge, sidecasing); - bond(nextedge, topcasing); - bond(rightcand, sidecasing); - lprevself(rightcand); - sym(rightcand, outercasing); - lnextself(nextedge); - bond(nextedge, outercasing); - /* Correct the vertices to reflect the edge flip. */ - setorg(rightcand, NULL); - setdest(rightcand, lowerright); - setapex(rightcand, nextapex); - setorg(nextedge, upperright); - setdest(nextedge, NULL); - setapex(nextedge, nextapex); - /* Consider the newly exposed vertex. */ - upperright = nextapex; - /* What vertex would be exposed if another edge were deleted? */ - triedgecopy(sidecasing, nextedge); - apex(nextedge, nextapex); - if (nextapex != (point) NULL) { - /* Check whether the edge is Delaunay. */ - badedge = incircle(lowerleft, lowerright, upperright, nextapex) - > 0.0; - } else { - /* Avoid eating right through the triangulation. */ - badedge = 0; - } - } - } - } - if (leftfinished || (!rightfinished && - (incircle(upperleft, lowerleft, lowerright, upperright) > 0.0))) { - /* Knit the triangulations, adding an edge from `lowerleft' */ - /* to `upperright'. */ - bond(baseedge, rightcand); - lprev(rightcand, baseedge); - setdest(baseedge, lowerleft); - lowerright = upperright; - sym(baseedge, rightcand); - apex(rightcand, upperright); - } else { - /* Knit the triangulations, adding an edge from `upperleft' */ - /* to `lowerright'. */ - bond(baseedge, leftcand); - lnext(leftcand, baseedge); - setorg(baseedge, lowerright); - lowerleft = upperleft; - sym(baseedge, leftcand); - apex(leftcand, upperleft); - } - if (verbose > 2) { - printf(" Connecting "); - printtriangle(&baseedge); - } - } -} - -/*****************************************************************************/ -/* */ -/* divconqrecurse() Recursively form a Delaunay triangulation by the */ -/* divide-and-conquer method. */ -/* */ -/* Recursively breaks down the problem into smaller pieces, which are */ -/* knitted together by mergehulls(). The base cases (problems of two or */ -/* three points) are handled specially here. */ -/* */ -/* On completion, `farleft' and `farright' are bounding triangles such that */ -/* the origin of `farleft' is the leftmost vertex (breaking ties by */ -/* choosing the highest leftmost vertex), and the destination of */ -/* `farright' is the rightmost vertex (breaking ties by choosing the */ -/* lowest rightmost vertex). */ -/* */ -/*****************************************************************************/ - -void divconqrecurse(sortarray, vertices, axis, farleft, farright) -point *sortarray; -int vertices; -int axis; -struct triedge *farleft; -struct triedge *farright; -{ - struct triedge midtri, tri1, tri2, tri3; - struct triedge innerleft, innerright; - REAL area; - int divider; - - if (verbose > 2) { - printf(" Triangulating %d points.\n", vertices); - } - if (vertices == 2) { - /* The triangulation of two vertices is an edge. An edge is */ - /* represented by two bounding triangles. */ - maketriangle(farleft); - setorg(*farleft, sortarray[0]); - setdest(*farleft, sortarray[1]); - /* The apex is intentionally left NULL. */ - maketriangle(farright); - setorg(*farright, sortarray[1]); - setdest(*farright, sortarray[0]); - /* The apex is intentionally left NULL. */ - bond(*farleft, *farright); - lprevself(*farleft); - lnextself(*farright); - bond(*farleft, *farright); - lprevself(*farleft); - lnextself(*farright); - bond(*farleft, *farright); - if (verbose > 2) { - printf(" Creating "); - printtriangle(farleft); - printf(" Creating "); - printtriangle(farright); - } - /* Ensure that the origin of `farleft' is sortarray[0]. */ - lprev(*farright, *farleft); - return; - } else if (vertices == 3) { - /* The triangulation of three vertices is either a triangle (with */ - /* three bounding triangles) or two edges (with four bounding */ - /* triangles). In either case, four triangles are created. */ - maketriangle(&midtri); - maketriangle(&tri1); - maketriangle(&tri2); - maketriangle(&tri3); - area = counterclockwise(sortarray[0], sortarray[1], sortarray[2]); - if (area == 0.0) { - /* Three collinear points; the triangulation is two edges. */ - setorg(midtri, sortarray[0]); - setdest(midtri, sortarray[1]); - setorg(tri1, sortarray[1]); - setdest(tri1, sortarray[0]); - setorg(tri2, sortarray[2]); - setdest(tri2, sortarray[1]); - setorg(tri3, sortarray[1]); - setdest(tri3, sortarray[2]); - /* All apices are intentionally left NULL. */ - bond(midtri, tri1); - bond(tri2, tri3); - lnextself(midtri); - lprevself(tri1); - lnextself(tri2); - lprevself(tri3); - bond(midtri, tri3); - bond(tri1, tri2); - lnextself(midtri); - lprevself(tri1); - lnextself(tri2); - lprevself(tri3); - bond(midtri, tri1); - bond(tri2, tri3); - /* Ensure that the origin of `farleft' is sortarray[0]. */ - triedgecopy(tri1, *farleft); - /* Ensure that the destination of `farright' is sortarray[2]. */ - triedgecopy(tri2, *farright); - } else { - /* The three points are not collinear; the triangulation is one */ - /* triangle, namely `midtri'. */ - setorg(midtri, sortarray[0]); - setdest(tri1, sortarray[0]); - setorg(tri3, sortarray[0]); - /* Apices of tri1, tri2, and tri3 are left NULL. */ - if (area > 0.0) { - /* The vertices are in counterclockwise order. */ - setdest(midtri, sortarray[1]); - setorg(tri1, sortarray[1]); - setdest(tri2, sortarray[1]); - setapex(midtri, sortarray[2]); - setorg(tri2, sortarray[2]); - setdest(tri3, sortarray[2]); - } else { - /* The vertices are in clockwise order. */ - setdest(midtri, sortarray[2]); - setorg(tri1, sortarray[2]); - setdest(tri2, sortarray[2]); - setapex(midtri, sortarray[1]); - setorg(tri2, sortarray[1]); - setdest(tri3, sortarray[1]); - } - /* The topology does not depend on how the vertices are ordered. */ - bond(midtri, tri1); - lnextself(midtri); - bond(midtri, tri2); - lnextself(midtri); - bond(midtri, tri3); - lprevself(tri1); - lnextself(tri2); - bond(tri1, tri2); - lprevself(tri1); - lprevself(tri3); - bond(tri1, tri3); - lnextself(tri2); - lprevself(tri3); - bond(tri2, tri3); - /* Ensure that the origin of `farleft' is sortarray[0]. */ - triedgecopy(tri1, *farleft); - /* Ensure that the destination of `farright' is sortarray[2]. */ - if (area > 0.0) { - triedgecopy(tri2, *farright); - } else { - lnext(*farleft, *farright); - } - } - if (verbose > 2) { - printf(" Creating "); - printtriangle(&midtri); - printf(" Creating "); - printtriangle(&tri1); - printf(" Creating "); - printtriangle(&tri2); - printf(" Creating "); - printtriangle(&tri3); - } - return; - } else { - /* Split the vertices in half. */ - divider = vertices >> 1; - /* Recursively triangulate each half. */ - divconqrecurse(sortarray, divider, 1 - axis, farleft, &innerleft); - divconqrecurse(&sortarray[divider], vertices - divider, 1 - axis, - &innerright, farright); - if (verbose > 1) { - printf(" Joining triangulations with %d and %d vertices.\n", divider, - vertices - divider); - } - /* Merge the two triangulations into one. */ - mergehulls(farleft, &innerleft, &innerright, farright, axis); - } -} - -long removeghosts(startghost) -struct triedge *startghost; -{ - struct triedge searchedge; - struct triedge dissolveedge; - struct triedge deadtri; - point markorg; - long hullsize; - triangle ptr; /* Temporary variable used by sym(). */ - - if (verbose) { - printf(" Removing ghost triangles.\n"); - } - /* Find an edge on the convex hull to start point location from. */ - lprev(*startghost, searchedge); - symself(searchedge); - dummytri[0] = encode(searchedge); - /* Remove the bounding box and count the convex hull edges. */ - triedgecopy(*startghost, dissolveedge); - hullsize = 0; - do { - hullsize++; - lnext(dissolveedge, deadtri); - lprevself(dissolveedge); - symself(dissolveedge); - /* If no PSLG is involved, set the boundary markers of all the points */ - /* on the convex hull. If a PSLG is used, this step is done later. */ - if (!poly) { - /* Watch out for the case where all the input points are collinear. */ - if (dissolveedge.tri != dummytri) { - org(dissolveedge, markorg); - if (pointmark(markorg) == 0) { - setpointmark(markorg, 1); - } - } - } - /* Remove a bounding triangle from a convex hull triangle. */ - dissolve(dissolveedge); - /* Find the next bounding triangle. */ - sym(deadtri, dissolveedge); - /* Delete the bounding triangle. */ - triangledealloc(deadtri.tri); - } while (!triedgeequal(dissolveedge, *startghost)); - return hullsize; -} - -/*****************************************************************************/ -/* */ -/* divconqdelaunay() Form a Delaunay triangulation by the divide-and- */ -/* conquer method. */ -/* */ -/* Sorts the points, calls a recursive procedure to triangulate them, and */ -/* removes the bounding box, setting boundary markers as appropriate. */ -/* */ -/*****************************************************************************/ - -long divconqdelaunay() -{ - point *sortarray; - struct triedge hullleft, hullright; - int divider; - int i, j; - - /* Allocate an array of pointers to points for sorting. */ - sortarray = (point *) malloc(inpoints * sizeof(point)); - if (sortarray == (point *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - traversalinit(&points); - for (i = 0; i < inpoints; i++) { - sortarray[i] = pointtraverse(); - } - if (verbose) { - printf(" Sorting points.\n"); - } - /* Sort the points. */ - pointsort(sortarray, inpoints); - /* Discard duplicate points, which can really mess up the algorithm. */ - i = 0; - for (j = 1; j < inpoints; j++) { - if ((sortarray[i][0] == sortarray[j][0]) - && (sortarray[i][1] == sortarray[j][1])) { - if (!quiet) { - printf( -"Warning: A duplicate point at (%.12g, %.12g) appeared and was ignored.\n", - sortarray[j][0], sortarray[j][1]); - } -/* Commented out - would eliminate point from output .node file, but causes - a failure if some segment has this point as an endpoint. - setpointmark(sortarray[j], DEADPOINT); -*/ - } else { - i++; - sortarray[i] = sortarray[j]; - } - } - i++; - if (dwyer) { - /* Re-sort the array of points to accommodate alternating cuts. */ - divider = i >> 1; - if (i - divider >= 2) { - if (divider >= 2) { - alternateaxes(sortarray, divider, 1); - } - alternateaxes(&sortarray[divider], i - divider, 1); - } - } - if (verbose) { - printf(" Forming triangulation.\n"); - } - /* Form the Delaunay triangulation. */ - divconqrecurse(sortarray, i, 0, &hullleft, &hullright); - free(sortarray); - - return removeghosts(&hullleft); -} - -/** **/ -/** **/ -/********* Divide-and-conquer Delaunay triangulation ends here *********/ - -/********* Incremental Delaunay triangulation begins here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* boundingbox() Form an "infinite" bounding triangle to insert points */ -/* into. */ -/* */ -/* The points at "infinity" are assigned finite coordinates, which are used */ -/* by the point location routines, but (mostly) ignored by the Delaunay */ -/* edge flip routines. */ -/* */ -/*****************************************************************************/ - -#ifndef REDUCED - -void boundingbox() -{ - struct triedge inftri; /* Handle for the triangular bounding box. */ - REAL width; - - if (verbose) { - printf(" Creating triangular bounding box.\n"); - } - /* Find the width (or height, whichever is larger) of the triangulation. */ - width = xmax - xmin; - if (ymax - ymin > width) { - width = ymax - ymin; - } - if (width == 0.0) { - width = 1.0; - } - /* Create the vertices of the bounding box. */ - infpoint1 = (point) malloc(points.itembytes); - infpoint2 = (point) malloc(points.itembytes); - infpoint3 = (point) malloc(points.itembytes); - if ((infpoint1 == (point) NULL) || (infpoint2 == (point) NULL) - || (infpoint3 == (point) NULL)) { - printf("Error: Out of memory.\n"); - exit(1); - } - infpoint1[0] = xmin - 50.0 * width; - infpoint1[1] = ymin - 40.0 * width; - infpoint2[0] = xmax + 50.0 * width; - infpoint2[1] = ymin - 40.0 * width; - infpoint3[0] = 0.5 * (xmin + xmax); - infpoint3[1] = ymax + 60.0 * width; - - /* Create the bounding box. */ - maketriangle(&inftri); - setorg(inftri, infpoint1); - setdest(inftri, infpoint2); - setapex(inftri, infpoint3); - /* Link dummytri to the bounding box so we can always find an */ - /* edge to begin searching (point location) from. */ - dummytri[0] = (triangle) inftri.tri; - if (verbose > 2) { - printf(" Creating "); - printtriangle(&inftri); - } -} - -#endif /* not REDUCED */ - -/*****************************************************************************/ -/* */ -/* removebox() Remove the "infinite" bounding triangle, setting boundary */ -/* markers as appropriate. */ -/* */ -/* The triangular bounding box has three boundary triangles (one for each */ -/* side of the bounding box), and a bunch of triangles fanning out from */ -/* the three bounding box vertices (one triangle for each edge of the */ -/* convex hull of the inner mesh). This routine removes these triangles. */ -/* */ -/*****************************************************************************/ - -#ifndef REDUCED - -long removebox() -{ - struct triedge deadtri; - struct triedge searchedge; - struct triedge checkedge; - struct triedge nextedge, finaledge, dissolveedge; - point markorg; - long hullsize; - triangle ptr; /* Temporary variable used by sym(). */ - - if (verbose) { - printf(" Removing triangular bounding box.\n"); - } - /* Find a boundary triangle. */ - nextedge.tri = dummytri; - nextedge.orient = 0; - symself(nextedge); - /* Mark a place to stop. */ - lprev(nextedge, finaledge); - lnextself(nextedge); - symself(nextedge); - /* Find a triangle (on the boundary of the point set) that isn't */ - /* a bounding box triangle. */ - lprev(nextedge, searchedge); - symself(searchedge); - /* Check whether nextedge is another boundary triangle */ - /* adjacent to the first one. */ - lnext(nextedge, checkedge); - symself(checkedge); - if (checkedge.tri == dummytri) { - /* Go on to the next triangle. There are only three boundary */ - /* triangles, and this next triangle cannot be the third one, */ - /* so it's safe to stop here. */ - lprevself(searchedge); - symself(searchedge); - } - /* Find a new boundary edge to search from, as the current search */ - /* edge lies on a bounding box triangle and will be deleted. */ - dummytri[0] = encode(searchedge); - hullsize = -2l; - while (!triedgeequal(nextedge, finaledge)) { - hullsize++; - lprev(nextedge, dissolveedge); - symself(dissolveedge); - /* If not using a PSLG, the vertices should be marked now. */ - /* (If using a PSLG, markhull() will do the job.) */ - if (!poly) { - /* Be careful! One must check for the case where all the input */ - /* points are collinear, and thus all the triangles are part of */ - /* the bounding box. Otherwise, the setpointmark() call below */ - /* will cause a bad pointer reference. */ - if (dissolveedge.tri != dummytri) { - org(dissolveedge, markorg); - if (pointmark(markorg) == 0) { - setpointmark(markorg, 1); - } - } - } - /* Disconnect the bounding box triangle from the mesh triangle. */ - dissolve(dissolveedge); - lnext(nextedge, deadtri); - sym(deadtri, nextedge); - /* Get rid of the bounding box triangle. */ - triangledealloc(deadtri.tri); - /* Do we need to turn the corner? */ - if (nextedge.tri == dummytri) { - /* Turn the corner. */ - triedgecopy(dissolveedge, nextedge); - } - } - triangledealloc(finaledge.tri); - - free(infpoint1); /* Deallocate the bounding box vertices. */ - free(infpoint2); - free(infpoint3); - - return hullsize; -} - -#endif /* not REDUCED */ - -/*****************************************************************************/ -/* */ -/* incrementaldelaunay() Form a Delaunay triangulation by incrementally */ -/* adding vertices. */ -/* */ -/*****************************************************************************/ - -#ifndef REDUCED - -long incrementaldelaunay() -{ - struct triedge starttri; - point pointloop; - int i; - - /* Create a triangular bounding box. */ - boundingbox(); - if (verbose) { - printf(" Incrementally inserting points.\n"); - } - traversalinit(&points); - pointloop = pointtraverse(); - i = 1; - while (pointloop != (point) NULL) { - /* Find a boundary triangle to search from. */ - starttri.tri = (triangle *) NULL; - if (insertsite(pointloop, &starttri, (struct edge *) NULL, 0, 0) == - DUPLICATEPOINT) { - if (!quiet) { - printf( -"Warning: A duplicate point at (%.12g, %.12g) appeared and was ignored.\n", - pointloop[0], pointloop[1]); - } -/* Commented out - would eliminate point from output .node file. - setpointmark(pointloop, DEADPOINT); -*/ - } - pointloop = pointtraverse(); - i++; - } - /* Remove the bounding box. */ - return removebox(); -} - -#endif /* not REDUCED */ - -/** **/ -/** **/ -/********* Incremental Delaunay triangulation ends here *********/ - -/********* Sweepline Delaunay triangulation begins here *********/ -/** **/ -/** **/ - -#ifndef REDUCED - -void eventheapinsert(heap, heapsize, newevent) -struct event **heap; -int heapsize; -struct event *newevent; -{ - REAL eventx, eventy; - int eventnum; - int parent; - int notdone; - - eventx = newevent->xkey; - eventy = newevent->ykey; - eventnum = heapsize; - notdone = eventnum > 0; - while (notdone) { - parent = (eventnum - 1) >> 1; - if ((heap[parent]->ykey < eventy) || - ((heap[parent]->ykey == eventy) - && (heap[parent]->xkey <= eventx))) { - notdone = 0; - } else { - heap[eventnum] = heap[parent]; - heap[eventnum]->heapposition = eventnum; - - eventnum = parent; - notdone = eventnum > 0; - } - } - heap[eventnum] = newevent; - newevent->heapposition = eventnum; -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -void eventheapify(heap, heapsize, eventnum) -struct event **heap; -int heapsize; -int eventnum; -{ - struct event *thisevent; - REAL eventx, eventy; - int leftchild, rightchild; - int smallest; - int notdone; - - thisevent = heap[eventnum]; - eventx = thisevent->xkey; - eventy = thisevent->ykey; - leftchild = 2 * eventnum + 1; - notdone = leftchild < heapsize; - while (notdone) { - if ((heap[leftchild]->ykey < eventy) || - ((heap[leftchild]->ykey == eventy) - && (heap[leftchild]->xkey < eventx))) { - smallest = leftchild; - } else { - smallest = eventnum; - } - rightchild = leftchild + 1; - if (rightchild < heapsize) { - if ((heap[rightchild]->ykey < heap[smallest]->ykey) || - ((heap[rightchild]->ykey == heap[smallest]->ykey) - && (heap[rightchild]->xkey < heap[smallest]->xkey))) { - smallest = rightchild; - } - } - if (smallest == eventnum) { - notdone = 0; - } else { - heap[eventnum] = heap[smallest]; - heap[eventnum]->heapposition = eventnum; - heap[smallest] = thisevent; - thisevent->heapposition = smallest; - - eventnum = smallest; - leftchild = 2 * eventnum + 1; - notdone = leftchild < heapsize; - } - } -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -void eventheapdelete(heap, heapsize, eventnum) -struct event **heap; -int heapsize; -int eventnum; -{ - struct event *moveevent; - REAL eventx, eventy; - int parent; - int notdone; - - moveevent = heap[heapsize - 1]; - if (eventnum > 0) { - eventx = moveevent->xkey; - eventy = moveevent->ykey; - do { - parent = (eventnum - 1) >> 1; - if ((heap[parent]->ykey < eventy) || - ((heap[parent]->ykey == eventy) - && (heap[parent]->xkey <= eventx))) { - notdone = 0; - } else { - heap[eventnum] = heap[parent]; - heap[eventnum]->heapposition = eventnum; - - eventnum = parent; - notdone = eventnum > 0; - } - } while (notdone); - } - heap[eventnum] = moveevent; - moveevent->heapposition = eventnum; - eventheapify(heap, heapsize - 1, eventnum); -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -void createeventheap(eventheap, events, freeevents) -struct event ***eventheap; -struct event **events; -struct event **freeevents; -{ - point thispoint; - int maxevents; - int i; - - maxevents = (3 * inpoints) / 2; - *eventheap = (struct event **) malloc(maxevents * sizeof(struct event *)); - if (*eventheap == (struct event **) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - *events = (struct event *) malloc(maxevents * sizeof(struct event)); - if (*events == (struct event *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - traversalinit(&points); - for (i = 0; i < inpoints; i++) { - thispoint = pointtraverse(); - (*events)[i].eventptr = (VOID *) thispoint; - (*events)[i].xkey = thispoint[0]; - (*events)[i].ykey = thispoint[1]; - eventheapinsert(*eventheap, i, *events + i); - } - *freeevents = (struct event *) NULL; - for (i = maxevents - 1; i >= inpoints; i--) { - (*events)[i].eventptr = (VOID *) *freeevents; - *freeevents = *events + i; - } -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -int rightofhyperbola(fronttri, newsite) -struct triedge *fronttri; -point newsite; -{ - point leftpoint, rightpoint; - REAL dxa, dya, dxb, dyb; - - hyperbolacount++; - - dest(*fronttri, leftpoint); - apex(*fronttri, rightpoint); - if ((leftpoint[1] < rightpoint[1]) - || ((leftpoint[1] == rightpoint[1]) && (leftpoint[0] < rightpoint[0]))) { - if (newsite[0] >= rightpoint[0]) { - return 1; - } - } else { - if (newsite[0] <= leftpoint[0]) { - return 0; - } - } - dxa = leftpoint[0] - newsite[0]; - dya = leftpoint[1] - newsite[1]; - dxb = rightpoint[0] - newsite[0]; - dyb = rightpoint[1] - newsite[1]; - return dya * (dxb * dxb + dyb * dyb) > dyb * (dxa * dxa + dya * dya); -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -REAL circletop(pa, pb, pc, ccwabc) -point pa; -point pb; -point pc; -REAL ccwabc; -{ - REAL xac, yac, xbc, ybc, xab, yab; - REAL aclen2, bclen2, ablen2; - - circletopcount++; - - xac = pa[0] - pc[0]; - yac = pa[1] - pc[1]; - xbc = pb[0] - pc[0]; - ybc = pb[1] - pc[1]; - xab = pa[0] - pb[0]; - yab = pa[1] - pb[1]; - aclen2 = xac * xac + yac * yac; - bclen2 = xbc * xbc + ybc * ybc; - ablen2 = xab * xab + yab * yab; - return pc[1] + (xac * bclen2 - xbc * aclen2 + sqrt(aclen2 * bclen2 * ablen2)) - / (2.0 * ccwabc); -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -void check4deadevent(checktri, freeevents, eventheap, heapsize) -struct triedge *checktri; -struct event **freeevents; -struct event **eventheap; -int *heapsize; -{ - struct event *deadevent; - point eventpoint; - int eventnum; - - org(*checktri, eventpoint); - if (eventpoint != (point) NULL) { - deadevent = (struct event *) eventpoint; - eventnum = deadevent->heapposition; - deadevent->eventptr = (VOID *) *freeevents; - *freeevents = deadevent; - eventheapdelete(eventheap, *heapsize, eventnum); - (*heapsize)--; - setorg(*checktri, NULL); - } -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -struct splaynode *splay(splaytree, searchpoint, searchtri) -struct splaynode *splaytree; -point searchpoint; -struct triedge *searchtri; -{ - struct splaynode *child, *grandchild; - struct splaynode *lefttree, *righttree; - struct splaynode *leftright; - point checkpoint; - int rightofroot, rightofchild; - - if (splaytree == (struct splaynode *) NULL) { - return (struct splaynode *) NULL; - } - dest(splaytree->keyedge, checkpoint); - if (checkpoint == splaytree->keydest) { - rightofroot = rightofhyperbola(&splaytree->keyedge, searchpoint); - if (rightofroot) { - triedgecopy(splaytree->keyedge, *searchtri); - child = splaytree->rchild; - } else { - child = splaytree->lchild; - } - if (child == (struct splaynode *) NULL) { - return splaytree; - } - dest(child->keyedge, checkpoint); - if (checkpoint != child->keydest) { - child = splay(child, searchpoint, searchtri); - if (child == (struct splaynode *) NULL) { - if (rightofroot) { - splaytree->rchild = (struct splaynode *) NULL; - } else { - splaytree->lchild = (struct splaynode *) NULL; - } - return splaytree; - } - } - rightofchild = rightofhyperbola(&child->keyedge, searchpoint); - if (rightofchild) { - triedgecopy(child->keyedge, *searchtri); - grandchild = splay(child->rchild, searchpoint, searchtri); - child->rchild = grandchild; - } else { - grandchild = splay(child->lchild, searchpoint, searchtri); - child->lchild = grandchild; - } - if (grandchild == (struct splaynode *) NULL) { - if (rightofroot) { - splaytree->rchild = child->lchild; - child->lchild = splaytree; - } else { - splaytree->lchild = child->rchild; - child->rchild = splaytree; - } - return child; - } - if (rightofchild) { - if (rightofroot) { - splaytree->rchild = child->lchild; - child->lchild = splaytree; - } else { - splaytree->lchild = grandchild->rchild; - grandchild->rchild = splaytree; - } - child->rchild = grandchild->lchild; - grandchild->lchild = child; - } else { - if (rightofroot) { - splaytree->rchild = grandchild->lchild; - grandchild->lchild = splaytree; - } else { - splaytree->lchild = child->rchild; - child->rchild = splaytree; - } - child->lchild = grandchild->rchild; - grandchild->rchild = child; - } - return grandchild; - } else { - lefttree = splay(splaytree->lchild, searchpoint, searchtri); - righttree = splay(splaytree->rchild, searchpoint, searchtri); - - pooldealloc(&splaynodes, (VOID *) splaytree); - if (lefttree == (struct splaynode *) NULL) { - return righttree; - } else if (righttree == (struct splaynode *) NULL) { - return lefttree; - } else if (lefttree->rchild == (struct splaynode *) NULL) { - lefttree->rchild = righttree->lchild; - righttree->lchild = lefttree; - return righttree; - } else if (righttree->lchild == (struct splaynode *) NULL) { - righttree->lchild = lefttree->rchild; - lefttree->rchild = righttree; - return lefttree; - } else { -/* printf("Holy Toledo!!!\n"); */ - leftright = lefttree->rchild; - while (leftright->rchild != (struct splaynode *) NULL) { - leftright = leftright->rchild; - } - leftright->rchild = righttree; - return lefttree; - } - } -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -struct splaynode *splayinsert(splayroot, newkey, searchpoint) -struct splaynode *splayroot; -struct triedge *newkey; -point searchpoint; -{ - struct splaynode *newsplaynode; - - newsplaynode = (struct splaynode *) poolalloc(&splaynodes); - triedgecopy(*newkey, newsplaynode->keyedge); - dest(*newkey, newsplaynode->keydest); - if (splayroot == (struct splaynode *) NULL) { - newsplaynode->lchild = (struct splaynode *) NULL; - newsplaynode->rchild = (struct splaynode *) NULL; - } else if (rightofhyperbola(&splayroot->keyedge, searchpoint)) { - newsplaynode->lchild = splayroot; - newsplaynode->rchild = splayroot->rchild; - splayroot->rchild = (struct splaynode *) NULL; - } else { - newsplaynode->lchild = splayroot->lchild; - newsplaynode->rchild = splayroot; - splayroot->lchild = (struct splaynode *) NULL; - } - return newsplaynode; -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -struct splaynode *circletopinsert(splayroot, newkey, pa, pb, pc, topy) -struct splaynode *splayroot; -struct triedge *newkey; -point pa; -point pb; -point pc; -REAL topy; -{ - REAL ccwabc; - REAL xac, yac, xbc, ybc; - REAL aclen2, bclen2; - REAL searchpoint[2]; - struct triedge dummytri; - - ccwabc = counterclockwise(pa, pb, pc); - xac = pa[0] - pc[0]; - yac = pa[1] - pc[1]; - xbc = pb[0] - pc[0]; - ybc = pb[1] - pc[1]; - aclen2 = xac * xac + yac * yac; - bclen2 = xbc * xbc + ybc * ybc; - searchpoint[0] = pc[0] - (yac * bclen2 - ybc * aclen2) / (2.0 * ccwabc); - searchpoint[1] = topy; - return splayinsert(splay(splayroot, (point) searchpoint, &dummytri), newkey, - (point) searchpoint); -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -struct splaynode *frontlocate(splayroot, bottommost, searchpoint, searchtri, - farright) -struct splaynode *splayroot; -struct triedge *bottommost; -point searchpoint; -struct triedge *searchtri; -int *farright; -{ - int farrightflag; - triangle ptr; /* Temporary variable used by onext(). */ - - triedgecopy(*bottommost, *searchtri); - splayroot = splay(splayroot, searchpoint, searchtri); - - farrightflag = 0; - while (!farrightflag && rightofhyperbola(searchtri, searchpoint)) { - onextself(*searchtri); - farrightflag = triedgeequal(*searchtri, *bottommost); - } - *farright = farrightflag; - return splayroot; -} - -#endif /* not REDUCED */ - -#ifndef REDUCED - -long sweeplinedelaunay() -{ - struct event **eventheap; - struct event *events; - struct event *freeevents; - struct event *nextevent; - struct event *newevent; - struct splaynode *splayroot; - struct triedge bottommost; - struct triedge searchtri; - struct triedge fliptri; - struct triedge lefttri, righttri, farlefttri, farrighttri; - struct triedge inserttri; - point firstpoint, secondpoint; - point nextpoint, lastpoint; - point connectpoint; - point leftpoint, midpoint, rightpoint; - REAL lefttest, righttest; - int heapsize; - int check4events, farrightflag; - triangle ptr; /* Temporary variable used by sym(), onext(), and oprev(). */ - - poolinit(&splaynodes, sizeof(struct splaynode), SPLAYNODEPERBLOCK, POINTER, - 0); - splayroot = (struct splaynode *) NULL; - - if (verbose) { - printf(" Placing points in event heap.\n"); - } - createeventheap(&eventheap, &events, &freeevents); - heapsize = inpoints; - - if (verbose) { - printf(" Forming triangulation.\n"); - } - maketriangle(&lefttri); - maketriangle(&righttri); - bond(lefttri, righttri); - lnextself(lefttri); - lprevself(righttri); - bond(lefttri, righttri); - lnextself(lefttri); - lprevself(righttri); - bond(lefttri, righttri); - firstpoint = (point) eventheap[0]->eventptr; - eventheap[0]->eventptr = (VOID *) freeevents; - freeevents = eventheap[0]; - eventheapdelete(eventheap, heapsize, 0); - heapsize--; - do { - if (heapsize == 0) { - printf("Error: Input points are all identical.\n"); - exit(1); - } - secondpoint = (point) eventheap[0]->eventptr; - eventheap[0]->eventptr = (VOID *) freeevents; - freeevents = eventheap[0]; - eventheapdelete(eventheap, heapsize, 0); - heapsize--; - if ((firstpoint[0] == secondpoint[0]) - && (firstpoint[1] == secondpoint[1])) { - printf( -"Warning: A duplicate point at (%.12g, %.12g) appeared and was ignored.\n", - secondpoint[0], secondpoint[1]); -/* Commented out - would eliminate point from output .node file. - setpointmark(secondpoint, DEADPOINT); -*/ - } - } while ((firstpoint[0] == secondpoint[0]) - && (firstpoint[1] == secondpoint[1])); - setorg(lefttri, firstpoint); - setdest(lefttri, secondpoint); - setorg(righttri, secondpoint); - setdest(righttri, firstpoint); - lprev(lefttri, bottommost); - lastpoint = secondpoint; - while (heapsize > 0) { - nextevent = eventheap[0]; - eventheapdelete(eventheap, heapsize, 0); - heapsize--; - check4events = 1; - if (nextevent->xkey < xmin) { - decode(nextevent->eventptr, fliptri); - oprev(fliptri, farlefttri); - check4deadevent(&farlefttri, &freeevents, eventheap, &heapsize); - onext(fliptri, farrighttri); - check4deadevent(&farrighttri, &freeevents, eventheap, &heapsize); - - if (triedgeequal(farlefttri, bottommost)) { - lprev(fliptri, bottommost); - } - flip(&fliptri); - setapex(fliptri, NULL); - lprev(fliptri, lefttri); - lnext(fliptri, righttri); - sym(lefttri, farlefttri); - - if (randomnation(SAMPLERATE) == 0) { - symself(fliptri); - dest(fliptri, leftpoint); - apex(fliptri, midpoint); - org(fliptri, rightpoint); - splayroot = circletopinsert(splayroot, &lefttri, leftpoint, midpoint, - rightpoint, nextevent->ykey); - } - } else { - nextpoint = (point) nextevent->eventptr; - if ((nextpoint[0] == lastpoint[0]) && (nextpoint[1] == lastpoint[1])) { - printf( -"Warning: A duplicate point at (%.12g, %.12g) appeared and was ignored.\n", - nextpoint[0], nextpoint[1]); -/* Commented out - would eliminate point from output .node file. - setpointmark(nextpoint, DEADPOINT); -*/ - check4events = 0; - } else { - lastpoint = nextpoint; - - splayroot = frontlocate(splayroot, &bottommost, nextpoint, &searchtri, - &farrightflag); -/* - triedgecopy(bottommost, searchtri); - farrightflag = 0; - while (!farrightflag && rightofhyperbola(&searchtri, nextpoint)) { - onextself(searchtri); - farrightflag = triedgeequal(searchtri, bottommost); - } -*/ - - check4deadevent(&searchtri, &freeevents, eventheap, &heapsize); - - triedgecopy(searchtri, farrighttri); - sym(searchtri, farlefttri); - maketriangle(&lefttri); - maketriangle(&righttri); - dest(farrighttri, connectpoint); - setorg(lefttri, connectpoint); - setdest(lefttri, nextpoint); - setorg(righttri, nextpoint); - setdest(righttri, connectpoint); - bond(lefttri, righttri); - lnextself(lefttri); - lprevself(righttri); - bond(lefttri, righttri); - lnextself(lefttri); - lprevself(righttri); - bond(lefttri, farlefttri); - bond(righttri, farrighttri); - if (!farrightflag && triedgeequal(farrighttri, bottommost)) { - triedgecopy(lefttri, bottommost); - } - - if (randomnation(SAMPLERATE) == 0) { - splayroot = splayinsert(splayroot, &lefttri, nextpoint); - } else if (randomnation(SAMPLERATE) == 0) { - lnext(righttri, inserttri); - splayroot = splayinsert(splayroot, &inserttri, nextpoint); - } - } - } - nextevent->eventptr = (VOID *) freeevents; - freeevents = nextevent; - - if (check4events) { - apex(farlefttri, leftpoint); - dest(lefttri, midpoint); - apex(lefttri, rightpoint); - lefttest = counterclockwise(leftpoint, midpoint, rightpoint); - if (lefttest > 0.0) { - newevent = freeevents; - freeevents = (struct event *) freeevents->eventptr; - newevent->xkey = xminextreme; - newevent->ykey = circletop(leftpoint, midpoint, rightpoint, - lefttest); - newevent->eventptr = (VOID *) encode(lefttri); - eventheapinsert(eventheap, heapsize, newevent); - heapsize++; - setorg(lefttri, newevent); - } - apex(righttri, leftpoint); - org(righttri, midpoint); - apex(farrighttri, rightpoint); - righttest = counterclockwise(leftpoint, midpoint, rightpoint); - if (righttest > 0.0) { - newevent = freeevents; - freeevents = (struct event *) freeevents->eventptr; - newevent->xkey = xminextreme; - newevent->ykey = circletop(leftpoint, midpoint, rightpoint, - righttest); - newevent->eventptr = (VOID *) encode(farrighttri); - eventheapinsert(eventheap, heapsize, newevent); - heapsize++; - setorg(farrighttri, newevent); - } - } - } - - pooldeinit(&splaynodes); - lprevself(bottommost); - return removeghosts(&bottommost); -} - -#endif /* not REDUCED */ - -/** **/ -/** **/ -/********* Sweepline Delaunay triangulation ends here *********/ - -/********* General mesh construction routines begin here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* delaunay() Form a Delaunay triangulation. */ -/* */ -/*****************************************************************************/ - -long delaunay() -{ - eextras = 0; - initializetrisegpools(); - -#ifdef REDUCED - if (!quiet) { - printf( - "Constructing Delaunay triangulation by divide-and-conquer method.\n"); - } - return divconqdelaunay(); -#else /* not REDUCED */ - if (!quiet) { - printf("Constructing Delaunay triangulation "); - if (incremental) { - printf("by incremental method.\n"); - } else if (sweepline) { - printf("by sweepline method.\n"); - } else { - printf("by divide-and-conquer method.\n"); - } - } - if (incremental) { - return incrementaldelaunay(); - } else if (sweepline) { - return sweeplinedelaunay(); - } else { - return divconqdelaunay(); - } -#endif /* not REDUCED */ -} - -/*****************************************************************************/ -/* */ -/* reconstruct() Reconstruct a triangulation from its .ele (and possibly */ -/* .poly) file. Used when the -r switch is used. */ -/* */ -/* Reads an .ele file and reconstructs the original mesh. If the -p switch */ -/* is used, this procedure will also read a .poly file and reconstruct the */ -/* shell edges of the original mesh. If the -a switch is used, this */ -/* procedure will also read an .area file and set a maximum area constraint */ -/* on each triangle. */ -/* */ -/* Points that are not corners of triangles, such as nodes on edges of */ -/* subparametric elements, are discarded. */ -/* */ -/* This routine finds the adjacencies between triangles (and shell edges) */ -/* by forming one stack of triangles for each vertex. Each triangle is on */ -/* three different stacks simultaneously. Each triangle's shell edge */ -/* pointers are used to link the items in each stack. This memory-saving */ -/* feature makes the code harder to read. The most important thing to keep */ -/* in mind is that each triangle is removed from a stack precisely when */ -/* the corresponding pointer is adjusted to refer to a shell edge rather */ -/* than the next triangle of the stack. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -#ifdef TRILIBRARY - -int reconstruct(trianglelist, triangleattriblist, trianglearealist, elements, - corners, attribs, segmentlist, segmentmarkerlist, - numberofsegments) -int *trianglelist; -REAL *triangleattriblist; -REAL *trianglearealist; -int elements; -int corners; -int attribs; -int *segmentlist; -int *segmentmarkerlist; -int numberofsegments; - -#else /* not TRILIBRARY */ - -long reconstruct(elefilename, areafilename, polyfilename, polyfile) -char *elefilename; -char *areafilename; -char *polyfilename; -FILE *polyfile; - -#endif /* not TRILIBRARY */ - -{ -#ifdef TRILIBRARY - int pointindex; - int attribindex; -#else /* not TRILIBRARY */ - FILE *elefile; - FILE *areafile; - char inputline[INPUTLINESIZE]; - char *stringptr; - int areaelements; -#endif /* not TRILIBRARY */ - struct triedge triangleloop; - struct triedge triangleleft; - struct triedge checktri; - struct triedge checkleft; - struct triedge checkneighbor; - struct edge shelleloop; - triangle *vertexarray; - triangle *prevlink; - triangle nexttri; - point tdest, tapex; - point checkdest, checkapex; - point shorg; - point killpoint; - REAL area; - int corner[3]; - int end[2]; - int killpointindex; - int incorners; - int segmentmarkers; - int boundmarker; - int aroundpoint; - long hullsize; - int notfound; - int elementnumber, segmentnumber; - int i, j; - triangle ptr; /* Temporary variable used by sym(). */ - -#ifdef TRILIBRARY - inelements = elements; - incorners = corners; - if (incorners < 3) { - printf("Error: Triangles must have at least 3 points.\n"); - exit(1); - } - eextras = attribs; -#else /* not TRILIBRARY */ - /* Read the triangles from an .ele file. */ - if (!quiet) { - printf("Opening %s.\n", elefilename); - } - elefile = fopen(elefilename, "r"); - if (elefile == (FILE *) NULL) { - printf(" Error: Cannot access file %s.\n", elefilename); - exit(1); - } - /* Read number of triangles, number of points per triangle, and */ - /* number of triangle attributes from .ele file. */ - stringptr = readline(inputline, elefile, elefilename); - inelements = (int) strtol (stringptr, &stringptr, 0); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - incorners = 3; - } else { - incorners = (int) strtol (stringptr, &stringptr, 0); - if (incorners < 3) { - printf("Error: Triangles in %s must have at least 3 points.\n", - elefilename); - exit(1); - } - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - eextras = 0; - } else { - eextras = (int) strtol (stringptr, &stringptr, 0); - } -#endif /* not TRILIBRARY */ - - initializetrisegpools(); - - /* Create the triangles. */ - for (elementnumber = 1; elementnumber <= inelements; elementnumber++) { - maketriangle(&triangleloop); - /* Mark the triangle as living. */ - triangleloop.tri[3] = (triangle) triangleloop.tri; - } - - if (poly) { -#ifdef TRILIBRARY - insegments = numberofsegments; - segmentmarkers = segmentmarkerlist != (int *) NULL; -#else /* not TRILIBRARY */ - /* Read number of segments and number of segment */ - /* boundary markers from .poly file. */ - stringptr = readline(inputline, polyfile, inpolyfilename); - insegments = (int) strtol (stringptr, &stringptr, 0); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - segmentmarkers = 0; - } else { - segmentmarkers = (int) strtol (stringptr, &stringptr, 0); - } -#endif /* not TRILIBRARY */ - - /* Create the shell edges. */ - for (segmentnumber = 1; segmentnumber <= insegments; segmentnumber++) { - makeshelle(&shelleloop); - /* Mark the shell edge as living. */ - shelleloop.sh[2] = (shelle) shelleloop.sh; - } - } - -#ifdef TRILIBRARY - pointindex = 0; - attribindex = 0; -#else /* not TRILIBRARY */ - if (vararea) { - /* Open an .area file, check for consistency with the .ele file. */ - if (!quiet) { - printf("Opening %s.\n", areafilename); - } - areafile = fopen(areafilename, "r"); - if (areafile == (FILE *) NULL) { - printf(" Error: Cannot access file %s.\n", areafilename); - exit(1); - } - stringptr = readline(inputline, areafile, areafilename); - areaelements = (int) strtol (stringptr, &stringptr, 0); - if (areaelements != inelements) { - printf("Error: %s and %s disagree on number of triangles.\n", - elefilename, areafilename); - exit(1); - } - } -#endif /* not TRILIBRARY */ - - if (!quiet) { - printf("Reconstructing mesh.\n"); - } - /* Allocate a temporary array that maps each point to some adjacent */ - /* triangle. I took care to allocate all the permanent memory for */ - /* triangles and shell edges first. */ - vertexarray = (triangle *) malloc(points.items * sizeof(triangle)); - if (vertexarray == (triangle *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - /* Each point is initially unrepresented. */ - for (i = 0; i < points.items; i++) { - vertexarray[i] = (triangle) dummytri; - } - - if (verbose) { - printf(" Assembling triangles.\n"); - } - /* Read the triangles from the .ele file, and link */ - /* together those that share an edge. */ - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - elementnumber = firstnumber; - while (triangleloop.tri != (triangle *) NULL) { -#ifdef TRILIBRARY - /* Copy the triangle's three corners. */ - for (j = 0; j < 3; j++) { - corner[j] = trianglelist[pointindex++]; - if ((corner[j] < firstnumber) || (corner[j] >= firstnumber + inpoints)) { - printf("Error: Triangle %d has an invalid vertex index.\n", - elementnumber); - exit(1); - } - } -#else /* not TRILIBRARY */ - /* Read triangle number and the triangle's three corners. */ - stringptr = readline(inputline, elefile, elefilename); - for (j = 0; j < 3; j++) { - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Triangle %d is missing point %d in %s.\n", - elementnumber, j + 1, elefilename); - exit(1); - } else { - corner[j] = (int) strtol (stringptr, &stringptr, 0); - if ((corner[j] < firstnumber) || - (corner[j] >= firstnumber + inpoints)) { - printf("Error: Triangle %d has an invalid vertex index.\n", - elementnumber); - exit(1); - } - } - } -#endif /* not TRILIBRARY */ - - /* Find out about (and throw away) extra nodes. */ - for (j = 3; j < incorners; j++) { -#ifdef TRILIBRARY - killpointindex = trianglelist[pointindex++]; -#else /* not TRILIBRARY */ - stringptr = findfield(stringptr); - if (*stringptr != '\0') { - killpointindex = (int) strtol (stringptr, &stringptr, 0); -#endif /* not TRILIBRARY */ - if ((killpointindex >= firstnumber) && - (killpointindex < firstnumber + inpoints)) { - /* Delete the non-corner point if it's not already deleted. */ - killpoint = getpoint(killpointindex); - if (pointmark(killpoint) != DEADPOINT) { - pointdealloc(killpoint); - } - } -#ifndef TRILIBRARY - } -#endif /* not TRILIBRARY */ - } - - /* Read the triangle's attributes. */ - for (j = 0; j < eextras; j++) { -#ifdef TRILIBRARY - setelemattribute(triangleloop, j, triangleattriblist[attribindex++]); -#else /* not TRILIBRARY */ - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - setelemattribute(triangleloop, j, 0); - } else { - setelemattribute(triangleloop, j, - (REAL) strtod (stringptr, &stringptr)); - } -#endif /* not TRILIBRARY */ - } - - if (vararea) { -#ifdef TRILIBRARY - area = trianglearealist[elementnumber - firstnumber]; -#else /* not TRILIBRARY */ - /* Read an area constraint from the .area file. */ - stringptr = readline(inputline, areafile, areafilename); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - area = -1.0; /* No constraint on this triangle. */ - } else { - area = (REAL) strtod(stringptr, &stringptr); - } -#endif /* not TRILIBRARY */ - setareabound(triangleloop, area); - } - - /* Set the triangle's vertices. */ - triangleloop.orient = 0; - setorg(triangleloop, getpoint(corner[0])); - setdest(triangleloop, getpoint(corner[1])); - setapex(triangleloop, getpoint(corner[2])); - /* Try linking the triangle to others that share these vertices. */ - for (triangleloop.orient = 0; triangleloop.orient < 3; - triangleloop.orient++) { - /* Take the number for the origin of triangleloop. */ - aroundpoint = corner[triangleloop.orient]; - /* Look for other triangles having this vertex. */ - nexttri = vertexarray[aroundpoint - firstnumber]; - /* Link the current triangle to the next one in the stack. */ - triangleloop.tri[6 + triangleloop.orient] = nexttri; - /* Push the current triangle onto the stack. */ - vertexarray[aroundpoint - firstnumber] = encode(triangleloop); - decode(nexttri, checktri); - if (checktri.tri != dummytri) { - dest(triangleloop, tdest); - apex(triangleloop, tapex); - /* Look for other triangles that share an edge. */ - do { - dest(checktri, checkdest); - apex(checktri, checkapex); - if (tapex == checkdest) { - /* The two triangles share an edge; bond them together. */ - lprev(triangleloop, triangleleft); - bond(triangleleft, checktri); - } - if (tdest == checkapex) { - /* The two triangles share an edge; bond them together. */ - lprev(checktri, checkleft); - bond(triangleloop, checkleft); - } - /* Find the next triangle in the stack. */ - nexttri = checktri.tri[6 + checktri.orient]; - decode(nexttri, checktri); - } while (checktri.tri != dummytri); - } - } - triangleloop.tri = triangletraverse(); - elementnumber++; - } - -#ifdef TRILIBRARY - pointindex = 0; -#else /* not TRILIBRARY */ - fclose(elefile); - if (vararea) { - fclose(areafile); - } -#endif /* not TRILIBRARY */ - - hullsize = 0; /* Prepare to count the boundary edges. */ - if (poly) { - if (verbose) { - printf(" Marking segments in triangulation.\n"); - } - /* Read the segments from the .poly file, and link them */ - /* to their neighboring triangles. */ - boundmarker = 0; - traversalinit(&shelles); - shelleloop.sh = shelletraverse(); - segmentnumber = firstnumber; - while (shelleloop.sh != (shelle *) NULL) { -#ifdef TRILIBRARY - end[0] = segmentlist[pointindex++]; - end[1] = segmentlist[pointindex++]; - if (segmentmarkers) { - boundmarker = segmentmarkerlist[segmentnumber - firstnumber]; - } -#else /* not TRILIBRARY */ - /* Read the endpoints of each segment, and possibly a boundary marker. */ - stringptr = readline(inputline, polyfile, inpolyfilename); - /* Skip the first (segment number) field. */ - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Segment %d has no endpoints in %s.\n", segmentnumber, - polyfilename); - exit(1); - } else { - end[0] = (int) strtol (stringptr, &stringptr, 0); - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Segment %d is missing its second endpoint in %s.\n", - segmentnumber, polyfilename); - exit(1); - } else { - end[1] = (int) strtol (stringptr, &stringptr, 0); - } - if (segmentmarkers) { - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - boundmarker = 0; - } else { - boundmarker = (int) strtol (stringptr, &stringptr, 0); - } - } -#endif /* not TRILIBRARY */ - for (j = 0; j < 2; j++) { - if ((end[j] < firstnumber) || (end[j] >= firstnumber + inpoints)) { - printf("Error: Segment %d has an invalid vertex index.\n", - segmentnumber); - exit(1); - } - } - - /* set the shell edge's vertices. */ - shelleloop.shorient = 0; - setsorg(shelleloop, getpoint(end[0])); - setsdest(shelleloop, getpoint(end[1])); - setmark(shelleloop, boundmarker); - /* Try linking the shell edge to triangles that share these vertices. */ - for (shelleloop.shorient = 0; shelleloop.shorient < 2; - shelleloop.shorient++) { - /* Take the number for the destination of shelleloop. */ - aroundpoint = end[1 - shelleloop.shorient]; - /* Look for triangles having this vertex. */ - prevlink = &vertexarray[aroundpoint - firstnumber]; - nexttri = vertexarray[aroundpoint - firstnumber]; - decode(nexttri, checktri); - sorg(shelleloop, shorg); - notfound = 1; - /* Look for triangles having this edge. Note that I'm only */ - /* comparing each triangle's destination with the shell edge; */ - /* each triangle's apex is handled through a different vertex. */ - /* Because each triangle appears on three vertices' lists, each */ - /* occurrence of a triangle on a list can (and does) represent */ - /* an edge. In this way, most edges are represented twice, and */ - /* every triangle-segment bond is represented once. */ - while (notfound && (checktri.tri != dummytri)) { - dest(checktri, checkdest); - if (shorg == checkdest) { - /* We have a match. Remove this triangle from the list. */ - *prevlink = checktri.tri[6 + checktri.orient]; - /* Bond the shell edge to the triangle. */ - tsbond(checktri, shelleloop); - /* Check if this is a boundary edge. */ - sym(checktri, checkneighbor); - if (checkneighbor.tri == dummytri) { - /* The next line doesn't insert a shell edge (because there's */ - /* already one there), but it sets the boundary markers of */ - /* the existing shell edge and its vertices. */ - insertshelle(&checktri, 1); - hullsize++; - } - notfound = 0; - } - /* Find the next triangle in the stack. */ - prevlink = &checktri.tri[6 + checktri.orient]; - nexttri = checktri.tri[6 + checktri.orient]; - decode(nexttri, checktri); - } - } - shelleloop.sh = shelletraverse(); - segmentnumber++; - } - } - - /* Mark the remaining edges as not being attached to any shell edge. */ - /* Also, count the (yet uncounted) boundary edges. */ - for (i = 0; i < points.items; i++) { - /* Search the stack of triangles adjacent to a point. */ - nexttri = vertexarray[i]; - decode(nexttri, checktri); - while (checktri.tri != dummytri) { - /* Find the next triangle in the stack before this */ - /* information gets overwritten. */ - nexttri = checktri.tri[6 + checktri.orient]; - /* No adjacent shell edge. (This overwrites the stack info.) */ - tsdissolve(checktri); - sym(checktri, checkneighbor); - if (checkneighbor.tri == dummytri) { - insertshelle(&checktri, 1); - hullsize++; - } - decode(nexttri, checktri); - } - } - - free(vertexarray); - return hullsize; -} - -#endif /* not CDT_ONLY */ - -/** **/ -/** **/ -/********* General mesh construction routines end here *********/ - -/********* Segment (shell edge) insertion begins here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* finddirection() Find the first triangle on the path from one point */ -/* to another. */ -/* */ -/* Finds the triangle that intersects a line segment drawn from the */ -/* origin of `searchtri' to the point `endpoint', and returns the result */ -/* in `searchtri'. The origin of `searchtri' does not change, even though */ -/* the triangle returned may differ from the one passed in. This routine */ -/* is used to find the direction to move in to get from one point to */ -/* another. */ -/* */ -/* The return value notes whether the destination or apex of the found */ -/* triangle is collinear with the two points in question. */ -/* */ -/*****************************************************************************/ - -enum finddirectionresult finddirection(searchtri, endpoint) -struct triedge *searchtri; -point endpoint; -{ - struct triedge checktri; - point startpoint; - point leftpoint, rightpoint; - REAL leftccw, rightccw; - int leftflag, rightflag; - triangle ptr; /* Temporary variable used by onext() and oprev(). */ - - org(*searchtri, startpoint); - dest(*searchtri, rightpoint); - apex(*searchtri, leftpoint); - /* Is `endpoint' to the left? */ - leftccw = counterclockwise(endpoint, startpoint, leftpoint); - leftflag = leftccw > 0.0; - /* Is `endpoint' to the right? */ - rightccw = counterclockwise(startpoint, endpoint, rightpoint); - rightflag = rightccw > 0.0; - if (leftflag && rightflag) { - /* `searchtri' faces directly away from `endpoint'. We could go */ - /* left or right. Ask whether it's a triangle or a boundary */ - /* on the left. */ - onext(*searchtri, checktri); - if (checktri.tri == dummytri) { - leftflag = 0; - } else { - rightflag = 0; - } - } - while (leftflag) { - /* Turn left until satisfied. */ - onextself(*searchtri); - if (searchtri->tri == dummytri) { - printf("Internal error in finddirection(): Unable to find a\n"); - printf(" triangle leading from (%.12g, %.12g) to", startpoint[0], - startpoint[1]); - printf(" (%.12g, %.12g).\n", endpoint[0], endpoint[1]); - internalerror(); - } - apex(*searchtri, leftpoint); - rightccw = leftccw; - leftccw = counterclockwise(endpoint, startpoint, leftpoint); - leftflag = leftccw > 0.0; - } - while (rightflag) { - /* Turn right until satisfied. */ - oprevself(*searchtri); - if (searchtri->tri == dummytri) { - printf("Internal error in finddirection(): Unable to find a\n"); - printf(" triangle leading from (%.12g, %.12g) to", startpoint[0], - startpoint[1]); - printf(" (%.12g, %.12g).\n", endpoint[0], endpoint[1]); - internalerror(); - } - dest(*searchtri, rightpoint); - leftccw = rightccw; - rightccw = counterclockwise(startpoint, endpoint, rightpoint); - rightflag = rightccw > 0.0; - } - if (leftccw == 0.0) { - return LEFTCOLLINEAR; - } else if (rightccw == 0.0) { - return RIGHTCOLLINEAR; - } else { - return WITHIN; - } -} - -/*****************************************************************************/ -/* */ -/* segmentintersection() Find the intersection of an existing segment */ -/* and a segment that is being inserted. Insert */ -/* a point at the intersection, splitting an */ -/* existing shell edge. */ -/* */ -/* The segment being inserted connects the apex of splittri to endpoint2. */ -/* splitshelle is the shell edge being split, and MUST be opposite */ -/* splittri. Hence, the edge being split connects the origin and */ -/* destination of splittri. */ -/* */ -/* On completion, splittri is a handle having the newly inserted */ -/* intersection point as its origin, and endpoint1 as its destination. */ -/* */ -/*****************************************************************************/ - -void segmentintersection(splittri, splitshelle, endpoint2) -struct triedge *splittri; -struct edge *splitshelle; -point endpoint2; -{ - point endpoint1; - point torg, tdest; - point leftpoint, rightpoint; - point newpoint; - enum insertsiteresult success; - enum finddirectionresult collinear; - REAL ex, ey; - REAL tx, ty; - REAL etx, ety; - REAL split, denom; - int i; - triangle ptr; /* Temporary variable used by onext(). */ - - /* Find the other three segment endpoints. */ - apex(*splittri, endpoint1); - org(*splittri, torg); - dest(*splittri, tdest); - /* Segment intersection formulae; see the Antonio reference. */ - tx = tdest[0] - torg[0]; - ty = tdest[1] - torg[1]; - ex = endpoint2[0] - endpoint1[0]; - ey = endpoint2[1] - endpoint1[1]; - etx = torg[0] - endpoint2[0]; - ety = torg[1] - endpoint2[1]; - denom = ty * ex - tx * ey; - if (denom == 0.0) { - printf("Internal error in segmentintersection():"); - printf(" Attempt to find intersection of parallel segments.\n"); - internalerror(); - } - split = (ey * etx - ex * ety) / denom; - /* Create the new point. */ - newpoint = (point) poolalloc(&points); - /* Interpolate its coordinate and attributes. */ - for (i = 0; i < 2 + nextras; i++) { - newpoint[i] = torg[i] + split * (tdest[i] - torg[i]); - } - setpointmark(newpoint, mark(*splitshelle)); - if (verbose > 1) { - printf( - " Splitting edge (%.12g, %.12g) (%.12g, %.12g) at (%.12g, %.12g).\n", - torg[0], torg[1], tdest[0], tdest[1], newpoint[0], newpoint[1]); - } - /* Insert the intersection point. This should always succeed. */ - success = insertsite(newpoint, splittri, splitshelle, 0, 0); - if (success != SUCCESSFULPOINT) { - printf("Internal error in segmentintersection():\n"); - printf(" Failure to split a segment.\n"); - internalerror(); - } - if (steinerleft > 0) { - steinerleft--; - } - /* Inserting the point may have caused edge flips. We wish to rediscover */ - /* the edge connecting endpoint1 to the new intersection point. */ - collinear = finddirection(splittri, endpoint1); - dest(*splittri, rightpoint); - apex(*splittri, leftpoint); - if ((leftpoint[0] == endpoint1[0]) && (leftpoint[1] == endpoint1[1])) { - onextself(*splittri); - } else if ((rightpoint[0] != endpoint1[0]) || - (rightpoint[1] != endpoint1[1])) { - printf("Internal error in segmentintersection():\n"); - printf(" Topological inconsistency after splitting a segment.\n"); - internalerror(); - } - /* `splittri' should have destination endpoint1. */ -} - -/*****************************************************************************/ -/* */ -/* scoutsegment() Scout the first triangle on the path from one endpoint */ -/* to another, and check for completion (reaching the */ -/* second endpoint), a collinear point, and the */ -/* intersection of two segments. */ -/* */ -/* Returns one if the entire segment is successfully inserted, and zero if */ -/* the job must be finished by conformingedge() or constrainededge(). */ -/* */ -/* If the first triangle on the path has the second endpoint as its */ -/* destination or apex, a shell edge is inserted and the job is done. */ -/* */ -/* If the first triangle on the path has a destination or apex that lies on */ -/* the segment, a shell edge is inserted connecting the first endpoint to */ -/* the collinear point, and the search is continued from the collinear */ -/* point. */ -/* */ -/* If the first triangle on the path has a shell edge opposite its origin, */ -/* then there is a segment that intersects the segment being inserted. */ -/* Their intersection point is inserted, splitting the shell edge. */ -/* */ -/* Otherwise, return zero. */ -/* */ -/*****************************************************************************/ - -int scoutsegment(searchtri, endpoint2, newmark) -struct triedge *searchtri; -point endpoint2; -int newmark; -{ - struct triedge crosstri; - struct edge crossedge; - point leftpoint, rightpoint; - point endpoint1; - enum finddirectionresult collinear; - shelle sptr; /* Temporary variable used by tspivot(). */ - - collinear = finddirection(searchtri, endpoint2); - dest(*searchtri, rightpoint); - apex(*searchtri, leftpoint); - if (((leftpoint[0] == endpoint2[0]) && (leftpoint[1] == endpoint2[1])) || - ((rightpoint[0] == endpoint2[0]) && (rightpoint[1] == endpoint2[1]))) { - /* The segment is already an edge in the mesh. */ - if ((leftpoint[0] == endpoint2[0]) && (leftpoint[1] == endpoint2[1])) { - lprevself(*searchtri); - } - /* Insert a shell edge, if there isn't already one there. */ - insertshelle(searchtri, newmark); - return 1; - } else if (collinear == LEFTCOLLINEAR) { - /* We've collided with a point between the segment's endpoints. */ - /* Make the collinear point be the triangle's origin. */ - lprevself(*searchtri); - insertshelle(searchtri, newmark); - /* Insert the remainder of the segment. */ - return scoutsegment(searchtri, endpoint2, newmark); - } else if (collinear == RIGHTCOLLINEAR) { - /* We've collided with a point between the segment's endpoints. */ - insertshelle(searchtri, newmark); - /* Make the collinear point be the triangle's origin. */ - lnextself(*searchtri); - /* Insert the remainder of the segment. */ - return scoutsegment(searchtri, endpoint2, newmark); - } else { - lnext(*searchtri, crosstri); - tspivot(crosstri, crossedge); - /* Check for a crossing segment. */ - if (crossedge.sh == dummysh) { - return 0; - } else { - org(*searchtri, endpoint1); - /* Insert a point at the intersection. */ - segmentintersection(&crosstri, &crossedge, endpoint2); - triedgecopy(crosstri, *searchtri); - insertshelle(searchtri, newmark); - /* Insert the remainder of the segment. */ - return scoutsegment(searchtri, endpoint2, newmark); - } - } -} - -/*****************************************************************************/ -/* */ -/* conformingedge() Force a segment into a conforming Delaunay */ -/* triangulation by inserting a point at its midpoint, */ -/* and recursively forcing in the two half-segments if */ -/* necessary. */ -/* */ -/* Generates a sequence of edges connecting `endpoint1' to `endpoint2'. */ -/* `newmark' is the boundary marker of the segment, assigned to each new */ -/* splitting point and shell edge. */ -/* */ -/* Note that conformingedge() does not always maintain the conforming */ -/* Delaunay property. Once inserted, segments are locked into place; */ -/* points inserted later (to force other segments in) may render these */ -/* fixed segments non-Delaunay. The conforming Delaunay property will be */ -/* restored by enforcequality() by splitting encroached segments. */ -/* */ -/*****************************************************************************/ - -#ifndef REDUCED -#ifndef CDT_ONLY - -void conformingedge(endpoint1, endpoint2, newmark) -point endpoint1; -point endpoint2; -int newmark; -{ - struct triedge searchtri1, searchtri2; - struct edge brokenshelle; - point newpoint; - point midpoint1, midpoint2; - enum insertsiteresult success; - int result1, result2; - int i; - shelle sptr; /* Temporary variable used by tspivot(). */ - - if (verbose > 2) { - printf("Forcing segment into triangulation by recursive splitting:\n"); - printf(" (%.12g, %.12g) (%.12g, %.12g)\n", endpoint1[0], endpoint1[1], - endpoint2[0], endpoint2[1]); - } - /* Create a new point to insert in the middle of the segment. */ - newpoint = (point) poolalloc(&points); - /* Interpolate coordinates and attributes. */ - for (i = 0; i < 2 + nextras; i++) { - newpoint[i] = 0.5 * (endpoint1[i] + endpoint2[i]); - } - setpointmark(newpoint, newmark); - /* Find a boundary triangle to search from. */ - searchtri1.tri = (triangle *) NULL; - /* Attempt to insert the new point. */ - success = insertsite(newpoint, &searchtri1, (struct edge *) NULL, 0, 0); - if (success == DUPLICATEPOINT) { - if (verbose > 2) { - printf(" Segment intersects existing point (%.12g, %.12g).\n", - newpoint[0], newpoint[1]); - } - /* Use the point that's already there. */ - pointdealloc(newpoint); - org(searchtri1, newpoint); - } else { - if (success == VIOLATINGPOINT) { - if (verbose > 2) { - printf(" Two segments intersect at (%.12g, %.12g).\n", - newpoint[0], newpoint[1]); - } - /* By fluke, we've landed right on another segment. Split it. */ - tspivot(searchtri1, brokenshelle); - success = insertsite(newpoint, &searchtri1, &brokenshelle, 0, 0); - if (success != SUCCESSFULPOINT) { - printf("Internal error in conformingedge():\n"); - printf(" Failure to split a segment.\n"); - internalerror(); - } - } - /* The point has been inserted successfully. */ - if (steinerleft > 0) { - steinerleft--; - } - } - triedgecopy(searchtri1, searchtri2); - result1 = scoutsegment(&searchtri1, endpoint1, newmark); - result2 = scoutsegment(&searchtri2, endpoint2, newmark); - if (!result1) { - /* The origin of searchtri1 may have changed if a collision with an */ - /* intervening vertex on the segment occurred. */ - org(searchtri1, midpoint1); - conformingedge(midpoint1, endpoint1, newmark); - } - if (!result2) { - /* The origin of searchtri2 may have changed if a collision with an */ - /* intervening vertex on the segment occurred. */ - org(searchtri2, midpoint2); - conformingedge(midpoint2, endpoint2, newmark); - } -} - -#endif /* not CDT_ONLY */ -#endif /* not REDUCED */ - -/*****************************************************************************/ -/* */ -/* delaunayfixup() Enforce the Delaunay condition at an edge, fanning out */ -/* recursively from an existing point. Pay special */ -/* attention to stacking inverted triangles. */ -/* */ -/* This is a support routine for inserting segments into a constrained */ -/* Delaunay triangulation. */ -/* */ -/* The origin of fixuptri is treated as if it has just been inserted, and */ -/* the local Delaunay condition needs to be enforced. It is only enforced */ -/* in one sector, however, that being the angular range defined by */ -/* fixuptri. */ -/* */ -/* This routine also needs to make decisions regarding the "stacking" of */ -/* triangles. (Read the description of constrainededge() below before */ -/* reading on here, so you understand the algorithm.) If the position of */ -/* the new point (the origin of fixuptri) indicates that the vertex before */ -/* it on the polygon is a reflex vertex, then "stack" the triangle by */ -/* doing nothing. (fixuptri is an inverted triangle, which is how stacked */ -/* triangles are identified.) */ -/* */ -/* Otherwise, check whether the vertex before that was a reflex vertex. */ -/* If so, perform an edge flip, thereby eliminating an inverted triangle */ -/* (popping it off the stack). The edge flip may result in the creation */ -/* of a new inverted triangle, depending on whether or not the new vertex */ -/* is visible to the vertex three edges behind on the polygon. */ -/* */ -/* If neither of the two vertices behind the new vertex are reflex */ -/* vertices, fixuptri and fartri, the triangle opposite it, are not */ -/* inverted; hence, ensure that the edge between them is locally Delaunay. */ -/* */ -/* `leftside' indicates whether or not fixuptri is to the left of the */ -/* segment being inserted. (Imagine that the segment is pointing up from */ -/* endpoint1 to endpoint2.) */ -/* */ -/*****************************************************************************/ - -void delaunayfixup(fixuptri, leftside) -struct triedge *fixuptri; -int leftside; -{ - struct triedge neartri; - struct triedge fartri; - struct edge faredge; - point nearpoint, leftpoint, rightpoint, farpoint; - triangle ptr; /* Temporary variable used by sym(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - - lnext(*fixuptri, neartri); - sym(neartri, fartri); - /* Check if the edge opposite the origin of fixuptri can be flipped. */ - if (fartri.tri == dummytri) { - return; - } - tspivot(neartri, faredge); - if (faredge.sh != dummysh) { - return; - } - /* Find all the relevant vertices. */ - apex(neartri, nearpoint); - org(neartri, leftpoint); - dest(neartri, rightpoint); - apex(fartri, farpoint); - /* Check whether the previous polygon vertex is a reflex vertex. */ - if (leftside) { - if (counterclockwise(nearpoint, leftpoint, farpoint) <= 0.0) { - /* leftpoint is a reflex vertex too. Nothing can */ - /* be done until a convex section is found. */ - return; - } - } else { - if (counterclockwise(farpoint, rightpoint, nearpoint) <= 0.0) { - /* rightpoint is a reflex vertex too. Nothing can */ - /* be done until a convex section is found. */ - return; - } - } - if (counterclockwise(rightpoint, leftpoint, farpoint) > 0.0) { - /* fartri is not an inverted triangle, and farpoint is not a reflex */ - /* vertex. As there are no reflex vertices, fixuptri isn't an */ - /* inverted triangle, either. Hence, test the edge between the */ - /* triangles to ensure it is locally Delaunay. */ - if (incircle(leftpoint, farpoint, rightpoint, nearpoint) <= 0.0) { - return; - } - /* Not locally Delaunay; go on to an edge flip. */ - } /* else fartri is inverted; remove it from the stack by flipping. */ - flip(&neartri); - lprevself(*fixuptri); /* Restore the origin of fixuptri after the flip. */ - /* Recursively process the two triangles that result from the flip. */ - delaunayfixup(fixuptri, leftside); - delaunayfixup(&fartri, leftside); -} - -/*****************************************************************************/ -/* */ -/* constrainededge() Force a segment into a constrained Delaunay */ -/* triangulation by deleting the triangles it */ -/* intersects, and triangulating the polygons that */ -/* form on each side of it. */ -/* */ -/* Generates a single edge connecting `endpoint1' to `endpoint2'. The */ -/* triangle `starttri' has `endpoint1' as its origin. `newmark' is the */ -/* boundary marker of the segment. */ -/* */ -/* To insert a segment, every triangle whose interior intersects the */ -/* segment is deleted. The union of these deleted triangles is a polygon */ -/* (which is not necessarily monotone, but is close enough), which is */ -/* divided into two polygons by the new segment. This routine's task is */ -/* to generate the Delaunay triangulation of these two polygons. */ -/* */ -/* You might think of this routine's behavior as a two-step process. The */ -/* first step is to walk from endpoint1 to endpoint2, flipping each edge */ -/* encountered. This step creates a fan of edges connected to endpoint1, */ -/* including the desired edge to endpoint2. The second step enforces the */ -/* Delaunay condition on each side of the segment in an incremental manner: */ -/* proceeding along the polygon from endpoint1 to endpoint2 (this is done */ -/* independently on each side of the segment), each vertex is "enforced" */ -/* as if it had just been inserted, but affecting only the previous */ -/* vertices. The result is the same as if the vertices had been inserted */ -/* in the order they appear on the polygon, so the result is Delaunay. */ -/* */ -/* In truth, constrainededge() interleaves these two steps. The procedure */ -/* walks from endpoint1 to endpoint2, and each time an edge is encountered */ -/* and flipped, the newly exposed vertex (at the far end of the flipped */ -/* edge) is "enforced" upon the previously flipped edges, usually affecting */ -/* only one side of the polygon (depending upon which side of the segment */ -/* the vertex falls on). */ -/* */ -/* The algorithm is complicated by the need to handle polygons that are not */ -/* convex. Although the polygon is not necessarily monotone, it can be */ -/* triangulated in a manner similar to the stack-based algorithms for */ -/* monotone polygons. For each reflex vertex (local concavity) of the */ -/* polygon, there will be an inverted triangle formed by one of the edge */ -/* flips. (An inverted triangle is one with negative area - that is, its */ -/* vertices are arranged in clockwise order - and is best thought of as a */ -/* wrinkle in the fabric of the mesh.) Each inverted triangle can be */ -/* thought of as a reflex vertex pushed on the stack, waiting to be fixed */ -/* later. */ -/* */ -/* A reflex vertex is popped from the stack when a vertex is inserted that */ -/* is visible to the reflex vertex. (However, if the vertex behind the */ -/* reflex vertex is not visible to the reflex vertex, a new inverted */ -/* triangle will take its place on the stack.) These details are handled */ -/* by the delaunayfixup() routine above. */ -/* */ -/*****************************************************************************/ - -void constrainededge(starttri, endpoint2, newmark) -struct triedge *starttri; -point endpoint2; -int newmark; -{ - struct triedge fixuptri, fixuptri2; - struct edge fixupedge; - point endpoint1; - point farpoint; - REAL area; - int collision; - int done; - triangle ptr; /* Temporary variable used by sym() and oprev(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - - org(*starttri, endpoint1); - lnext(*starttri, fixuptri); - flip(&fixuptri); - /* `collision' indicates whether we have found a point directly */ - /* between endpoint1 and endpoint2. */ - collision = 0; - done = 0; - do { - org(fixuptri, farpoint); - /* `farpoint' is the extreme point of the polygon we are "digging" */ - /* to get from endpoint1 to endpoint2. */ - if ((farpoint[0] == endpoint2[0]) && (farpoint[1] == endpoint2[1])) { - oprev(fixuptri, fixuptri2); - /* Enforce the Delaunay condition around endpoint2. */ - delaunayfixup(&fixuptri, 0); - delaunayfixup(&fixuptri2, 1); - done = 1; - } else { - /* Check whether farpoint is to the left or right of the segment */ - /* being inserted, to decide which edge of fixuptri to dig */ - /* through next. */ - area = counterclockwise(endpoint1, endpoint2, farpoint); - if (area == 0.0) { - /* We've collided with a point between endpoint1 and endpoint2. */ - collision = 1; - oprev(fixuptri, fixuptri2); - /* Enforce the Delaunay condition around farpoint. */ - delaunayfixup(&fixuptri, 0); - delaunayfixup(&fixuptri2, 1); - done = 1; - } else { - if (area > 0.0) { /* farpoint is to the left of the segment. */ - oprev(fixuptri, fixuptri2); - /* Enforce the Delaunay condition around farpoint, on the */ - /* left side of the segment only. */ - delaunayfixup(&fixuptri2, 1); - /* Flip the edge that crosses the segment. After the edge is */ - /* flipped, one of its endpoints is the fan vertex, and the */ - /* destination of fixuptri is the fan vertex. */ - lprevself(fixuptri); - } else { /* farpoint is to the right of the segment. */ - delaunayfixup(&fixuptri, 0); - /* Flip the edge that crosses the segment. After the edge is */ - /* flipped, one of its endpoints is the fan vertex, and the */ - /* destination of fixuptri is the fan vertex. */ - oprevself(fixuptri); - } - /* Check for two intersecting segments. */ - tspivot(fixuptri, fixupedge); - if (fixupedge.sh == dummysh) { - flip(&fixuptri); /* May create an inverted triangle on the left. */ - } else { - /* We've collided with a segment between endpoint1 and endpoint2. */ - collision = 1; - /* Insert a point at the intersection. */ - segmentintersection(&fixuptri, &fixupedge, endpoint2); - done = 1; - } - } - } - } while (!done); - /* Insert a shell edge to make the segment permanent. */ - insertshelle(&fixuptri, newmark); - /* If there was a collision with an interceding vertex, install another */ - /* segment connecting that vertex with endpoint2. */ - if (collision) { - /* Insert the remainder of the segment. */ - if (!scoutsegment(&fixuptri, endpoint2, newmark)) { - constrainededge(&fixuptri, endpoint2, newmark); - } - } -} - -/*****************************************************************************/ -/* */ -/* insertsegment() Insert a PSLG segment into a triangulation. */ -/* */ -/*****************************************************************************/ - -void insertsegment(endpoint1, endpoint2, newmark) -point endpoint1; -point endpoint2; -int newmark; -{ - struct triedge searchtri1, searchtri2; - triangle encodedtri; - point checkpoint; - triangle ptr; /* Temporary variable used by sym(). */ - - if (verbose > 1) { - printf(" Connecting (%.12g, %.12g) to (%.12g, %.12g).\n", - endpoint1[0], endpoint1[1], endpoint2[0], endpoint2[1]); - } - - /* Find a triangle whose origin is the segment's first endpoint. */ - checkpoint = (point) NULL; - encodedtri = point2tri(endpoint1); - if (encodedtri != (triangle) NULL) { - decode(encodedtri, searchtri1); - org(searchtri1, checkpoint); - } - if (checkpoint != endpoint1) { - /* Find a boundary triangle to search from. */ - searchtri1.tri = dummytri; - searchtri1.orient = 0; - symself(searchtri1); - /* Search for the segment's first endpoint by point location. */ - if (locate(endpoint1, &searchtri1) != ONVERTEX) { - printf( - "Internal error in insertsegment(): Unable to locate PSLG point\n"); - printf(" (%.12g, %.12g) in triangulation.\n", - endpoint1[0], endpoint1[1]); - internalerror(); - } - } - /* Remember this triangle to improve subsequent point location. */ - triedgecopy(searchtri1, recenttri); - /* Scout the beginnings of a path from the first endpoint */ - /* toward the second. */ - if (scoutsegment(&searchtri1, endpoint2, newmark)) { - /* The segment was easily inserted. */ - return; - } - /* The first endpoint may have changed if a collision with an intervening */ - /* vertex on the segment occurred. */ - org(searchtri1, endpoint1); - - /* Find a triangle whose origin is the segment's second endpoint. */ - checkpoint = (point) NULL; - encodedtri = point2tri(endpoint2); - if (encodedtri != (triangle) NULL) { - decode(encodedtri, searchtri2); - org(searchtri2, checkpoint); - } - if (checkpoint != endpoint2) { - /* Find a boundary triangle to search from. */ - searchtri2.tri = dummytri; - searchtri2.orient = 0; - symself(searchtri2); - /* Search for the segment's second endpoint by point location. */ - if (locate(endpoint2, &searchtri2) != ONVERTEX) { - printf( - "Internal error in insertsegment(): Unable to locate PSLG point\n"); - printf(" (%.12g, %.12g) in triangulation.\n", - endpoint2[0], endpoint2[1]); - internalerror(); - } - } - /* Remember this triangle to improve subsequent point location. */ - triedgecopy(searchtri2, recenttri); - /* Scout the beginnings of a path from the second endpoint */ - /* toward the first. */ - if (scoutsegment(&searchtri2, endpoint1, newmark)) { - /* The segment was easily inserted. */ - return; - } - /* The second endpoint may have changed if a collision with an intervening */ - /* vertex on the segment occurred. */ - org(searchtri2, endpoint2); - -#ifndef REDUCED -#ifndef CDT_ONLY - if (splitseg) { - /* Insert vertices to force the segment into the triangulation. */ - conformingedge(endpoint1, endpoint2, newmark); - } else { -#endif /* not CDT_ONLY */ -#endif /* not REDUCED */ - /* Insert the segment directly into the triangulation. */ - constrainededge(&searchtri1, endpoint2, newmark); -#ifndef REDUCED -#ifndef CDT_ONLY - } -#endif /* not CDT_ONLY */ -#endif /* not REDUCED */ -} - -/*****************************************************************************/ -/* */ -/* markhull() Cover the convex hull of a triangulation with shell edges. */ -/* */ -/*****************************************************************************/ - -void markhull() -{ - struct triedge hulltri; - struct triedge nexttri; - struct triedge starttri; - triangle ptr; /* Temporary variable used by sym() and oprev(). */ - - /* Find a triangle handle on the hull. */ - hulltri.tri = dummytri; - hulltri.orient = 0; - symself(hulltri); - /* Remember where we started so we know when to stop. */ - triedgecopy(hulltri, starttri); - /* Go once counterclockwise around the convex hull. */ - do { - /* Create a shell edge if there isn't already one here. */ - insertshelle(&hulltri, 1); - /* To find the next hull edge, go clockwise around the next vertex. */ - lnextself(hulltri); - oprev(hulltri, nexttri); - while (nexttri.tri != dummytri) { - triedgecopy(nexttri, hulltri); - oprev(hulltri, nexttri); - } - } while (!triedgeequal(hulltri, starttri)); -} - -/*****************************************************************************/ -/* */ -/* formskeleton() Create the shell edges of a triangulation, including */ -/* PSLG edges and edges on the convex hull. */ -/* */ -/* The PSLG edges are read from a .poly file. The return value is the */ -/* number of segments in the file. */ -/* */ -/*****************************************************************************/ - -#ifdef TRILIBRARY - -int formskeleton(segmentlist, segmentmarkerlist, numberofsegments) -int *segmentlist; -int *segmentmarkerlist; -int numberofsegments; - -#else /* not TRILIBRARY */ - -int formskeleton(polyfile, polyfilename) -FILE *polyfile; -char *polyfilename; - -#endif /* not TRILIBRARY */ - -{ -#ifdef TRILIBRARY - char polyfilename[6]; - int index; -#else /* not TRILIBRARY */ - char inputline[INPUTLINESIZE]; - char *stringptr; -#endif /* not TRILIBRARY */ - point endpoint1, endpoint2; - int segments; - int segmentmarkers; - int end1, end2; - int boundmarker; - int i; - - if (poly) { - if (!quiet) { - printf("Inserting segments into Delaunay triangulation.\n"); - } -#ifdef TRILIBRARY - strcpy(polyfilename, "input"); - segments = numberofsegments; - segmentmarkers = segmentmarkerlist != (int *) NULL; - index = 0; -#else /* not TRILIBRARY */ - /* Read the segments from a .poly file. */ - /* Read number of segments and number of boundary markers. */ - stringptr = readline(inputline, polyfile, polyfilename); - segments = (int) strtol (stringptr, &stringptr, 0); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - segmentmarkers = 0; - } else { - segmentmarkers = (int) strtol (stringptr, &stringptr, 0); - } -#endif /* not TRILIBRARY */ - /* If segments are to be inserted, compute a mapping */ - /* from points to triangles. */ - if (segments > 0) { - if (verbose) { - printf(" Inserting PSLG segments.\n"); - } - makepointmap(); - } - - boundmarker = 0; - /* Read and insert the segments. */ - for (i = 1; i <= segments; i++) { -#ifdef TRILIBRARY - end1 = segmentlist[index++]; - end2 = segmentlist[index++]; - if (segmentmarkers) { - boundmarker = segmentmarkerlist[i - 1]; - } -#else /* not TRILIBRARY */ - stringptr = readline(inputline, polyfile, inpolyfilename); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Segment %d has no endpoints in %s.\n", i, - polyfilename); - exit(1); - } else { - end1 = (int) strtol (stringptr, &stringptr, 0); - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Segment %d is missing its second endpoint in %s.\n", i, - polyfilename); - exit(1); - } else { - end2 = (int) strtol (stringptr, &stringptr, 0); - } - if (segmentmarkers) { - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - boundmarker = 0; - } else { - boundmarker = (int) strtol (stringptr, &stringptr, 0); - } - } -#endif /* not TRILIBRARY */ - if ((end1 < firstnumber) || (end1 >= firstnumber + inpoints)) { - if (!quiet) { - printf("Warning: Invalid first endpoint of segment %d in %s.\n", i, - polyfilename); - } - } else if ((end2 < firstnumber) || (end2 >= firstnumber + inpoints)) { - if (!quiet) { - printf("Warning: Invalid second endpoint of segment %d in %s.\n", i, - polyfilename); - } - } else { - endpoint1 = getpoint(end1); - endpoint2 = getpoint(end2); - if ((endpoint1[0] == endpoint2[0]) && (endpoint1[1] == endpoint2[1])) { - if (!quiet) { - printf("Warning: Endpoints of segment %d are coincident in %s.\n", - i, polyfilename); - } - } else { - insertsegment(endpoint1, endpoint2, boundmarker); - } - } - } - } else { - segments = 0; - } - if (convex || !poly) { - /* Enclose the convex hull with shell edges. */ - if (verbose) { - printf(" Enclosing convex hull with segments.\n"); - } - markhull(); - } - return segments; -} - -/** **/ -/** **/ -/********* Segment (shell edge) insertion ends here *********/ - -/********* Carving out holes and concavities begins here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* infecthull() Virally infect all of the triangles of the convex hull */ -/* that are not protected by shell edges. Where there are */ -/* shell edges, set boundary markers as appropriate. */ -/* */ -/*****************************************************************************/ - -void infecthull() -{ - struct triedge hulltri; - struct triedge nexttri; - struct triedge starttri; - struct edge hulledge; - triangle **deadtri; - point horg, hdest; - triangle ptr; /* Temporary variable used by sym(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - - if (verbose) { - printf(" Marking concavities (external triangles) for elimination.\n"); - } - /* Find a triangle handle on the hull. */ - hulltri.tri = dummytri; - hulltri.orient = 0; - symself(hulltri); - /* Remember where we started so we know when to stop. */ - triedgecopy(hulltri, starttri); - /* Go once counterclockwise around the convex hull. */ - do { - /* Ignore triangles that are already infected. */ - if (!infected(hulltri)) { - /* Is the triangle protected by a shell edge? */ - tspivot(hulltri, hulledge); - if (hulledge.sh == dummysh) { - /* The triangle is not protected; infect it. */ - infect(hulltri); - deadtri = (triangle **) poolalloc(&viri); - *deadtri = hulltri.tri; - } else { - /* The triangle is protected; set boundary markers if appropriate. */ - if (mark(hulledge) == 0) { - setmark(hulledge, 1); - org(hulltri, horg); - dest(hulltri, hdest); - if (pointmark(horg) == 0) { - setpointmark(horg, 1); - } - if (pointmark(hdest) == 0) { - setpointmark(hdest, 1); - } - } - } - } - /* To find the next hull edge, go clockwise around the next vertex. */ - lnextself(hulltri); - oprev(hulltri, nexttri); - while (nexttri.tri != dummytri) { - triedgecopy(nexttri, hulltri); - oprev(hulltri, nexttri); - } - } while (!triedgeequal(hulltri, starttri)); -} - -/*****************************************************************************/ -/* */ -/* plague() Spread the virus from all infected triangles to any neighbors */ -/* not protected by shell edges. Delete all infected triangles. */ -/* */ -/* This is the procedure that actually creates holes and concavities. */ -/* */ -/* This procedure operates in two phases. The first phase identifies all */ -/* the triangles that will die, and marks them as infected. They are */ -/* marked to ensure that each triangle is added to the virus pool only */ -/* once, so the procedure will terminate. */ -/* */ -/* The second phase actually eliminates the infected triangles. It also */ -/* eliminates orphaned points. */ -/* */ -/*****************************************************************************/ - -void plague() -{ - struct triedge testtri; - struct triedge neighbor; - triangle **virusloop; - triangle **deadtri; - struct edge neighborshelle; - point testpoint; - point norg, ndest; - point deadorg, deaddest, deadapex; - int killorg; - triangle ptr; /* Temporary variable used by sym() and onext(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - - if (verbose) { - printf(" Marking neighbors of marked triangles.\n"); - } - /* Loop through all the infected triangles, spreading the virus to */ - /* their neighbors, then to their neighbors' neighbors. */ - traversalinit(&viri); - virusloop = (triangle **) traverse(&viri); - while (virusloop != (triangle **) NULL) { - testtri.tri = *virusloop; - /* A triangle is marked as infected by messing with one of its shell */ - /* edges, setting it to an illegal value. Hence, we have to */ - /* temporarily uninfect this triangle so that we can examine its */ - /* adjacent shell edges. */ - uninfect(testtri); - if (verbose > 2) { - /* Assign the triangle an orientation for convenience in */ - /* checking its points. */ - testtri.orient = 0; - org(testtri, deadorg); - dest(testtri, deaddest); - apex(testtri, deadapex); - printf(" Checking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", - deadorg[0], deadorg[1], deaddest[0], deaddest[1], - deadapex[0], deadapex[1]); - } - /* Check each of the triangle's three neighbors. */ - for (testtri.orient = 0; testtri.orient < 3; testtri.orient++) { - /* Find the neighbor. */ - sym(testtri, neighbor); - /* Check for a shell between the triangle and its neighbor. */ - tspivot(testtri, neighborshelle); - /* Check if the neighbor is nonexistent or already infected. */ - if ((neighbor.tri == dummytri) || infected(neighbor)) { - if (neighborshelle.sh != dummysh) { - /* There is a shell edge separating the triangle from its */ - /* neighbor, but both triangles are dying, so the shell */ - /* edge dies too. */ - shelledealloc(neighborshelle.sh); - if (neighbor.tri != dummytri) { - /* Make sure the shell edge doesn't get deallocated again */ - /* later when the infected neighbor is visited. */ - uninfect(neighbor); - tsdissolve(neighbor); - infect(neighbor); - } - } - } else { /* The neighbor exists and is not infected. */ - if (neighborshelle.sh == dummysh) { - /* There is no shell edge protecting the neighbor, so */ - /* the neighbor becomes infected. */ - if (verbose > 2) { - org(neighbor, deadorg); - dest(neighbor, deaddest); - apex(neighbor, deadapex); - printf( - " Marking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", - deadorg[0], deadorg[1], deaddest[0], deaddest[1], - deadapex[0], deadapex[1]); - } - infect(neighbor); - /* Ensure that the neighbor's neighbors will be infected. */ - deadtri = (triangle **) poolalloc(&viri); - *deadtri = neighbor.tri; - } else { /* The neighbor is protected by a shell edge. */ - /* Remove this triangle from the shell edge. */ - stdissolve(neighborshelle); - /* The shell edge becomes a boundary. Set markers accordingly. */ - if (mark(neighborshelle) == 0) { - setmark(neighborshelle, 1); - } - org(neighbor, norg); - dest(neighbor, ndest); - if (pointmark(norg) == 0) { - setpointmark(norg, 1); - } - if (pointmark(ndest) == 0) { - setpointmark(ndest, 1); - } - } - } - } - /* Remark the triangle as infected, so it doesn't get added to the */ - /* virus pool again. */ - infect(testtri); - virusloop = (triangle **) traverse(&viri); - } - - if (verbose) { - printf(" Deleting marked triangles.\n"); - } - traversalinit(&viri); - virusloop = (triangle **) traverse(&viri); - while (virusloop != (triangle **) NULL) { - testtri.tri = *virusloop; - - /* Check each of the three corners of the triangle for elimination. */ - /* This is done by walking around each point, checking if it is */ - /* still connected to at least one live triangle. */ - for (testtri.orient = 0; testtri.orient < 3; testtri.orient++) { - org(testtri, testpoint); - /* Check if the point has already been tested. */ - if (testpoint != (point) NULL) { - killorg = 1; - /* Mark the corner of the triangle as having been tested. */ - setorg(testtri, NULL); - /* Walk counterclockwise about the point. */ - onext(testtri, neighbor); - /* Stop upon reaching a boundary or the starting triangle. */ - while ((neighbor.tri != dummytri) - && (!triedgeequal(neighbor, testtri))) { - if (infected(neighbor)) { - /* Mark the corner of this triangle as having been tested. */ - setorg(neighbor, NULL); - } else { - /* A live triangle. The point survives. */ - killorg = 0; - } - /* Walk counterclockwise about the point. */ - onextself(neighbor); - } - /* If we reached a boundary, we must walk clockwise as well. */ - if (neighbor.tri == dummytri) { - /* Walk clockwise about the point. */ - oprev(testtri, neighbor); - /* Stop upon reaching a boundary. */ - while (neighbor.tri != dummytri) { - if (infected(neighbor)) { - /* Mark the corner of this triangle as having been tested. */ - setorg(neighbor, NULL); - } else { - /* A live triangle. The point survives. */ - killorg = 0; - } - /* Walk clockwise about the point. */ - oprevself(neighbor); - } - } - if (killorg) { - if (verbose > 1) { - printf(" Deleting point (%.12g, %.12g)\n", - testpoint[0], testpoint[1]); - } - pointdealloc(testpoint); - } - } - } - - /* Record changes in the number of boundary edges, and disconnect */ - /* dead triangles from their neighbors. */ - for (testtri.orient = 0; testtri.orient < 3; testtri.orient++) { - sym(testtri, neighbor); - if (neighbor.tri == dummytri) { - /* There is no neighboring triangle on this edge, so this edge */ - /* is a boundary edge. This triangle is being deleted, so this */ - /* boundary edge is deleted. */ - hullsize--; - } else { - /* Disconnect the triangle from its neighbor. */ - dissolve(neighbor); - /* There is a neighboring triangle on this edge, so this edge */ - /* becomes a boundary edge when this triangle is deleted. */ - hullsize++; - } - } - /* Return the dead triangle to the pool of triangles. */ - triangledealloc(testtri.tri); - virusloop = (triangle **) traverse(&viri); - } - /* Empty the virus pool. */ - poolrestart(&viri); -} - -/*****************************************************************************/ -/* */ -/* regionplague() Spread regional attributes and/or area constraints */ -/* (from a .poly file) throughout the mesh. */ -/* */ -/* This procedure operates in two phases. The first phase spreads an */ -/* attribute and/or an area constraint through a (segment-bounded) region. */ -/* The triangles are marked to ensure that each triangle is added to the */ -/* virus pool only once, so the procedure will terminate. */ -/* */ -/* The second phase uninfects all infected triangles, returning them to */ -/* normal. */ -/* */ -/*****************************************************************************/ - -void regionplague(attribute, area) -REAL attribute; -REAL area; -{ - struct triedge testtri; - struct triedge neighbor; - triangle **virusloop; - triangle **regiontri; - struct edge neighborshelle; - point regionorg, regiondest, regionapex; - triangle ptr; /* Temporary variable used by sym() and onext(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - - if (verbose > 1) { - printf(" Marking neighbors of marked triangles.\n"); - } - /* Loop through all the infected triangles, spreading the attribute */ - /* and/or area constraint to their neighbors, then to their neighbors' */ - /* neighbors. */ - traversalinit(&viri); - virusloop = (triangle **) traverse(&viri); - while (virusloop != (triangle **) NULL) { - testtri.tri = *virusloop; - /* A triangle is marked as infected by messing with one of its shell */ - /* edges, setting it to an illegal value. Hence, we have to */ - /* temporarily uninfect this triangle so that we can examine its */ - /* adjacent shell edges. */ - uninfect(testtri); - if (regionattrib) { - /* Set an attribute. */ - setelemattribute(testtri, eextras, attribute); - } - if (vararea) { - /* Set an area constraint. */ - setareabound(testtri, area); - } - if (verbose > 2) { - /* Assign the triangle an orientation for convenience in */ - /* checking its points. */ - testtri.orient = 0; - org(testtri, regionorg); - dest(testtri, regiondest); - apex(testtri, regionapex); - printf(" Checking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", - regionorg[0], regionorg[1], regiondest[0], regiondest[1], - regionapex[0], regionapex[1]); - } - /* Check each of the triangle's three neighbors. */ - for (testtri.orient = 0; testtri.orient < 3; testtri.orient++) { - /* Find the neighbor. */ - sym(testtri, neighbor); - /* Check for a shell between the triangle and its neighbor. */ - tspivot(testtri, neighborshelle); - /* Make sure the neighbor exists, is not already infected, and */ - /* isn't protected by a shell edge. */ - if ((neighbor.tri != dummytri) && !infected(neighbor) - && (neighborshelle.sh == dummysh)) { - if (verbose > 2) { - org(neighbor, regionorg); - dest(neighbor, regiondest); - apex(neighbor, regionapex); - printf(" Marking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", - regionorg[0], regionorg[1], regiondest[0], regiondest[1], - regionapex[0], regionapex[1]); - } - /* Infect the neighbor. */ - infect(neighbor); - /* Ensure that the neighbor's neighbors will be infected. */ - regiontri = (triangle **) poolalloc(&viri); - *regiontri = neighbor.tri; - } - } - /* Remark the triangle as infected, so it doesn't get added to the */ - /* virus pool again. */ - infect(testtri); - virusloop = (triangle **) traverse(&viri); - } - - /* Uninfect all triangles. */ - if (verbose > 1) { - printf(" Unmarking marked triangles.\n"); - } - traversalinit(&viri); - virusloop = (triangle **) traverse(&viri); - while (virusloop != (triangle **) NULL) { - testtri.tri = *virusloop; - uninfect(testtri); - virusloop = (triangle **) traverse(&viri); - } - /* Empty the virus pool. */ - poolrestart(&viri); -} - -/*****************************************************************************/ -/* */ -/* carveholes() Find the holes and infect them. Find the area */ -/* constraints and infect them. Infect the convex hull. */ -/* Spread the infection and kill triangles. Spread the */ -/* area constraints. */ -/* */ -/* This routine mainly calls other routines to carry out all these */ -/* functions. */ -/* */ -/*****************************************************************************/ - -void carveholes(holelist, holes, regionlist, regions) -REAL *holelist; -int holes; -REAL *regionlist; -int regions; -{ - struct triedge searchtri; - struct triedge triangleloop; - struct triedge *regiontris; - triangle **holetri; - triangle **regiontri; - point searchorg, searchdest; - enum locateresult intersect; - int i; - triangle ptr; /* Temporary variable used by sym(). */ - - if (!(quiet || (noholes && convex))) { - printf("Removing unwanted triangles.\n"); - if (verbose && (holes > 0)) { - printf(" Marking holes for elimination.\n"); - } - } - - if (regions > 0) { - /* Allocate storage for the triangles in which region points fall. */ - regiontris = (struct triedge *) malloc(regions * sizeof(struct triedge)); - if (regiontris == (struct triedge *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - - if (((holes > 0) && !noholes) || !convex || (regions > 0)) { - /* Initialize a pool of viri to be used for holes, concavities, */ - /* regional attributes, and/or regional area constraints. */ - poolinit(&viri, sizeof(triangle *), VIRUSPERBLOCK, POINTER, 0); - } - - if (!convex) { - /* Mark as infected any unprotected triangles on the boundary. */ - /* This is one way by which concavities are created. */ - infecthull(); - } - - if ((holes > 0) && !noholes) { - /* Infect each triangle in which a hole lies. */ - for (i = 0; i < 2 * holes; i += 2) { - /* Ignore holes that aren't within the bounds of the mesh. */ - if ((holelist[i] >= xmin) && (holelist[i] <= xmax) - && (holelist[i + 1] >= ymin) && (holelist[i + 1] <= ymax)) { - /* Start searching from some triangle on the outer boundary. */ - searchtri.tri = dummytri; - searchtri.orient = 0; - symself(searchtri); - /* Ensure that the hole is to the left of this boundary edge; */ - /* otherwise, locate() will falsely report that the hole */ - /* falls within the starting triangle. */ - org(searchtri, searchorg); - dest(searchtri, searchdest); - if (counterclockwise(searchorg, searchdest, &holelist[i]) > 0.0) { - /* Find a triangle that contains the hole. */ - intersect = locate(&holelist[i], &searchtri); - if ((intersect != OUTSIDE) && (!infected(searchtri))) { - /* Infect the triangle. This is done by marking the triangle */ - /* as infect and including the triangle in the virus pool. */ - infect(searchtri); - holetri = (triangle **) poolalloc(&viri); - *holetri = searchtri.tri; - } - } - } - } - } - - /* Now, we have to find all the regions BEFORE we carve the holes, because */ - /* locate() won't work when the triangulation is no longer convex. */ - /* (Incidentally, this is the reason why regional attributes and area */ - /* constraints can't be used when refining a preexisting mesh, which */ - /* might not be convex; they can only be used with a freshly */ - /* triangulated PSLG.) */ - if (regions > 0) { - /* Find the starting triangle for each region. */ - for (i = 0; i < regions; i++) { - regiontris[i].tri = dummytri; - /* Ignore region points that aren't within the bounds of the mesh. */ - if ((regionlist[4 * i] >= xmin) && (regionlist[4 * i] <= xmax) && - (regionlist[4 * i + 1] >= ymin) && (regionlist[4 * i + 1] <= ymax)) { - /* Start searching from some triangle on the outer boundary. */ - searchtri.tri = dummytri; - searchtri.orient = 0; - symself(searchtri); - /* Ensure that the region point is to the left of this boundary */ - /* edge; otherwise, locate() will falsely report that the */ - /* region point falls within the starting triangle. */ - org(searchtri, searchorg); - dest(searchtri, searchdest); - if (counterclockwise(searchorg, searchdest, ®ionlist[4 * i]) > - 0.0) { - /* Find a triangle that contains the region point. */ - intersect = locate(®ionlist[4 * i], &searchtri); - if ((intersect != OUTSIDE) && (!infected(searchtri))) { - /* Record the triangle for processing after the */ - /* holes have been carved. */ - triedgecopy(searchtri, regiontris[i]); - } - } - } - } - } - - if (viri.items > 0) { - /* Carve the holes and concavities. */ - plague(); - } - /* The virus pool should be empty now. */ - - if (regions > 0) { - if (!quiet) { - if (regionattrib) { - if (vararea) { - printf("Spreading regional attributes and area constraints.\n"); - } else { - printf("Spreading regional attributes.\n"); - } - } else { - printf("Spreading regional area constraints.\n"); - } - } - if (regionattrib && !refine) { - /* Assign every triangle a regional attribute of zero. */ - traversalinit(&triangles); - triangleloop.orient = 0; - triangleloop.tri = triangletraverse(); - while (triangleloop.tri != (triangle *) NULL) { - setelemattribute(triangleloop, eextras, 0.0); - triangleloop.tri = triangletraverse(); - } - } - for (i = 0; i < regions; i++) { - if (regiontris[i].tri != dummytri) { - /* Make sure the triangle under consideration still exists. */ - /* It may have been eaten by the virus. */ - if (regiontris[i].tri[3] != (triangle) NULL) { - /* Put one triangle in the virus pool. */ - infect(regiontris[i]); - regiontri = (triangle **) poolalloc(&viri); - *regiontri = regiontris[i].tri; - /* Apply one region's attribute and/or area constraint. */ - regionplague(regionlist[4 * i + 2], regionlist[4 * i + 3]); - /* The virus pool should be empty now. */ - } - } - } - if (regionattrib && !refine) { - /* Note the fact that each triangle has an additional attribute. */ - eextras++; - } - } - - /* Free up memory. */ - if (((holes > 0) && !noholes) || !convex || (regions > 0)) { - pooldeinit(&viri); - } - if (regions > 0) { - free(regiontris); - } -} - -/** **/ -/** **/ -/********* Carving out holes and concavities ends here *********/ - -/********* Mesh quality maintenance begins here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* tallyencs() Traverse the entire list of shell edges, check each edge */ -/* to see if it is encroached. If so, add it to the list. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -void tallyencs() -{ - struct edge edgeloop; - int dummy; - - traversalinit(&shelles); - edgeloop.shorient = 0; - edgeloop.sh = shelletraverse(); - while (edgeloop.sh != (shelle *) NULL) { - /* If the segment is encroached, add it to the list. */ - dummy = checkedge4encroach(&edgeloop); - edgeloop.sh = shelletraverse(); - } -} - -#endif /* not CDT_ONLY */ - -/*****************************************************************************/ -/* */ -/* precisionerror() Print an error message for precision problems. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -void precisionerror() -{ - printf("Try increasing the area criterion and/or reducing the minimum\n"); - printf(" allowable angle so that tiny triangles are not created.\n"); -#ifdef SINGLE - printf("Alternatively, try recompiling me with double precision\n"); - printf(" arithmetic (by removing \"#define SINGLE\" from the\n"); - printf(" source file or \"-DSINGLE\" from the makefile).\n"); -#endif /* SINGLE */ -} - -#endif /* not CDT_ONLY */ - -/*****************************************************************************/ -/* */ -/* repairencs() Find and repair all the encroached segments. */ -/* */ -/* Encroached segments are repaired by splitting them by inserting a point */ -/* at or near their centers. */ -/* */ -/* `flaws' is a flag that specifies whether one should take note of new */ -/* encroached segments and bad triangles that result from inserting points */ -/* to repair existing encroached segments. */ -/* */ -/* When a segment is split, the two resulting subsegments are always */ -/* tested to see if they are encroached upon, regardless of the value */ -/* of `flaws'. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -void repairencs(flaws) -int flaws; -{ - struct triedge enctri; - struct triedge testtri; - struct edge *encloop; - struct edge testsh; - point eorg, edest; - point newpoint; - enum insertsiteresult success; - REAL segmentlength, nearestpoweroftwo; - REAL split; - int acuteorg, acutedest; - int dummy; - int i; - triangle ptr; /* Temporary variable used by stpivot(). */ - shelle sptr; /* Temporary variable used by snext(). */ - - while ((badsegments.items > 0) && (steinerleft != 0)) { - traversalinit(&badsegments); - encloop = badsegmenttraverse(); - while ((encloop != (struct edge *) NULL) && (steinerleft != 0)) { - /* To decide where to split a segment, we need to know if the */ - /* segment shares an endpoint with an adjacent segment. */ - /* The concern is that, if we simply split every encroached */ - /* segment in its center, two adjacent segments with a small */ - /* angle between them might lead to an infinite loop; each */ - /* point added to split one segment will encroach upon the */ - /* other segment, which must then be split with a point that */ - /* will encroach upon the first segment, and so on forever. */ - /* To avoid this, imagine a set of concentric circles, whose */ - /* radii are powers of two, about each segment endpoint. */ - /* These concentric circles determine where the segment is */ - /* split. (If both endpoints are shared with adjacent */ - /* segments, split the segment in the middle, and apply the */ - /* concentric shells for later splittings.) */ - - /* Is the origin shared with another segment? */ - stpivot(*encloop, enctri); - lnext(enctri, testtri); - tspivot(testtri, testsh); - acuteorg = testsh.sh != dummysh; - /* Is the destination shared with another segment? */ - lnextself(testtri); - tspivot(testtri, testsh); - acutedest = testsh.sh != dummysh; - /* Now, check the other side of the segment, if there's a triangle */ - /* there. */ - sym(enctri, testtri); - if (testtri.tri != dummytri) { - /* Is the destination shared with another segment? */ - lnextself(testtri); - tspivot(testtri, testsh); - acutedest = acutedest || (testsh.sh != dummysh); - /* Is the origin shared with another segment? */ - lnextself(testtri); - tspivot(testtri, testsh); - acuteorg = acuteorg || (testsh.sh != dummysh); - } - - sorg(*encloop, eorg); - sdest(*encloop, edest); - /* Use the concentric circles if exactly one endpoint is shared */ - /* with another adjacent segment. */ - if (acuteorg ^ acutedest) { - segmentlength = sqrt((edest[0] - eorg[0]) * (edest[0] - eorg[0]) - + (edest[1] - eorg[1]) * (edest[1] - eorg[1])); - /* Find the power of two nearest the segment's length. */ - nearestpoweroftwo = 1.0; - while (segmentlength > SQUAREROOTTWO * nearestpoweroftwo) { - nearestpoweroftwo *= 2.0; - } - while (segmentlength < (0.5 * SQUAREROOTTWO) * nearestpoweroftwo) { - nearestpoweroftwo *= 0.5; - } - /* Where do we split the segment? */ - split = 0.5 * nearestpoweroftwo / segmentlength; - if (acutedest) { - split = 1.0 - split; - } - } else { - /* If we're not worried about adjacent segments, split */ - /* this segment in the middle. */ - split = 0.5; - } - - /* Create the new point. */ - newpoint = (point) poolalloc(&points); - /* Interpolate its coordinate and attributes. */ - for (i = 0; i < 2 + nextras; i++) { - newpoint[i] = (1.0 - split) * eorg[i] + split * edest[i]; - } - setpointmark(newpoint, mark(*encloop)); - if (verbose > 1) { - printf( - " Splitting edge (%.12g, %.12g) (%.12g, %.12g) at (%.12g, %.12g).\n", - eorg[0], eorg[1], edest[0], edest[1], newpoint[0], newpoint[1]); - } - /* Check whether the new point lies on an endpoint. */ - if (((newpoint[0] == eorg[0]) && (newpoint[1] == eorg[1])) - || ((newpoint[0] == edest[0]) && (newpoint[1] == edest[1]))) { - printf("Error: Ran out of precision at (%.12g, %.12g).\n", - newpoint[0], newpoint[1]); - printf("I attempted to split a segment to a smaller size than can\n"); - printf(" be accommodated by the finite precision of floating point\n" - ); - printf(" arithmetic.\n"); - precisionerror(); - exit(1); - } - /* Insert the splitting point. This should always succeed. */ - success = insertsite(newpoint, &enctri, encloop, flaws, flaws); - if ((success != SUCCESSFULPOINT) && (success != ENCROACHINGPOINT)) { - printf("Internal error in repairencs():\n"); - printf(" Failure to split a segment.\n"); - internalerror(); - } - if (steinerleft > 0) { - steinerleft--; - } - /* Check the two new subsegments to see if they're encroached. */ - dummy = checkedge4encroach(encloop); - snextself(*encloop); - dummy = checkedge4encroach(encloop); - - badsegmentdealloc(encloop); - encloop = badsegmenttraverse(); - } - } -} - -#endif /* not CDT_ONLY */ - -/*****************************************************************************/ -/* */ -/* tallyfaces() Test every triangle in the mesh for quality measures. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -void tallyfaces() -{ - struct triedge triangleloop; - - if (verbose) { - printf(" Making a list of bad triangles.\n"); - } - traversalinit(&triangles); - triangleloop.orient = 0; - triangleloop.tri = triangletraverse(); - while (triangleloop.tri != (triangle *) NULL) { - /* If the triangle is bad, enqueue it. */ - testtriangle(&triangleloop); - triangleloop.tri = triangletraverse(); - } -} - -#endif /* not CDT_ONLY */ - -/*****************************************************************************/ -/* */ -/* findcircumcenter() Find the circumcenter of a triangle. */ -/* */ -/* The result is returned both in terms of x-y coordinates and xi-eta */ -/* coordinates. The xi-eta coordinate system is defined in terms of the */ -/* triangle: the origin of the triangle is the origin of the coordinate */ -/* system; the destination of the triangle is one unit along the xi axis; */ -/* and the apex of the triangle is one unit along the eta axis. */ -/* */ -/* The return value indicates which edge of the triangle is shortest. */ -/* */ -/*****************************************************************************/ - -enum circumcenterresult findcircumcenter(torg, tdest, tapex, circumcenter, - xi, eta) -point torg; -point tdest; -point tapex; -point circumcenter; -REAL *xi; -REAL *eta; -{ - REAL xdo, ydo, xao, yao, xad, yad; - REAL dodist, aodist, addist; - REAL denominator; - REAL dx, dy; - - circumcentercount++; - - /* Compute the circumcenter of the triangle. */ - xdo = tdest[0] - torg[0]; - ydo = tdest[1] - torg[1]; - xao = tapex[0] - torg[0]; - yao = tapex[1] - torg[1]; - dodist = xdo * xdo + ydo * ydo; - aodist = xao * xao + yao * yao; - if (noexact) { - denominator = 0.5 / (xdo * yao - xao * ydo); - } else { - /* Use the counterclockwise() routine to ensure a positive (and */ - /* reasonably accurate) result, avoiding any possibility of */ - /* division by zero. */ - denominator = 0.5 / counterclockwise(tdest, tapex, torg); - /* Don't count the above as an orientation test. */ - counterclockcount--; - } - circumcenter[0] = torg[0] - (ydo * aodist - yao * dodist) * denominator; - circumcenter[1] = torg[1] + (xdo * aodist - xao * dodist) * denominator; - - /* To interpolate point attributes for the new point inserted at */ - /* the circumcenter, define a coordinate system with a xi-axis, */ - /* directed from the triangle's origin to its destination, and */ - /* an eta-axis, directed from its origin to its apex. */ - /* Calculate the xi and eta coordinates of the circumcenter. */ - dx = circumcenter[0] - torg[0]; - dy = circumcenter[1] - torg[1]; - *xi = (dx * yao - xao * dy) * (2.0 * denominator); - *eta = (xdo * dy - dx * ydo) * (2.0 * denominator); - - xad = tapex[0] - tdest[0]; - yad = tapex[1] - tdest[1]; - addist = xad * xad + yad * yad; - if ((addist < dodist) && (addist < aodist)) { - return OPPOSITEORG; - } else if (dodist < aodist) { - return OPPOSITEAPEX; - } else { - return OPPOSITEDEST; - } -} - -/*****************************************************************************/ -/* */ -/* splittriangle() Inserts a point at the circumcenter of a triangle. */ -/* Deletes the newly inserted point if it encroaches upon */ -/* a segment. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -void splittriangle(badtri) -struct badface *badtri; -{ - point borg, bdest, bapex; - point newpoint; - REAL xi, eta; - enum insertsiteresult success; - enum circumcenterresult shortedge; - int errorflag; - int i; - - org(badtri->badfacetri, borg); - dest(badtri->badfacetri, bdest); - apex(badtri->badfacetri, bapex); - /* Make sure that this triangle is still the same triangle it was */ - /* when it was tested and determined to be of bad quality. */ - /* Subsequent transformations may have made it a different triangle. */ - if ((borg == badtri->faceorg) && (bdest == badtri->facedest) && - (bapex == badtri->faceapex)) { - if (verbose > 1) { - printf(" Splitting this triangle at its circumcenter:\n"); - printf(" (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", borg[0], - borg[1], bdest[0], bdest[1], bapex[0], bapex[1]); - } - errorflag = 0; - /* Create a new point at the triangle's circumcenter. */ - newpoint = (point) poolalloc(&points); - shortedge = findcircumcenter(borg, bdest, bapex, newpoint, &xi, &eta); - /* Check whether the new point lies on a triangle vertex. */ - if (((newpoint[0] == borg[0]) && (newpoint[1] == borg[1])) - || ((newpoint[0] == bdest[0]) && (newpoint[1] == bdest[1])) - || ((newpoint[0] == bapex[0]) && (newpoint[1] == bapex[1]))) { - if (!quiet) { - printf("Warning: New point (%.12g, %.12g) falls on existing vertex.\n" - , newpoint[0], newpoint[1]); - errorflag = 1; - } - pointdealloc(newpoint); - } else { - for (i = 2; i < 2 + nextras; i++) { - /* Interpolate the point attributes at the circumcenter. */ - newpoint[i] = borg[i] + xi * (bdest[i] - borg[i]) - + eta * (bapex[i] - borg[i]); - } - /* The new point must be in the interior, and have a marker of zero. */ - setpointmark(newpoint, 0); - /* Ensure that the handle `badtri->badfacetri' represents the shortest */ - /* edge of the triangle. This ensures that the circumcenter must */ - /* fall to the left of this edge, so point location will work. */ - if (shortedge == OPPOSITEORG) { - lnextself(badtri->badfacetri); - } else if (shortedge == OPPOSITEDEST) { - lprevself(badtri->badfacetri); - } - /* Insert the circumcenter, searching from the edge of the triangle, */ - /* and maintain the Delaunay property of the triangulation. */ - success = insertsite(newpoint, &(badtri->badfacetri), - (struct edge *) NULL, 1, 1); - if (success == SUCCESSFULPOINT) { - if (steinerleft > 0) { - steinerleft--; - } - } else if (success == ENCROACHINGPOINT) { - /* If the newly inserted point encroaches upon a segment, delete it. */ - deletesite(&(badtri->badfacetri)); - } else if (success == VIOLATINGPOINT) { - /* Failed to insert the new point, but some segment was */ - /* marked as being encroached. */ - pointdealloc(newpoint); - } else { /* success == DUPLICATEPOINT */ - /* Failed to insert the new point because a vertex is already there. */ - if (!quiet) { - printf( - "Warning: New point (%.12g, %.12g) falls on existing vertex.\n" - , newpoint[0], newpoint[1]); - errorflag = 1; - } - pointdealloc(newpoint); - } - } - if (errorflag) { - if (verbose) { - printf(" The new point is at the circumcenter of triangle\n"); - printf(" (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", - borg[0], borg[1], bdest[0], bdest[1], bapex[0], bapex[1]); - } - printf("This probably means that I am trying to refine triangles\n"); - printf(" to a smaller size than can be accommodated by the finite\n"); - printf(" precision of floating point arithmetic. (You can be\n"); - printf(" sure of this if I fail to terminate.)\n"); - precisionerror(); - } - } - /* Return the bad triangle to the pool. */ - pooldealloc(&badtriangles, (VOID *) badtri); -} - -#endif /* not CDT_ONLY */ - -/*****************************************************************************/ -/* */ -/* enforcequality() Remove all the encroached edges and bad triangles */ -/* from the triangulation. */ -/* */ -/*****************************************************************************/ - -#ifndef CDT_ONLY - -void enforcequality() -{ - int i; - - if (!quiet) { - printf("Adding Steiner points to enforce quality.\n"); - } - /* Initialize the pool of encroached segments. */ - poolinit(&badsegments, sizeof(struct edge), BADSEGMENTPERBLOCK, POINTER, 0); - if (verbose) { - printf(" Looking for encroached segments.\n"); - } - /* Test all segments to see if they're encroached. */ - tallyencs(); - if (verbose && (badsegments.items > 0)) { - printf(" Splitting encroached segments.\n"); - } - /* Note that steinerleft == -1 if an unlimited number */ - /* of Steiner points is allowed. */ - while ((badsegments.items > 0) && (steinerleft != 0)) { - /* Fix the segments without noting newly encroached segments or */ - /* bad triangles. The reason we don't want to note newly */ - /* encroached segments is because some encroached segments are */ - /* likely to be noted multiple times, and would then be blindly */ - /* split multiple times. I should fix that some time. */ - repairencs(0); - /* Now, find all the segments that became encroached while adding */ - /* points to split encroached segments. */ - tallyencs(); - } - /* At this point, if we haven't run out of Steiner points, the */ - /* triangulation should be (conforming) Delaunay. */ - - /* Next, we worry about enforcing triangle quality. */ - if ((minangle > 0.0) || vararea || fixedarea) { - /* Initialize the pool of bad triangles. */ - poolinit(&badtriangles, sizeof(struct badface), BADTRIPERBLOCK, POINTER, - 0); - /* Initialize the queues of bad triangles. */ - for (i = 0; i < 64; i++) { - queuefront[i] = (struct badface *) NULL; - queuetail[i] = &queuefront[i]; - } - /* Test all triangles to see if they're bad. */ - tallyfaces(); - if (verbose) { - printf(" Splitting bad triangles.\n"); - } - while ((badtriangles.items > 0) && (steinerleft != 0)) { - /* Fix one bad triangle by inserting a point at its circumcenter. */ - splittriangle(dequeuebadtri()); - /* Fix any encroached segments that may have resulted. Record */ - /* any new bad triangles or encroached segments that result. */ - if (badsegments.items > 0) { - repairencs(1); - } - } - } - /* At this point, if we haven't run out of Steiner points, the */ - /* triangulation should be (conforming) Delaunay and have no */ - /* low-quality triangles. */ - - /* Might we have run out of Steiner points too soon? */ - if (!quiet && (badsegments.items > 0) && (steinerleft == 0)) { - printf("\nWarning: I ran out of Steiner points, but the mesh has\n"); - if (badsegments.items == 1) { - printf(" an encroached segment, and therefore might not be truly\n"); - } else { - printf(" %ld encroached segments, and therefore might not be truly\n", - badsegments.items); - } - printf(" Delaunay. If the Delaunay property is important to you,\n"); - printf(" try increasing the number of Steiner points (controlled by\n"); - printf(" the -S switch) slightly and try again.\n\n"); - } -} - -#endif /* not CDT_ONLY */ - -/** **/ -/** **/ -/********* Mesh quality maintenance ends here *********/ - -/*****************************************************************************/ -/* */ -/* highorder() Create extra nodes for quadratic subparametric elements. */ -/* */ -/*****************************************************************************/ - -void highorder() -{ - struct triedge triangleloop, trisym; - struct edge checkmark; - point newpoint; - point torg, tdest; - int i; - triangle ptr; /* Temporary variable used by sym(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - - if (!quiet) { - printf("Adding vertices for second-order triangles.\n"); - } - /* The following line ensures that dead items in the pool of nodes */ - /* cannot be allocated for the extra nodes associated with high */ - /* order elements. This ensures that the primary nodes (at the */ - /* corners of elements) will occur earlier in the output files, and */ - /* have lower indices, than the extra nodes. */ - points.deaditemstack = (VOID *) NULL; - - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - /* To loop over the set of edges, loop over all triangles, and look at */ - /* the three edges of each triangle. If there isn't another triangle */ - /* adjacent to the edge, operate on the edge. If there is another */ - /* adjacent triangle, operate on the edge only if the current triangle */ - /* has a smaller pointer than its neighbor. This way, each edge is */ - /* considered only once. */ - while (triangleloop.tri != (triangle *) NULL) { - for (triangleloop.orient = 0; triangleloop.orient < 3; - triangleloop.orient++) { - sym(triangleloop, trisym); - if ((triangleloop.tri < trisym.tri) || (trisym.tri == dummytri)) { - org(triangleloop, torg); - dest(triangleloop, tdest); - /* Create a new node in the middle of the edge. Interpolate */ - /* its attributes. */ - newpoint = (point) poolalloc(&points); - for (i = 0; i < 2 + nextras; i++) { - newpoint[i] = 0.5 * (torg[i] + tdest[i]); - } - /* Set the new node's marker to zero or one, depending on */ - /* whether it lies on a boundary. */ - setpointmark(newpoint, trisym.tri == dummytri); - if (useshelles) { - tspivot(triangleloop, checkmark); - /* If this edge is a segment, transfer the marker to the new node. */ - if (checkmark.sh != dummysh) { - setpointmark(newpoint, mark(checkmark)); - } - } - if (verbose > 1) { - printf(" Creating (%.12g, %.12g).\n", newpoint[0], newpoint[1]); - } - /* Record the new node in the (one or two) adjacent elements. */ - triangleloop.tri[highorderindex + triangleloop.orient] = - (triangle) newpoint; - if (trisym.tri != dummytri) { - trisym.tri[highorderindex + trisym.orient] = (triangle) newpoint; - } - } - } - triangleloop.tri = triangletraverse(); - } -} - -/********* File I/O routines begin here *********/ -/** **/ -/** **/ - -/*****************************************************************************/ -/* */ -/* readline() Read a nonempty line from a file. */ -/* */ -/* A line is considered "nonempty" if it contains something that looks like */ -/* a number. */ -/* */ -/*****************************************************************************/ - -#ifndef TRILIBRARY - -char *readline(string, infile, infilename) -char *string; -FILE *infile; -char *infilename; -{ - char *result; - - /* Search for something that looks like a number. */ - do { - result = fgets(string, INPUTLINESIZE, infile); - if (result == (char *) NULL) { - printf(" Error: Unexpected end of file in %s.\n", infilename); - exit(1); - } - /* Skip anything that doesn't look like a number, a comment, */ - /* or the end of a line. */ - while ((*result != '\0') && (*result != '#') - && (*result != '.') && (*result != '+') && (*result != '-') - && ((*result < '0') || (*result > '9'))) { - result++; - } - /* If it's a comment or end of line, read another line and try again. */ - } while ((*result == '#') || (*result == '\0')); - return result; -} - -#endif /* not TRILIBRARY */ - -/*****************************************************************************/ -/* */ -/* findfield() Find the next field of a string. */ -/* */ -/* Jumps past the current field by searching for whitespace, then jumps */ -/* past the whitespace to find the next field. */ -/* */ -/*****************************************************************************/ - -#ifndef TRILIBRARY - -char *findfield(string) -char *string; -{ - char *result; - - result = string; - /* Skip the current field. Stop upon reaching whitespace. */ - while ((*result != '\0') && (*result != '#') - && (*result != ' ') && (*result != '\t')) { - result++; - } - /* Now skip the whitespace and anything else that doesn't look like a */ - /* number, a comment, or the end of a line. */ - while ((*result != '\0') && (*result != '#') - && (*result != '.') && (*result != '+') && (*result != '-') - && ((*result < '0') || (*result > '9'))) { - result++; - } - /* Check for a comment (prefixed with `#'). */ - if (*result == '#') { - *result = '\0'; - } - return result; -} - -#endif /* not TRILIBRARY */ - -/*****************************************************************************/ -/* */ -/* readnodes() Read the points from a file, which may be a .node or .poly */ -/* file. */ -/* */ -/*****************************************************************************/ - -#ifndef TRILIBRARY - -void readnodes(nodefilename, polyfilename, polyfile) -char *nodefilename; -char *polyfilename; -FILE **polyfile; -{ - FILE *infile; - point pointloop; - char inputline[INPUTLINESIZE]; - char *stringptr; - char *infilename; - REAL x, y; - int firstnode; - int nodemarkers; - int currentmarker; - int i, j; - - if (poly) { - /* Read the points from a .poly file. */ - if (!quiet) { - printf("Opening %s.\n", polyfilename); - } - *polyfile = fopen(polyfilename, "r"); - if (*polyfile == (FILE *) NULL) { - printf(" Error: Cannot access file %s.\n", polyfilename); - exit(1); - } - /* Read number of points, number of dimensions, number of point */ - /* attributes, and number of boundary markers. */ - stringptr = readline(inputline, *polyfile, polyfilename); - inpoints = (int) strtol (stringptr, &stringptr, 0); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - mesh_dim = 2; - } else { - mesh_dim = (int) strtol (stringptr, &stringptr, 0); - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - nextras = 0; - } else { - nextras = (int) strtol (stringptr, &stringptr, 0); - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - nodemarkers = 0; - } else { - nodemarkers = (int) strtol (stringptr, &stringptr, 0); - } - if (inpoints > 0) { - infile = *polyfile; - infilename = polyfilename; - readnodefile = 0; - } else { - /* If the .poly file claims there are zero points, that means that */ - /* the points should be read from a separate .node file. */ - readnodefile = 1; - infilename = innodefilename; - } - } else { - readnodefile = 1; - infilename = innodefilename; - *polyfile = (FILE *) NULL; - } - - if (readnodefile) { - /* Read the points from a .node file. */ - if (!quiet) { - printf("Opening %s.\n", innodefilename); - } - infile = fopen(innodefilename, "r"); - if (infile == (FILE *) NULL) { - printf(" Error: Cannot access file %s.\n", innodefilename); - exit(1); - } - /* Read number of points, number of dimensions, number of point */ - /* attributes, and number of boundary markers. */ - stringptr = readline(inputline, infile, innodefilename); - inpoints = (int) strtol (stringptr, &stringptr, 0); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - mesh_dim = 2; - } else { - mesh_dim = (int) strtol (stringptr, &stringptr, 0); - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - nextras = 0; - } else { - nextras = (int) strtol (stringptr, &stringptr, 0); - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - nodemarkers = 0; - } else { - nodemarkers = (int) strtol (stringptr, &stringptr, 0); - } - } - - if (inpoints < 3) { - printf("Error: Input must have at least three input points.\n"); - exit(1); - } - if (mesh_dim != 2) { - printf("Error: Triangle only works with two-dimensional meshes.\n"); - exit(1); - } - - initializepointpool(); - - /* Read the points. */ - for (i = 0; i < inpoints; i++) { - pointloop = (point) poolalloc(&points); - stringptr = readline(inputline, infile, infilename); - if (i == 0) { - firstnode = (int) strtol (stringptr, &stringptr, 0); - if ((firstnode == 0) || (firstnode == 1)) { - firstnumber = firstnode; - } - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Point %d has no x coordinate.\n", firstnumber + i); - exit(1); - } - x = (REAL) strtod(stringptr, &stringptr); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Point %d has no y coordinate.\n", firstnumber + i); - exit(1); - } - y = (REAL) strtod(stringptr, &stringptr); - pointloop[0] = x; - pointloop[1] = y; - /* Read the point attributes. */ - for (j = 2; j < 2 + nextras; j++) { - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - pointloop[j] = 0.0; - } else { - pointloop[j] = (REAL) strtod(stringptr, &stringptr); - } - } - if (nodemarkers) { - /* Read a point marker. */ - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - setpointmark(pointloop, 0); - } else { - currentmarker = (int) strtol (stringptr, &stringptr, 0); - setpointmark(pointloop, currentmarker); - } - } else { - /* If no markers are specified in the file, they default to zero. */ - setpointmark(pointloop, 0); - } - /* Determine the smallest and largest x and y coordinates. */ - if (i == 0) { - xmin = xmax = x; - ymin = ymax = y; - } else { - xmin = (x < xmin) ? x : xmin; - xmax = (x > xmax) ? x : xmax; - ymin = (y < ymin) ? y : ymin; - ymax = (y > ymax) ? y : ymax; - } - } - if (readnodefile) { - fclose(infile); - } - - /* Nonexistent x value used as a flag to mark circle events in sweepline */ - /* Delaunay algorithm. */ - xminextreme = 10 * xmin - 9 * xmax; -} - -#endif /* not TRILIBRARY */ - -/*****************************************************************************/ -/* */ -/* transfernodes() Read the points from memory. */ -/* */ -/*****************************************************************************/ - -#ifdef TRILIBRARY - -void transfernodes(pointlist, pointattriblist, pointmarkerlist, numberofpoints, - numberofpointattribs) -REAL *pointlist; -REAL *pointattriblist; -int *pointmarkerlist; -int numberofpoints; -int numberofpointattribs; -{ - point pointloop; - REAL x, y; - int i, j; - int coordindex; - int attribindex; - - inpoints = numberofpoints; - mesh_dim = 2; - nextras = numberofpointattribs; - readnodefile = 0; - if (inpoints < 3) { - printf("Error: Input must have at least three input points.\n"); - exit(1); - } - - initializepointpool(); - - /* Read the points. */ - coordindex = 0; - attribindex = 0; - for (i = 0; i < inpoints; i++) { - pointloop = (point) poolalloc(&points); - /* Read the point coordinates. */ - x = pointloop[0] = pointlist[coordindex++]; - y = pointloop[1] = pointlist[coordindex++]; - /* Read the point attributes. */ - for (j = 0; j < numberofpointattribs; j++) { - pointloop[2 + j] = pointattriblist[attribindex++]; - } - if (pointmarkerlist != (int *) NULL) { - /* Read a point marker. */ - setpointmark(pointloop, pointmarkerlist[i]); - } else { - /* If no markers are specified, they default to zero. */ - setpointmark(pointloop, 0); - } - x = pointloop[0]; - y = pointloop[1]; - /* Determine the smallest and largest x and y coordinates. */ - if (i == 0) { - xmin = xmax = x; - ymin = ymax = y; - } else { - xmin = (x < xmin) ? x : xmin; - xmax = (x > xmax) ? x : xmax; - ymin = (y < ymin) ? y : ymin; - ymax = (y > ymax) ? y : ymax; - } - } - - /* Nonexistent x value used as a flag to mark circle events in sweepline */ - /* Delaunay algorithm. */ - xminextreme = 10 * xmin - 9 * xmax; -} - -#endif /* TRILIBRARY */ - -/*****************************************************************************/ -/* */ -/* readholes() Read the holes, and possibly regional attributes and area */ -/* constraints, from a .poly file. */ -/* */ -/*****************************************************************************/ - -#ifndef TRILIBRARY - -void readholes(polyfile, polyfilename, hlist, holes, rlist, regions) -FILE *polyfile; -char *polyfilename; -REAL **hlist; -int *holes; -REAL **rlist; -int *regions; -{ - REAL *holelist; - REAL *regionlist; - char inputline[INPUTLINESIZE]; - char *stringptr; - int index; - int i; - - /* Read the holes. */ - stringptr = readline(inputline, polyfile, polyfilename); - *holes = (int) strtol (stringptr, &stringptr, 0); - if (*holes > 0) { - holelist = (REAL *) malloc(2 * *holes * sizeof(REAL)); - *hlist = holelist; - if (holelist == (REAL *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - for (i = 0; i < 2 * *holes; i += 2) { - stringptr = readline(inputline, polyfile, polyfilename); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Hole %d has no x coordinate.\n", - firstnumber + (i >> 1)); - exit(1); - } else { - holelist[i] = (REAL) strtod(stringptr, &stringptr); - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Hole %d has no y coordinate.\n", - firstnumber + (i >> 1)); - exit(1); - } else { - holelist[i + 1] = (REAL) strtod(stringptr, &stringptr); - } - } - } else { - *hlist = (REAL *) NULL; - } - -#ifndef CDT_ONLY - if ((regionattrib || vararea) && !refine) { - /* Read the area constraints. */ - stringptr = readline(inputline, polyfile, polyfilename); - *regions = (int) strtol (stringptr, &stringptr, 0); - if (*regions > 0) { - regionlist = (REAL *) malloc(4 * *regions * sizeof(REAL)); - *rlist = regionlist; - if (regionlist == (REAL *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - index = 0; - for (i = 0; i < *regions; i++) { - stringptr = readline(inputline, polyfile, polyfilename); - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Region %d has no x coordinate.\n", - firstnumber + i); - exit(1); - } else { - regionlist[index++] = (REAL) strtod(stringptr, &stringptr); - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf("Error: Region %d has no y coordinate.\n", - firstnumber + i); - exit(1); - } else { - regionlist[index++] = (REAL) strtod(stringptr, &stringptr); - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - printf( - "Error: Region %d has no region attribute or area constraint.\n", - firstnumber + i); - exit(1); - } else { - regionlist[index++] = (REAL) strtod(stringptr, &stringptr); - } - stringptr = findfield(stringptr); - if (*stringptr == '\0') { - regionlist[index] = regionlist[index - 1]; - } else { - regionlist[index] = (REAL) strtod(stringptr, &stringptr); - } - index++; - } - } - } else { - /* Set `*regions' to zero to avoid an accidental free() later. */ - *regions = 0; - *rlist = (REAL *) NULL; - } -#endif /* not CDT_ONLY */ - - fclose(polyfile); -} - -#endif /* not TRILIBRARY */ - -/*****************************************************************************/ -/* */ -/* finishfile() Write the command line to the output file so the user */ -/* can remember how the file was generated. Close the file. */ -/* */ -/*****************************************************************************/ - -#ifndef TRILIBRARY - -void finishfile(outfile, argc, argv) -FILE *outfile; -int argc; -char **argv; -{ - int i; - - fprintf(outfile, "# Generated by"); - for (i = 0; i < argc; i++) { - fprintf(outfile, " "); - fputs(argv[i], outfile); - } - fprintf(outfile, "\n"); - fclose(outfile); -} - -#endif /* not TRILIBRARY */ - -/*****************************************************************************/ -/* */ -/* writenodes() Number the points and write them to a .node file. */ -/* */ -/* To save memory, the point numbers are written over the shell markers */ -/* after the points are written to a file. */ -/* */ -/*****************************************************************************/ - -#ifdef TRILIBRARY - -void writenodes(pointlist, pointattriblist, pointmarkerlist) -REAL **pointlist; -REAL **pointattriblist; -int **pointmarkerlist; - -#else /* not TRILIBRARY */ - -void writenodes(nodefilename, argc, argv) -char *nodefilename; -int argc; -char **argv; - -#endif /* not TRILIBRARY */ - -{ -#ifdef TRILIBRARY - REAL *plist; - REAL *palist; - int *pmlist; - int coordindex; - int attribindex; -#else /* not TRILIBRARY */ - FILE *outfile; -#endif /* not TRILIBRARY */ - point pointloop; - int pointnumber; - int i; - -#ifdef TRILIBRARY - if (!quiet) { - printf("Writing points.\n"); - } - /* Allocate memory for output points if necessary. */ - if (*pointlist == (REAL *) NULL) { - *pointlist = (REAL *) malloc(points.items * 2 * sizeof(REAL)); - if (*pointlist == (REAL *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - /* Allocate memory for output point attributes if necessary. */ - if ((nextras > 0) && (*pointattriblist == (REAL *) NULL)) { - *pointattriblist = (REAL *) malloc(points.items * nextras * sizeof(REAL)); - if (*pointattriblist == (REAL *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - /* Allocate memory for output point markers if necessary. */ - if (!nobound && (*pointmarkerlist == (int *) NULL)) { - *pointmarkerlist = (int *) malloc(points.items * sizeof(int)); - if (*pointmarkerlist == (int *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - plist = *pointlist; - palist = *pointattriblist; - pmlist = *pointmarkerlist; - coordindex = 0; - attribindex = 0; -#else /* not TRILIBRARY */ - if (!quiet) { - printf("Writing %s.\n", nodefilename); - } - outfile = fopen(nodefilename, "w"); - if (outfile == (FILE *) NULL) { - printf(" Error: Cannot create file %s.\n", nodefilename); - exit(1); - } - /* Number of points, number of dimensions, number of point attributes, */ - /* and number of boundary markers (zero or one). */ - fprintf(outfile, "%ld %d %d %d\n", points.items, mesh_dim, nextras, - 1 - nobound); -#endif /* not TRILIBRARY */ - - traversalinit(&points); - pointloop = pointtraverse(); - pointnumber = firstnumber; - while (pointloop != (point) NULL) { -#ifdef TRILIBRARY - /* X and y coordinates. */ - plist[coordindex++] = pointloop[0]; - plist[coordindex++] = pointloop[1]; - /* Point attributes. */ - for (i = 0; i < nextras; i++) { - palist[attribindex++] = pointloop[2 + i]; - } - if (!nobound) { - /* Copy the boundary marker. */ - pmlist[pointnumber - firstnumber] = pointmark(pointloop); - } -#else /* not TRILIBRARY */ - /* Point number, x and y coordinates. */ - fprintf(outfile, "%4d %.17g %.17g", pointnumber, pointloop[0], - pointloop[1]); - for (i = 0; i < nextras; i++) { - /* Write an attribute. */ - fprintf(outfile, " %.17g", pointloop[i + 2]); - } - if (nobound) { - fprintf(outfile, "\n"); - } else { - /* Write the boundary marker. */ - fprintf(outfile, " %d\n", pointmark(pointloop)); - } -#endif /* not TRILIBRARY */ - - setpointmark(pointloop, pointnumber); - pointloop = pointtraverse(); - pointnumber++; - } - -#ifndef TRILIBRARY - finishfile(outfile, argc, argv); -#endif /* not TRILIBRARY */ -} - -/*****************************************************************************/ -/* */ -/* numbernodes() Number the points. */ -/* */ -/* Each point is assigned a marker equal to its number. */ -/* */ -/* Used when writenodes() is not called because no .node file is written. */ -/* */ -/*****************************************************************************/ - -void numbernodes() -{ - point pointloop; - int pointnumber; - - traversalinit(&points); - pointloop = pointtraverse(); - pointnumber = firstnumber; - while (pointloop != (point) NULL) { - setpointmark(pointloop, pointnumber); - pointloop = pointtraverse(); - pointnumber++; - } -} - -/*****************************************************************************/ -/* */ -/* writeelements() Write the triangles to an .ele file. */ -/* */ -/*****************************************************************************/ - -#ifdef TRILIBRARY - -void writeelements(trianglelist, triangleattriblist) -int **trianglelist; -REAL **triangleattriblist; - -#else /* not TRILIBRARY */ - -void writeelements(elefilename, argc, argv) -char *elefilename; -int argc; -char **argv; - -#endif /* not TRILIBRARY */ - -{ -#ifdef TRILIBRARY - int *tlist; - REAL *talist; - int pointindex; - int attribindex; -#else /* not TRILIBRARY */ - FILE *outfile; -#endif /* not TRILIBRARY */ - struct triedge triangleloop; - point p1, p2, p3; - point mid1, mid2, mid3; - int elementnumber; - int i; - -#ifdef TRILIBRARY - if (!quiet) { - printf("Writing triangles.\n"); - } - /* Allocate memory for output triangles if necessary. */ - if (*trianglelist == (int *) NULL) { - *trianglelist = (int *) malloc(triangles.items * - ((order + 1) * (order + 2) / 2) * sizeof(int)); - if (*trianglelist == (int *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - /* Allocate memory for output triangle attributes if necessary. */ - if ((eextras > 0) && (*triangleattriblist == (REAL *) NULL)) { - *triangleattriblist = (REAL *) malloc(triangles.items * eextras * - sizeof(REAL)); - if (*triangleattriblist == (REAL *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - tlist = *trianglelist; - talist = *triangleattriblist; - pointindex = 0; - attribindex = 0; -#else /* not TRILIBRARY */ - if (!quiet) { - printf("Writing %s.\n", elefilename); - } - outfile = fopen(elefilename, "w"); - if (outfile == (FILE *) NULL) { - printf(" Error: Cannot create file %s.\n", elefilename); - exit(1); - } - /* Number of triangles, points per triangle, attributes per triangle. */ - fprintf(outfile, "%ld %d %d\n", triangles.items, - (order + 1) * (order + 2) / 2, eextras); -#endif /* not TRILIBRARY */ - - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - triangleloop.orient = 0; - elementnumber = firstnumber; - while (triangleloop.tri != (triangle *) NULL) { - org(triangleloop, p1); - dest(triangleloop, p2); - apex(triangleloop, p3); - if (order == 1) { -#ifdef TRILIBRARY - tlist[pointindex++] = pointmark(p1); - tlist[pointindex++] = pointmark(p2); - tlist[pointindex++] = pointmark(p3); -#else /* not TRILIBRARY */ - /* Triangle number, indices for three points. */ - fprintf(outfile, "%4d %4d %4d %4d", elementnumber, - pointmark(p1), pointmark(p2), pointmark(p3)); -#endif /* not TRILIBRARY */ - } else { - mid1 = (point) triangleloop.tri[highorderindex + 1]; - mid2 = (point) triangleloop.tri[highorderindex + 2]; - mid3 = (point) triangleloop.tri[highorderindex]; -#ifdef TRILIBRARY - tlist[pointindex++] = pointmark(p1); - tlist[pointindex++] = pointmark(p2); - tlist[pointindex++] = pointmark(p3); - tlist[pointindex++] = pointmark(mid1); - tlist[pointindex++] = pointmark(mid2); - tlist[pointindex++] = pointmark(mid3); -#else /* not TRILIBRARY */ - /* Triangle number, indices for six points. */ - fprintf(outfile, "%4d %4d %4d %4d %4d %4d %4d", elementnumber, - pointmark(p1), pointmark(p2), pointmark(p3), pointmark(mid1), - pointmark(mid2), pointmark(mid3)); -#endif /* not TRILIBRARY */ - } - -#ifdef TRILIBRARY - for (i = 0; i < eextras; i++) { - talist[attribindex++] = elemattribute(triangleloop, i); - } -#else /* not TRILIBRARY */ - for (i = 0; i < eextras; i++) { - fprintf(outfile, " %.17g", elemattribute(triangleloop, i)); - } - fprintf(outfile, "\n"); -#endif /* not TRILIBRARY */ - - triangleloop.tri = triangletraverse(); - elementnumber++; - } - -#ifndef TRILIBRARY - finishfile(outfile, argc, argv); -#endif /* not TRILIBRARY */ -} - -/*****************************************************************************/ -/* */ -/* writepoly() Write the segments and holes to a .poly file. */ -/* */ -/*****************************************************************************/ - -#ifdef TRILIBRARY - -void writepoly(segmentlist, segmentmarkerlist) -int **segmentlist; -int **segmentmarkerlist; - -#else /* not TRILIBRARY */ - -void writepoly(polyfilename, holelist, holes, regionlist, regions, argc, argv) -char *polyfilename; -REAL *holelist; -int holes; -REAL *regionlist; -int regions; -int argc; -char **argv; - -#endif /* not TRILIBRARY */ - -{ -#ifdef TRILIBRARY - int *slist; - int *smlist; - int index; -#else /* not TRILIBRARY */ - FILE *outfile; - int i; -#endif /* not TRILIBRARY */ - struct edge shelleloop; - point endpoint1, endpoint2; - int shellenumber; - -#ifdef TRILIBRARY - if (!quiet) { - printf("Writing segments.\n"); - } - /* Allocate memory for output segments if necessary. */ - if (*segmentlist == (int *) NULL) { - *segmentlist = (int *) malloc(shelles.items * 2 * sizeof(int)); - if (*segmentlist == (int *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - /* Allocate memory for output segment markers if necessary. */ - if (!nobound && (*segmentmarkerlist == (int *) NULL)) { - *segmentmarkerlist = (int *) malloc(shelles.items * sizeof(int)); - if (*segmentmarkerlist == (int *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - slist = *segmentlist; - smlist = *segmentmarkerlist; - index = 0; -#else /* not TRILIBRARY */ - if (!quiet) { - printf("Writing %s.\n", polyfilename); - } - outfile = fopen(polyfilename, "w"); - if (outfile == (FILE *) NULL) { - printf(" Error: Cannot create file %s.\n", polyfilename); - exit(1); - } - /* The zero indicates that the points are in a separate .node file. */ - /* Followed by number of dimensions, number of point attributes, */ - /* and number of boundary markers (zero or one). */ - fprintf(outfile, "%d %d %d %d\n", 0, mesh_dim, nextras, 1 - nobound); - /* Number of segments, number of boundary markers (zero or one). */ - fprintf(outfile, "%ld %d\n", shelles.items, 1 - nobound); -#endif /* not TRILIBRARY */ - - traversalinit(&shelles); - shelleloop.sh = shelletraverse(); - shelleloop.shorient = 0; - shellenumber = firstnumber; - while (shelleloop.sh != (shelle *) NULL) { - sorg(shelleloop, endpoint1); - sdest(shelleloop, endpoint2); -#ifdef TRILIBRARY - /* Copy indices of the segment's two endpoints. */ - slist[index++] = pointmark(endpoint1); - slist[index++] = pointmark(endpoint2); - if (!nobound) { - /* Copy the boundary marker. */ - smlist[shellenumber - firstnumber] = mark(shelleloop); - } -#else /* not TRILIBRARY */ - /* Segment number, indices of its two endpoints, and possibly a marker. */ - if (nobound) { - fprintf(outfile, "%4d %4d %4d\n", shellenumber, - pointmark(endpoint1), pointmark(endpoint2)); - } else { - fprintf(outfile, "%4d %4d %4d %4d\n", shellenumber, - pointmark(endpoint1), pointmark(endpoint2), mark(shelleloop)); - } -#endif /* not TRILIBRARY */ - - shelleloop.sh = shelletraverse(); - shellenumber++; - } - -#ifndef TRILIBRARY -#ifndef CDT_ONLY - fprintf(outfile, "%d\n", holes); - if (holes > 0) { - for (i = 0; i < holes; i++) { - /* Hole number, x and y coordinates. */ - fprintf(outfile, "%4d %.17g %.17g\n", firstnumber + i, - holelist[2 * i], holelist[2 * i + 1]); - } - } - if (regions > 0) { - fprintf(outfile, "%d\n", regions); - for (i = 0; i < regions; i++) { - /* Region number, x and y coordinates, attribute, maximum area. */ - fprintf(outfile, "%4d %.17g %.17g %.17g %.17g\n", firstnumber + i, - regionlist[4 * i], regionlist[4 * i + 1], - regionlist[4 * i + 2], regionlist[4 * i + 3]); - } - } -#endif /* not CDT_ONLY */ - - finishfile(outfile, argc, argv); -#endif /* not TRILIBRARY */ -} - -/*****************************************************************************/ -/* */ -/* writeedges() Write the edges to a .edge file. */ -/* */ -/*****************************************************************************/ - -#ifdef TRILIBRARY - -void writeedges(edgelist, edgemarkerlist) -int **edgelist; -int **edgemarkerlist; - -#else /* not TRILIBRARY */ - -void writeedges(edgefilename, argc, argv) -char *edgefilename; -int argc; -char **argv; - -#endif /* not TRILIBRARY */ - -{ -#ifdef TRILIBRARY - int *elist; - int *emlist; - int index; -#else /* not TRILIBRARY */ - FILE *outfile; -#endif /* not TRILIBRARY */ - struct triedge triangleloop, trisym; - struct edge checkmark; - point p1, p2; - int edgenumber; - triangle ptr; /* Temporary variable used by sym(). */ - shelle sptr; /* Temporary variable used by tspivot(). */ - -#ifdef TRILIBRARY - if (!quiet) { - printf("Writing edges.\n"); - } - /* Allocate memory for edges if necessary. */ - if (*edgelist == (int *) NULL) { - *edgelist = (int *) malloc(edges * 2 * sizeof(int)); - if (*edgelist == (int *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - /* Allocate memory for edge markers if necessary. */ - if (!nobound && (*edgemarkerlist == (int *) NULL)) { - *edgemarkerlist = (int *) malloc(edges * sizeof(int)); - if (*edgemarkerlist == (int *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - elist = *edgelist; - emlist = *edgemarkerlist; - index = 0; -#else /* not TRILIBRARY */ - if (!quiet) { - printf("Writing %s.\n", edgefilename); - } - outfile = fopen(edgefilename, "w"); - if (outfile == (FILE *) NULL) { - printf(" Error: Cannot create file %s.\n", edgefilename); - exit(1); - } - /* Number of edges, number of boundary markers (zero or one). */ - fprintf(outfile, "%ld %d\n", edges, 1 - nobound); -#endif /* not TRILIBRARY */ - - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - edgenumber = firstnumber; - /* To loop over the set of edges, loop over all triangles, and look at */ - /* the three edges of each triangle. If there isn't another triangle */ - /* adjacent to the edge, operate on the edge. If there is another */ - /* adjacent triangle, operate on the edge only if the current triangle */ - /* has a smaller pointer than its neighbor. This way, each edge is */ - /* considered only once. */ - while (triangleloop.tri != (triangle *) NULL) { - for (triangleloop.orient = 0; triangleloop.orient < 3; - triangleloop.orient++) { - sym(triangleloop, trisym); - if ((triangleloop.tri < trisym.tri) || (trisym.tri == dummytri)) { - org(triangleloop, p1); - dest(triangleloop, p2); -#ifdef TRILIBRARY - elist[index++] = pointmark(p1); - elist[index++] = pointmark(p2); -#endif /* TRILIBRARY */ - if (nobound) { -#ifndef TRILIBRARY - /* Edge number, indices of two endpoints. */ - fprintf(outfile, "%4d %d %d\n", edgenumber, - pointmark(p1), pointmark(p2)); -#endif /* not TRILIBRARY */ - } else { - /* Edge number, indices of two endpoints, and a boundary marker. */ - /* If there's no shell edge, the boundary marker is zero. */ - if (useshelles) { - tspivot(triangleloop, checkmark); - if (checkmark.sh == dummysh) { -#ifdef TRILIBRARY - emlist[edgenumber - firstnumber] = 0; -#else /* not TRILIBRARY */ - fprintf(outfile, "%4d %d %d %d\n", edgenumber, - pointmark(p1), pointmark(p2), 0); -#endif /* not TRILIBRARY */ - } else { -#ifdef TRILIBRARY - emlist[edgenumber - firstnumber] = mark(checkmark); -#else /* not TRILIBRARY */ - fprintf(outfile, "%4d %d %d %d\n", edgenumber, - pointmark(p1), pointmark(p2), mark(checkmark)); -#endif /* not TRILIBRARY */ - } - } else { -#ifdef TRILIBRARY - emlist[edgenumber - firstnumber] = trisym.tri == dummytri; -#else /* not TRILIBRARY */ - fprintf(outfile, "%4d %d %d %d\n", edgenumber, - pointmark(p1), pointmark(p2), trisym.tri == dummytri); -#endif /* not TRILIBRARY */ - } - } - edgenumber++; - } - } - triangleloop.tri = triangletraverse(); - } - -#ifndef TRILIBRARY - finishfile(outfile, argc, argv); -#endif /* not TRILIBRARY */ -} - -/*****************************************************************************/ -/* */ -/* writevoronoi() Write the Voronoi diagram to a .v.node and .v.edge */ -/* file. */ -/* */ -/* The Voronoi diagram is the geometric dual of the Delaunay triangulation. */ -/* Hence, the Voronoi vertices are listed by traversing the Delaunay */ -/* triangles, and the Voronoi edges are listed by traversing the Delaunay */ -/* edges. */ -/* */ -/* WARNING: In order to assign numbers to the Voronoi vertices, this */ -/* procedure messes up the shell edges or the extra nodes of every */ -/* element. Hence, you should call this procedure last. */ -/* */ -/*****************************************************************************/ - -#ifdef TRILIBRARY - -void writevoronoi(vpointlist, vpointattriblist, vpointmarkerlist, vedgelist, - vedgemarkerlist, vnormlist) -REAL **vpointlist; -REAL **vpointattriblist; -int **vpointmarkerlist; -int **vedgelist; -int **vedgemarkerlist; -REAL **vnormlist; - -#else /* not TRILIBRARY */ - -void writevoronoi(vnodefilename, vedgefilename, argc, argv) -char *vnodefilename; -char *vedgefilename; -int argc; -char **argv; - -#endif /* not TRILIBRARY */ - -{ -#ifdef TRILIBRARY - REAL *plist; - REAL *palist; - int *elist; - REAL *normlist; - int coordindex; - int attribindex; -#else /* not TRILIBRARY */ - FILE *outfile; -#endif /* not TRILIBRARY */ - struct triedge triangleloop, trisym; - point torg, tdest, tapex; - REAL circumcenter[2]; - REAL xi, eta; - int vnodenumber, vedgenumber; - int p1, p2; - int i; - triangle ptr; /* Temporary variable used by sym(). */ - -#ifdef TRILIBRARY - if (!quiet) { - printf("Writing Voronoi vertices.\n"); - } - /* Allocate memory for Voronoi vertices if necessary. */ - if (*vpointlist == (REAL *) NULL) { - *vpointlist = (REAL *) malloc(triangles.items * 2 * sizeof(REAL)); - if (*vpointlist == (REAL *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - /* Allocate memory for Voronoi vertex attributes if necessary. */ - if (*vpointattriblist == (REAL *) NULL) { - *vpointattriblist = (REAL *) malloc(triangles.items * nextras * - sizeof(REAL)); - if (*vpointattriblist == (REAL *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - *vpointmarkerlist = (int *) NULL; - plist = *vpointlist; - palist = *vpointattriblist; - coordindex = 0; - attribindex = 0; -#else /* not TRILIBRARY */ - if (!quiet) { - printf("Writing %s.\n", vnodefilename); - } - outfile = fopen(vnodefilename, "w"); - if (outfile == (FILE *) NULL) { - printf(" Error: Cannot create file %s.\n", vnodefilename); - exit(1); - } - /* Number of triangles, two dimensions, number of point attributes, */ - /* zero markers. */ - fprintf(outfile, "%ld %d %d %d\n", triangles.items, 2, nextras, 0); -#endif /* not TRILIBRARY */ - - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - triangleloop.orient = 0; - vnodenumber = firstnumber; - while (triangleloop.tri != (triangle *) NULL) { - org(triangleloop, torg); - dest(triangleloop, tdest); - apex(triangleloop, tapex); - findcircumcenter(torg, tdest, tapex, circumcenter, &xi, &eta); -#ifdef TRILIBRARY - /* X and y coordinates. */ - plist[coordindex++] = circumcenter[0]; - plist[coordindex++] = circumcenter[1]; - for (i = 2; i < 2 + nextras; i++) { - /* Interpolate the point attributes at the circumcenter. */ - palist[attribindex++] = torg[i] + xi * (tdest[i] - torg[i]) - + eta * (tapex[i] - torg[i]); - } -#else /* not TRILIBRARY */ - /* Voronoi vertex number, x and y coordinates. */ - fprintf(outfile, "%4d %.17g %.17g", vnodenumber, circumcenter[0], - circumcenter[1]); - for (i = 2; i < 2 + nextras; i++) { - /* Interpolate the point attributes at the circumcenter. */ - fprintf(outfile, " %.17g", torg[i] + xi * (tdest[i] - torg[i]) - + eta * (tapex[i] - torg[i])); - } - fprintf(outfile, "\n"); -#endif /* not TRILIBRARY */ - - * (int *) (triangleloop.tri + 6) = vnodenumber; - triangleloop.tri = triangletraverse(); - vnodenumber++; - } - -#ifndef TRILIBRARY - finishfile(outfile, argc, argv); -#endif /* not TRILIBRARY */ - -#ifdef TRILIBRARY - if (!quiet) { - printf("Writing Voronoi edges.\n"); - } - /* Allocate memory for output Voronoi edges if necessary. */ - if (*vedgelist == (int *) NULL) { - *vedgelist = (int *) malloc(edges * 2 * sizeof(int)); - if (*vedgelist == (int *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - *vedgemarkerlist = (int *) NULL; - /* Allocate memory for output Voronoi norms if necessary. */ - if (*vnormlist == (REAL *) NULL) { - *vnormlist = (REAL *) malloc(edges * 2 * sizeof(REAL)); - if (*vnormlist == (REAL *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - elist = *vedgelist; - normlist = *vnormlist; - coordindex = 0; -#else /* not TRILIBRARY */ - if (!quiet) { - printf("Writing %s.\n", vedgefilename); - } - outfile = fopen(vedgefilename, "w"); - if (outfile == (FILE *) NULL) { - printf(" Error: Cannot create file %s.\n", vedgefilename); - exit(1); - } - /* Number of edges, zero boundary markers. */ - fprintf(outfile, "%ld %d\n", edges, 0); -#endif /* not TRILIBRARY */ - - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - vedgenumber = firstnumber; - /* To loop over the set of edges, loop over all triangles, and look at */ - /* the three edges of each triangle. If there isn't another triangle */ - /* adjacent to the edge, operate on the edge. If there is another */ - /* adjacent triangle, operate on the edge only if the current triangle */ - /* has a smaller pointer than its neighbor. This way, each edge is */ - /* considered only once. */ - while (triangleloop.tri != (triangle *) NULL) { - for (triangleloop.orient = 0; triangleloop.orient < 3; - triangleloop.orient++) { - sym(triangleloop, trisym); - if ((triangleloop.tri < trisym.tri) || (trisym.tri == dummytri)) { - /* Find the number of this triangle (and Voronoi vertex). */ - p1 = * (int *) (triangleloop.tri + 6); - if (trisym.tri == dummytri) { - org(triangleloop, torg); - dest(triangleloop, tdest); -#ifdef TRILIBRARY - /* Copy an infinite ray. Index of one endpoint, and -1. */ - elist[coordindex] = p1; - normlist[coordindex++] = tdest[1] - torg[1]; - elist[coordindex] = -1; - normlist[coordindex++] = torg[0] - tdest[0]; -#else /* not TRILIBRARY */ - /* Write an infinite ray. Edge number, index of one endpoint, -1, */ - /* and x and y coordinates of a vector representing the */ - /* direction of the ray. */ - fprintf(outfile, "%4d %d %d %.17g %.17g\n", vedgenumber, - p1, -1, tdest[1] - torg[1], torg[0] - tdest[0]); -#endif /* not TRILIBRARY */ - } else { - /* Find the number of the adjacent triangle (and Voronoi vertex). */ - p2 = * (int *) (trisym.tri + 6); - /* Finite edge. Write indices of two endpoints. */ -#ifdef TRILIBRARY - elist[coordindex] = p1; - normlist[coordindex++] = 0.0; - elist[coordindex] = p2; - normlist[coordindex++] = 0.0; -#else /* not TRILIBRARY */ - fprintf(outfile, "%4d %d %d\n", vedgenumber, p1, p2); -#endif /* not TRILIBRARY */ - } - vedgenumber++; - } - } - triangleloop.tri = triangletraverse(); - } - -#ifndef TRILIBRARY - finishfile(outfile, argc, argv); -#endif /* not TRILIBRARY */ -} - -#ifdef TRILIBRARY - -void writeneighbors(neighborlist) -int **neighborlist; - -#else /* not TRILIBRARY */ - -void writeneighbors(neighborfilename, argc, argv) -char *neighborfilename; -int argc; -char **argv; - -#endif /* not TRILIBRARY */ - -{ -#ifdef TRILIBRARY - int *nlist; - int index; -#else /* not TRILIBRARY */ - FILE *outfile; -#endif /* not TRILIBRARY */ - struct triedge triangleloop, trisym; - int elementnumber; - int neighbor1, neighbor2, neighbor3; - triangle ptr; /* Temporary variable used by sym(). */ - -#ifdef TRILIBRARY - if (!quiet) { - printf("Writing neighbors.\n"); - } - /* Allocate memory for neighbors if necessary. */ - if (*neighborlist == (int *) NULL) { - *neighborlist = (int *) malloc(triangles.items * 3 * sizeof(int)); - if (*neighborlist == (int *) NULL) { - printf("Error: Out of memory.\n"); - exit(1); - } - } - nlist = *neighborlist; - index = 0; -#else /* not TRILIBRARY */ - if (!quiet) { - printf("Writing %s.\n", neighborfilename); - } - outfile = fopen(neighborfilename, "w"); - if (outfile == (FILE *) NULL) { - printf(" Error: Cannot create file %s.\n", neighborfilename); - exit(1); - } - /* Number of triangles, three edges per triangle. */ - fprintf(outfile, "%ld %d\n", triangles.items, 3); -#endif /* not TRILIBRARY */ - - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - triangleloop.orient = 0; - elementnumber = firstnumber; - while (triangleloop.tri != (triangle *) NULL) { - * (int *) (triangleloop.tri + 6) = elementnumber; - triangleloop.tri = triangletraverse(); - elementnumber++; - } - * (int *) (dummytri + 6) = -1; - - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - elementnumber = firstnumber; - while (triangleloop.tri != (triangle *) NULL) { - triangleloop.orient = 1; - sym(triangleloop, trisym); - neighbor1 = * (int *) (trisym.tri + 6); - triangleloop.orient = 2; - sym(triangleloop, trisym); - neighbor2 = * (int *) (trisym.tri + 6); - triangleloop.orient = 0; - sym(triangleloop, trisym); - neighbor3 = * (int *) (trisym.tri + 6); -#ifdef TRILIBRARY - nlist[index++] = neighbor1; - nlist[index++] = neighbor2; - nlist[index++] = neighbor3; -#else /* not TRILIBRARY */ - /* Triangle number, neighboring triangle numbers. */ - fprintf(outfile, "%4d %d %d %d\n", elementnumber, - neighbor1, neighbor2, neighbor3); -#endif /* not TRILIBRARY */ - - triangleloop.tri = triangletraverse(); - elementnumber++; - } - -#ifndef TRILIBRARY - finishfile(outfile, argc, argv); -#endif /* TRILIBRARY */ -} - -/*****************************************************************************/ -/* */ -/* writeoff() Write the triangulation to an .off file. */ -/* */ -/* OFF stands for the Object File Format, a format used by the Geometry */ -/* Center's Geomview package. */ -/* */ -/*****************************************************************************/ - -#ifndef TRILIBRARY - -void writeoff(offfilename, argc, argv) -char *offfilename; -int argc; -char **argv; -{ - FILE *outfile; - struct triedge triangleloop; - point pointloop; - point p1, p2, p3; - - if (!quiet) { - printf("Writing %s.\n", offfilename); - } - outfile = fopen(offfilename, "w"); - if (outfile == (FILE *) NULL) { - printf(" Error: Cannot create file %s.\n", offfilename); - exit(1); - } - /* Number of points, triangles, and edges. */ - fprintf(outfile, "OFF\n%ld %ld %ld\n", points.items, triangles.items, - edges); - - /* Write the points. */ - traversalinit(&points); - pointloop = pointtraverse(); - while (pointloop != (point) NULL) { - /* The "0.0" is here because the OFF format uses 3D coordinates. */ - fprintf(outfile, " %.17g %.17g %.17g\n", pointloop[0], - pointloop[1], 0.0); - pointloop = pointtraverse(); - } - - /* Write the triangles. */ - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - triangleloop.orient = 0; - while (triangleloop.tri != (triangle *) NULL) { - org(triangleloop, p1); - dest(triangleloop, p2); - apex(triangleloop, p3); - /* The "3" means a three-vertex polygon. */ - fprintf(outfile, " 3 %4d %4d %4d\n", pointmark(p1) - 1, - pointmark(p2) - 1, pointmark(p3) - 1); - triangleloop.tri = triangletraverse(); - } - finishfile(outfile, argc, argv); -} - -#endif /* not TRILIBRARY */ - -/** **/ -/** **/ -/********* File I/O routines end here *********/ - -/*****************************************************************************/ -/* */ -/* quality_statistics() Print statistics about the quality of the mesh. */ -/* */ -/*****************************************************************************/ - -void quality_statistics() -{ - struct triedge triangleloop; - point p[3]; - REAL cossquaretable[8]; - REAL ratiotable[16]; - REAL dx[3], dy[3]; - REAL edgelength[3]; - REAL dotproduct; - REAL cossquare; - REAL triarea; - REAL shortest, longest; - REAL trilongest2; - REAL smallestarea, biggestarea; - REAL triminaltitude2; - REAL minaltitude; - REAL triaspect2; - REAL worstaspect; - REAL smallestangle, biggestangle; - REAL radconst, degconst; - int angletable[18]; - int aspecttable[16]; - int aspectindex; - int tendegree; - int acutebiggest; - int i, ii, j, k; - - printf("Mesh quality statistics:\n\n"); - radconst = PI / 18.0; - degconst = 180.0 / PI; - for (i = 0; i < 8; i++) { - cossquaretable[i] = cos(radconst * (REAL) (i + 1)); - cossquaretable[i] = cossquaretable[i] * cossquaretable[i]; - } - for (i = 0; i < 18; i++) { - angletable[i] = 0; - } - - ratiotable[0] = 1.5; ratiotable[1] = 2.0; - ratiotable[2] = 2.5; ratiotable[3] = 3.0; - ratiotable[4] = 4.0; ratiotable[5] = 6.0; - ratiotable[6] = 10.0; ratiotable[7] = 15.0; - ratiotable[8] = 25.0; ratiotable[9] = 50.0; - ratiotable[10] = 100.0; ratiotable[11] = 300.0; - ratiotable[12] = 1000.0; ratiotable[13] = 10000.0; - ratiotable[14] = 100000.0; ratiotable[15] = 0.0; - for (i = 0; i < 16; i++) { - aspecttable[i] = 0; - } - - worstaspect = 0.0; - minaltitude = xmax - xmin + ymax - ymin; - minaltitude = minaltitude * minaltitude; - shortest = minaltitude; - longest = 0.0; - smallestarea = minaltitude; - biggestarea = 0.0; - worstaspect = 0.0; - smallestangle = 0.0; - biggestangle = 2.0; - acutebiggest = 1; - - traversalinit(&triangles); - triangleloop.tri = triangletraverse(); - triangleloop.orient = 0; - while (triangleloop.tri != (triangle *) NULL) { - org(triangleloop, p[0]); - dest(triangleloop, p[1]); - apex(triangleloop, p[2]); - trilongest2 = 0.0; - - for (i = 0; i < 3; i++) { - j = plus1mod3[i]; - k = minus1mod3[i]; - dx[i] = p[j][0] - p[k][0]; - dy[i] = p[j][1] - p[k][1]; - edgelength[i] = dx[i] * dx[i] + dy[i] * dy[i]; - if (edgelength[i] > trilongest2) { - trilongest2 = edgelength[i]; - } - if (edgelength[i] > longest) { - longest = edgelength[i]; - } - if (edgelength[i] < shortest) { - shortest = edgelength[i]; - } - } - - triarea = counterclockwise(p[0], p[1], p[2]); - if (triarea < smallestarea) { - smallestarea = triarea; - } - if (triarea > biggestarea) { - biggestarea = triarea; - } - triminaltitude2 = triarea * triarea / trilongest2; - if (triminaltitude2 < minaltitude) { - minaltitude = triminaltitude2; - } - triaspect2 = trilongest2 / triminaltitude2; - if (triaspect2 > worstaspect) { - worstaspect = triaspect2; - } - aspectindex = 0; - while ((triaspect2 > ratiotable[aspectindex] * ratiotable[aspectindex]) - && (aspectindex < 15)) { - aspectindex++; - } - aspecttable[aspectindex]++; - - for (i = 0; i < 3; i++) { - j = plus1mod3[i]; - k = minus1mod3[i]; - dotproduct = dx[j] * dx[k] + dy[j] * dy[k]; - cossquare = dotproduct * dotproduct / (edgelength[j] * edgelength[k]); - tendegree = 8; - for (ii = 7; ii >= 0; ii--) { - if (cossquare > cossquaretable[ii]) { - tendegree = ii; - } - } - if (dotproduct <= 0.0) { - angletable[tendegree]++; - if (cossquare > smallestangle) { - smallestangle = cossquare; - } - if (acutebiggest && (cossquare < biggestangle)) { - biggestangle = cossquare; - } - } else { - angletable[17 - tendegree]++; - if (acutebiggest || (cossquare > biggestangle)) { - biggestangle = cossquare; - acutebiggest = 0; - } - } - } - triangleloop.tri = triangletraverse(); - } - - shortest = sqrt(shortest); - longest = sqrt(longest); - minaltitude = sqrt(minaltitude); - worstaspect = sqrt(worstaspect); - smallestarea *= 2.0; - biggestarea *= 2.0; - if (smallestangle >= 1.0) { - smallestangle = 0.0; - } else { - smallestangle = degconst * acos(sqrt(smallestangle)); - } - if (biggestangle >= 1.0) { - biggestangle = 180.0; - } else { - if (acutebiggest) { - biggestangle = degconst * acos(sqrt(biggestangle)); - } else { - biggestangle = 180.0 - degconst * acos(sqrt(biggestangle)); - } - } - - printf(" Smallest area: %16.5g | Largest area: %16.5g\n", - smallestarea, biggestarea); - printf(" Shortest edge: %16.5g | Longest edge: %16.5g\n", - shortest, longest); - printf(" Shortest altitude: %12.5g | Largest aspect ratio: %8.5g\n\n", - minaltitude, worstaspect); - printf(" Aspect ratio histogram:\n"); - printf(" 1.1547 - %-6.6g : %8d | %6.6g - %-6.6g : %8d\n", - ratiotable[0], aspecttable[0], ratiotable[7], ratiotable[8], - aspecttable[8]); - for (i = 1; i < 7; i++) { - printf(" %6.6g - %-6.6g : %8d | %6.6g - %-6.6g : %8d\n", - ratiotable[i - 1], ratiotable[i], aspecttable[i], - ratiotable[i + 7], ratiotable[i + 8], aspecttable[i + 8]); - } - printf(" %6.6g - %-6.6g : %8d | %6.6g - : %8d\n", - ratiotable[6], ratiotable[7], aspecttable[7], ratiotable[14], - aspecttable[15]); - printf( -" (Triangle aspect ratio is longest edge divided by shortest altitude)\n\n"); - printf(" Smallest angle: %15.5g | Largest angle: %15.5g\n\n", - smallestangle, biggestangle); - printf(" Angle histogram:\n"); - for (i = 0; i < 9; i++) { - printf(" %3d - %3d degrees: %8d | %3d - %3d degrees: %8d\n", - i * 10, i * 10 + 10, angletable[i], - i * 10 + 90, i * 10 + 100, angletable[i + 9]); - } - printf("\n"); -} - -/*****************************************************************************/ -/* */ -/* statistics() Print all sorts of cool facts. */ -/* */ -/*****************************************************************************/ - -void statistics() -{ - printf("\nStatistics:\n\n"); - printf(" Input points: %d\n", inpoints); - if (refine) { - printf(" Input triangles: %d\n", inelements); - } - if (poly) { - printf(" Input segments: %d\n", insegments); - if (!refine) { - printf(" Input holes: %d\n", holes); - } - } - - printf("\n Mesh points: %ld\n", points.items); - printf(" Mesh triangles: %ld\n", triangles.items); - printf(" Mesh edges: %ld\n", edges); - if (poly || refine) { - printf(" Mesh boundary edges: %ld\n", hullsize); - printf(" Mesh segments: %ld\n\n", shelles.items); - } else { - printf(" Mesh convex hull edges: %ld\n\n", hullsize); - } - if (verbose) { - quality_statistics(); - printf("Memory allocation statistics:\n\n"); - printf(" Maximum number of points: %ld\n", points.maxitems); - printf(" Maximum number of triangles: %ld\n", triangles.maxitems); - if (shelles.maxitems > 0) { - printf(" Maximum number of segments: %ld\n", shelles.maxitems); - } - if (viri.maxitems > 0) { - printf(" Maximum number of viri: %ld\n", viri.maxitems); - } - if (badsegments.maxitems > 0) { - printf(" Maximum number of encroached segments: %ld\n", - badsegments.maxitems); - } - if (badtriangles.maxitems > 0) { - printf(" Maximum number of bad triangles: %ld\n", - badtriangles.maxitems); - } - if (splaynodes.maxitems > 0) { - printf(" Maximum number of splay tree nodes: %ld\n", - splaynodes.maxitems); - } - printf(" Approximate heap memory use (bytes): %ld\n\n", - points.maxitems * points.itembytes - + triangles.maxitems * triangles.itembytes - + shelles.maxitems * shelles.itembytes - + viri.maxitems * viri.itembytes - + badsegments.maxitems * badsegments.itembytes - + badtriangles.maxitems * badtriangles.itembytes - + splaynodes.maxitems * splaynodes.itembytes); - - printf("Algorithmic statistics:\n\n"); - printf(" Number of incircle tests: %ld\n", incirclecount); - printf(" Number of orientation tests: %ld\n", counterclockcount); - if (hyperbolacount > 0) { - printf(" Number of right-of-hyperbola tests: %ld\n", - hyperbolacount); - } - if (circumcentercount > 0) { - printf(" Number of circumcenter computations: %ld\n", - circumcentercount); - } - if (circletopcount > 0) { - printf(" Number of circle top computations: %ld\n", - circletopcount); - } - printf("\n"); - } -} - -/*****************************************************************************/ -/* */ -/* main() or triangulate() Gosh, do everything. */ -/* */ -/* The sequence is roughly as follows. Many of these steps can be skipped, */ -/* depending on the command line switches. */ -/* */ -/* - Initialize constants and parse the command line. */ -/* - Read the points from a file and either */ -/* - triangulate them (no -r), or */ -/* - read an old mesh from files and reconstruct it (-r). */ -/* - Insert the PSLG segments (-p), and possibly segments on the convex */ -/* hull (-c). */ -/* - Read the holes (-p), regional attributes (-pA), and regional area */ -/* constraints (-pa). Carve the holes and concavities, and spread the */ -/* regional attributes and area constraints. */ -/* - Enforce the constraints on minimum angle (-q) and maximum area (-a). */ -/* Also enforce the conforming Delaunay property (-q and -a). */ -/* - Compute the number of edges in the resulting mesh. */ -/* - Promote the mesh's linear triangles to higher order elements (-o). */ -/* - Write the output files and print the statistics. */ -/* - Check the consistency and Delaunay property of the mesh (-C). */ -/* */ -/*****************************************************************************/ - -#ifdef TRILIBRARY - -void triangulate(triswitches, in, out, vorout) -char *triswitches; -struct triangulateio *in; -struct triangulateio *out; -struct triangulateio *vorout; - -#else /* not TRILIBRARY */ - -int main(argc, argv) -int argc; -char **argv; - -#endif /* not TRILIBRARY */ - -{ - REAL *holearray; /* Array of holes. */ - REAL *regionarray; /* Array of regional attributes and area constraints. */ -#ifndef TRILIBRARY - FILE *polyfile; -#endif /* not TRILIBRARY */ -#ifndef NO_TIMER - /* Variables for timing the performance of Triangle. The types are */ - /* defined in sys/time.h. */ - struct timeval tv0, tv1, tv2, tv3, tv4, tv5, tv6; - struct timezone tz; -#endif /* NO_TIMER */ - -#ifndef NO_TIMER - gettimeofday(&tv0, &tz); -#endif /* NO_TIMER */ - - triangleinit(); -#ifdef TRILIBRARY - parsecommandline(1, &triswitches); -#else /* not TRILIBRARY */ - parsecommandline(argc, argv); -#endif /* not TRILIBRARY */ - -#ifdef TRILIBRARY - transfernodes(in->pointlist, in->pointattributelist, in->pointmarkerlist, - in->numberofpoints, in->numberofpointattributes); -#else /* not TRILIBRARY */ - readnodes(innodefilename, inpolyfilename, &polyfile); -#endif /* not TRILIBRARY */ - -#ifndef NO_TIMER - if (!quiet) { - gettimeofday(&tv1, &tz); - } -#endif /* NO_TIMER */ - -#ifdef CDT_ONLY - hullsize = delaunay(); /* Triangulate the points. */ -#else /* not CDT_ONLY */ - if (refine) { - /* Read and reconstruct a mesh. */ -#ifdef TRILIBRARY - hullsize = reconstruct(in->trianglelist, in->triangleattributelist, - in->trianglearealist, in->numberoftriangles, - in->numberofcorners, in->numberoftriangleattributes, - in->segmentlist, in->segmentmarkerlist, - in->numberofsegments); -#else /* not TRILIBRARY */ - hullsize = reconstruct(inelefilename, areafilename, inpolyfilename, - polyfile); -#endif /* not TRILIBRARY */ - } else { - hullsize = delaunay(); /* Triangulate the points. */ - } -#endif /* not CDT_ONLY */ - -#ifndef NO_TIMER - if (!quiet) { - gettimeofday(&tv2, &tz); - if (refine) { - printf("Mesh reconstruction"); - } else { - printf("Delaunay"); - } - printf(" milliseconds: %ld\n", 1000l * (tv2.tv_sec - tv1.tv_sec) - + (tv2.tv_usec - tv1.tv_usec) / 1000l); - } -#endif /* NO_TIMER */ - - /* Ensure that no point can be mistaken for a triangular bounding */ - /* box point in insertsite(). */ - infpoint1 = (point) NULL; - infpoint2 = (point) NULL; - infpoint3 = (point) NULL; - - if (useshelles) { - checksegments = 1; /* Segments will be introduced next. */ - if (!refine) { - /* Insert PSLG segments and/or convex hull segments. */ -#ifdef TRILIBRARY - insegments = formskeleton(in->segmentlist, in->segmentmarkerlist, - in->numberofsegments); -#else /* not TRILIBRARY */ - insegments = formskeleton(polyfile, inpolyfilename); -#endif /* not TRILIBRARY */ - } - } - -#ifndef NO_TIMER - if (!quiet) { - gettimeofday(&tv3, &tz); - if (useshelles && !refine) { - printf("Segment milliseconds: %ld\n", - 1000l * (tv3.tv_sec - tv2.tv_sec) - + (tv3.tv_usec - tv2.tv_usec) / 1000l); - } - } -#endif /* NO_TIMER */ - - if (poly) { -#ifdef TRILIBRARY - holearray = in->holelist; - holes = in->numberofholes; - regionarray = in->regionlist; - regions = in->numberofregions; -#else /* not TRILIBRARY */ - readholes(polyfile, inpolyfilename, &holearray, &holes, - ®ionarray, ®ions); -#endif /* not TRILIBRARY */ - if (!refine) { - /* Carve out holes and concavities. */ - carveholes(holearray, holes, regionarray, regions); - } - } else { - /* Without a PSLG, there can be no holes or regional attributes */ - /* or area constraints. The following are set to zero to avoid */ - /* an accidental free() later. */ - holes = 0; - regions = 0; - } - -#ifndef NO_TIMER - if (!quiet) { - gettimeofday(&tv4, &tz); - if (poly && !refine) { - printf("Hole milliseconds: %ld\n", 1000l * (tv4.tv_sec - tv3.tv_sec) - + (tv4.tv_usec - tv3.tv_usec) / 1000l); - } - } -#endif /* NO_TIMER */ - -#ifndef CDT_ONLY - if (quality) { - enforcequality(); /* Enforce angle and area constraints. */ - } -#endif /* not CDT_ONLY */ - -#ifndef NO_TIMER - if (!quiet) { - gettimeofday(&tv5, &tz); -#ifndef CDT_ONLY - if (quality) { - printf("Quality milliseconds: %ld\n", - 1000l * (tv5.tv_sec - tv4.tv_sec) - + (tv5.tv_usec - tv4.tv_usec) / 1000l); - } -#endif /* not CDT_ONLY */ - } -#endif /* NO_TIMER */ - - /* Compute the number of edges. */ - edges = (3l * triangles.items + hullsize) / 2l; - - if (order > 1) { - highorder(); /* Promote elements to higher polynomial order. */ - } - if (!quiet) { - printf("\n"); - } - -#ifdef TRILIBRARY - out->numberofpoints = points.items; - out->numberofpointattributes = nextras; - out->numberoftriangles = triangles.items; - out->numberofcorners = (order + 1) * (order + 2) / 2; - out->numberoftriangleattributes = eextras; - out->numberofedges = edges; - if (useshelles) { - out->numberofsegments = shelles.items; - } else { - out->numberofsegments = hullsize; - } - if (vorout != (struct triangulateio *) NULL) { - vorout->numberofpoints = triangles.items; - vorout->numberofpointattributes = nextras; - vorout->numberofedges = edges; - } -#endif /* TRILIBRARY */ - /* If not using iteration numbers, don't write a .node file if one was */ - /* read, because the original one would be overwritten! */ - if (nonodewritten || (noiterationnum && readnodefile)) { - if (!quiet) { -#ifdef TRILIBRARY - printf("NOT writing points.\n"); -#else /* not TRILIBRARY */ - printf("NOT writing a .node file.\n"); -#endif /* not TRILIBRARY */ - } - numbernodes(); /* We must remember to number the points. */ - } else { -#ifdef TRILIBRARY - writenodes(&out->pointlist, &out->pointattributelist, - &out->pointmarkerlist); -#else /* not TRILIBRARY */ - writenodes(outnodefilename, argc, argv); /* Numbers the points too. */ -#endif /* TRILIBRARY */ - } - if (noelewritten) { - if (!quiet) { -#ifdef TRILIBRARY - printf("NOT writing triangles.\n"); -#else /* not TRILIBRARY */ - printf("NOT writing an .ele file.\n"); -#endif /* not TRILIBRARY */ - } - } else { -#ifdef TRILIBRARY - writeelements(&out->trianglelist, &out->triangleattributelist); -#else /* not TRILIBRARY */ - writeelements(outelefilename, argc, argv); -#endif /* not TRILIBRARY */ - } - /* The -c switch (convex switch) causes a PSLG to be written */ - /* even if none was read. */ - if (poly || convex) { - /* If not using iteration numbers, don't overwrite the .poly file. */ - if (nopolywritten || noiterationnum) { - if (!quiet) { -#ifdef TRILIBRARY - printf("NOT writing segments.\n"); -#else /* not TRILIBRARY */ - printf("NOT writing a .poly file.\n"); -#endif /* not TRILIBRARY */ - } - } else { -#ifdef TRILIBRARY - writepoly(&out->segmentlist, &out->segmentmarkerlist); - out->numberofholes = holes; - out->numberofregions = regions; - if (poly) { - out->holelist = in->holelist; - out->regionlist = in->regionlist; - } else { - out->holelist = (REAL *) NULL; - out->regionlist = (REAL *) NULL; - } -#else /* not TRILIBRARY */ - writepoly(outpolyfilename, holearray, holes, regionarray, regions, - argc, argv); -#endif /* not TRILIBRARY */ - } - } -#ifndef TRILIBRARY -#ifndef CDT_ONLY - if (regions > 0) { - free(regionarray); - } -#endif /* not CDT_ONLY */ - if (holes > 0) { - free(holearray); - } - if (geomview) { - writeoff(offfilename, argc, argv); - } -#endif /* not TRILIBRARY */ - if (edgesout) { -#ifdef TRILIBRARY - writeedges(&out->edgelist, &out->edgemarkerlist); -#else /* not TRILIBRARY */ - writeedges(edgefilename, argc, argv); -#endif /* not TRILIBRARY */ - } - if (voronoi) { -#ifdef TRILIBRARY - writevoronoi(&vorout->pointlist, &vorout->pointattributelist, - &vorout->pointmarkerlist, &vorout->edgelist, - &vorout->edgemarkerlist, &vorout->normlist); -#else /* not TRILIBRARY */ - writevoronoi(vnodefilename, vedgefilename, argc, argv); -#endif /* not TRILIBRARY */ - } - if (neighbors) { -#ifdef TRILIBRARY - writeneighbors(&out->neighborlist); -#else /* not TRILIBRARY */ - writeneighbors(neighborfilename, argc, argv); -#endif /* not TRILIBRARY */ - } - - if (!quiet) { -#ifndef NO_TIMER - gettimeofday(&tv6, &tz); - printf("\nOutput milliseconds: %ld\n", - 1000l * (tv6.tv_sec - tv5.tv_sec) - + (tv6.tv_usec - tv5.tv_usec) / 1000l); - printf("Total running milliseconds: %ld\n", - 1000l * (tv6.tv_sec - tv0.tv_sec) - + (tv6.tv_usec - tv0.tv_usec) / 1000l); -#endif /* NO_TIMER */ - - statistics(); - } - -#ifndef REDUCED - if (docheck) { - checkmesh(); - checkdelaunay(); - } -#endif /* not REDUCED */ - - triangledeinit(); -#ifndef TRILIBRARY - return 0; -#endif /* not TRILIBRARY */ -} diff --git a/Tools/Lib/Triangle/triangle.doc b/Tools/Lib/Triangle/triangle.doc deleted file mode 100644 index 28b633978..000000000 --- a/Tools/Lib/Triangle/triangle.doc +++ /dev/null @@ -1,817 +0,0 @@ -Triangle -A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator. -Version 1.3 - -Copyright 1996 Jonathan Richard Shewchuk (bugs/comments to jrs@cs.cmu.edu) -School of Computer Science / Carnegie Mellon University -5000 Forbes Avenue / Pittsburgh, Pennsylvania 15213-3891 -Created as part of the Archimedes project (tools for parallel FEM). -Supported in part by NSF Grant CMS-9318163 and an NSERC 1967 Scholarship. -There is no warranty whatsoever. Use at your own risk. -This executable is compiled for double precision arithmetic. - - -Triangle generates exact Delaunay triangulations, constrained Delaunay -triangulations, and quality conforming Delaunay triangulations. The latter -can be generated with no small angles, and are thus suitable for finite -element analysis. If no command line switches are specified, your .node -input file will be read, and the Delaunay triangulation will be returned in -.node and .ele output files. The command syntax is: - -triangle [-prq__a__AcevngBPNEIOXzo_YS__iFlsCQVh] input_file - -Underscores indicate that numbers may optionally follow certain switches; -do not leave any space between a switch and its numeric parameter. -input_file must be a file with extension .node, or extension .poly if the --p switch is used. If -r is used, you must supply .node and .ele files, -and possibly a .poly file and .area file as well. The formats of these -files are described below. - -Command Line Switches: - - -p Reads a Planar Straight Line Graph (.poly file), which can specify - points, segments, holes, and regional attributes and area - constraints. Will generate a constrained Delaunay triangulation - fitting the input; or, if -s, -q, or -a is used, a conforming - Delaunay triangulation. If -p is not used, Triangle reads a .node - file by default. - -r Refines a previously generated mesh. The mesh is read from a .node - file and an .ele file. If -p is also used, a .poly file is read - and used to constrain edges in the mesh. Further details on - refinement are given below. - -q Quality mesh generation by Jim Ruppert's Delaunay refinement - algorithm. Adds points to the mesh to ensure that no angles - smaller than 20 degrees occur. An alternative minimum angle may be - specified after the `q'. If the minimum angle is 20.7 degrees or - smaller, the triangulation algorithm is theoretically guaranteed to - terminate (assuming infinite precision arithmetic - Triangle may - fail to terminate if you run out of precision). In practice, the - algorithm often succeeds for minimum angles up to 33.8 degrees. - For highly refined meshes, however, it may be necessary to reduce - the minimum angle to well below 20 to avoid problems associated - with insufficient floating-point precision. The specified angle - may include a decimal point. - -a Imposes a maximum triangle area. If a number follows the `a', no - triangle will be generated whose area is larger than that number. - If no number is specified, an .area file (if -r is used) or .poly - file (if -r is not used) specifies a number of maximum area - constraints. An .area file contains a separate area constraint for - each triangle, and is useful for refining a finite element mesh - based on a posteriori error estimates. A .poly file can optionally - contain an area constraint for each segment-bounded region, thereby - enforcing triangle densities in a first triangulation. You can - impose both a fixed area constraint and a varying area constraint - by invoking the -a switch twice, once with and once without a - number following. Each area specified may include a decimal point. - -A Assigns an additional attribute to each triangle that identifies - what segment-bounded region each triangle belongs to. Attributes - are assigned to regions by the .poly file. If a region is not - explicitly marked by the .poly file, triangles in that region are - assigned an attribute of zero. The -A switch has an effect only - when the -p switch is used and the -r switch is not. - -c Creates segments on the convex hull of the triangulation. If you - are triangulating a point set, this switch causes a .poly file to - be written, containing all edges in the convex hull. (By default, - a .poly file is written only if a .poly file is read.) If you are - triangulating a PSLG, this switch specifies that the interior of - the convex hull of the PSLG should be triangulated. If you do not - use this switch when triangulating a PSLG, it is assumed that you - have identified the region to be triangulated by surrounding it - with segments of the input PSLG. Beware: if you are not careful, - this switch can cause the introduction of an extremely thin angle - between a PSLG segment and a convex hull segment, which can cause - overrefinement or failure if Triangle runs out of precision. If - you are refining a mesh, the -c switch works differently; it - generates the set of boundary edges of the mesh, rather than the - convex hull. - -e Outputs (to an .edge file) a list of edges of the triangulation. - -v Outputs the Voronoi diagram associated with the triangulation. - Does not attempt to detect degeneracies. - -n Outputs (to a .neigh file) a list of triangles neighboring each - triangle. - -g Outputs the mesh to an Object File Format (.off) file, suitable for - viewing with the Geometry Center's Geomview package. - -B No boundary markers in the output .node, .poly, and .edge output - files. See the detailed discussion of boundary markers below. - -P No output .poly file. Saves disk space, but you lose the ability - to impose segment constraints on later refinements of the mesh. - -N No output .node file. - -E No output .ele file. - -I No iteration numbers. Suppresses the output of .node and .poly - files, so your input files won't be overwritten. (If your input is - a .poly file only, a .node file will be written.) Cannot be used - with the -r switch, because that would overwrite your input .ele - file. Shouldn't be used with the -s, -q, or -a switch if you are - using a .node file for input, because no .node file will be - written, so there will be no record of any added points. - -O No holes. Ignores the holes in the .poly file. - -X No exact arithmetic. Normally, Triangle uses exact floating-point - arithmetic for certain tests if it thinks the inexact tests are not - accurate enough. Exact arithmetic ensures the robustness of the - triangulation algorithms, despite floating-point roundoff error. - Disabling exact arithmetic with the -X switch will cause a small - improvement in speed and create the possibility (albeit small) that - Triangle will fail to produce a valid mesh. Not recommended. - -z Numbers all items starting from zero (rather than one). Note that - this switch is normally overrided by the value used to number the - first point of the input .node or .poly file. However, this switch - is useful when calling Triangle from another program. - -o2 Generates second-order subparametric elements with six nodes each. - -Y No new points on the boundary. This switch is useful when the mesh - boundary must be preserved so that it conforms to some adjacent - mesh. Be forewarned that you will probably sacrifice some of the - quality of the mesh; Triangle will try, but the resulting mesh may - contain triangles of poor aspect ratio. Works well if all the - boundary points are closely spaced. Specify this switch twice - (`-YY') to prevent all segment splitting, including internal - boundaries. - -S Specifies the maximum number of Steiner points (points that are not - in the input, but are added to meet the constraints of minimum - angle and maximum area). The default is to allow an unlimited - number. If you specify this switch with no number after it, - the limit is set to zero. Triangle always adds points at segment - intersections, even if it needs to use more points than the limit - you set. When Triangle inserts segments by splitting (-s), it - always adds enough points to ensure that all the segments appear in - the triangulation, again ignoring the limit. Be forewarned that - the -S switch may result in a conforming triangulation that is not - truly Delaunay, because Triangle may be forced to stop adding - points when the mesh is in a state where a segment is non-Delaunay - and needs to be split. If so, Triangle will print a warning. - -i Uses an incremental rather than divide-and-conquer algorithm to - form a Delaunay triangulation. Try it if the divide-and-conquer - algorithm fails. - -F Uses Steven Fortune's sweepline algorithm to form a Delaunay - triangulation. Warning: does not use exact arithmetic for all - calculations. An exact result is not guaranteed. - -l Uses only vertical cuts in the divide-and-conquer algorithm. By - default, Triangle uses alternating vertical and horizontal cuts, - which usually improve the speed except with point sets that are - small or short and wide. This switch is primarily of theoretical - interest. - -s Specifies that segments should be forced into the triangulation by - recursively splitting them at their midpoints, rather than by - generating a constrained Delaunay triangulation. Segment splitting - is true to Ruppert's original algorithm, but can create needlessly - small triangles near external small features. - -C Check the consistency of the final mesh. Uses exact arithmetic for - checking, even if the -X switch is used. Useful if you suspect - Triangle is buggy. - -Q Quiet: Suppresses all explanation of what Triangle is doing, unless - an error occurs. - -V Verbose: Gives detailed information about what Triangle is doing. - Add more `V's for increasing amount of detail. `-V' gives - information on algorithmic progress and more detailed statistics. - `-VV' gives point-by-point details, and will print so much that - Triangle will run much more slowly. `-VVV' gives information only - a debugger could love. - -h Help: Displays these instructions. - -Definitions: - - A Delaunay triangulation of a point set is a triangulation whose vertices - are the point set, having the property that no point in the point set - falls in the interior of the circumcircle (circle that passes through all - three vertices) of any triangle in the triangulation. - - A Voronoi diagram of a point set is a subdivision of the plane into - polygonal regions (some of which may be infinite), where each region is - the set of points in the plane that are closer to some input point than - to any other input point. (The Voronoi diagram is the geometric dual of - the Delaunay triangulation.) - - A Planar Straight Line Graph (PSLG) is a collection of points and - segments. Segments are simply edges, whose endpoints are points in the - PSLG. The file format for PSLGs (.poly files) is described below. - - A constrained Delaunay triangulation of a PSLG is similar to a Delaunay - triangulation, but each PSLG segment is present as a single edge in the - triangulation. (A constrained Delaunay triangulation is not truly a - Delaunay triangulation.) - - A conforming Delaunay triangulation of a PSLG is a true Delaunay - triangulation in which each PSLG segment may have been subdivided into - several edges by the insertion of additional points. These inserted - points are necessary to allow the segments to exist in the mesh while - maintaining the Delaunay property. - -File Formats: - - All files may contain comments prefixed by the character '#'. Points, - triangles, edges, holes, and maximum area constraints must be numbered - consecutively, starting from either 1 or 0. Whichever you choose, all - input files must be consistent; if the nodes are numbered from 1, so must - be all other objects. Triangle automatically detects your choice while - reading the .node (or .poly) file. (When calling Triangle from another - program, use the -z switch if you wish to number objects from zero.) - Examples of these file formats are given below. - - .node files: - First line: <# of points> <# of attributes> - <# of boundary markers (0 or 1)> - Remaining lines: [attributes] [boundary marker] - - The attributes, which are typically floating-point values of physical - quantities (such as mass or conductivity) associated with the nodes of - a finite element mesh, are copied unchanged to the output mesh. If -s, - -q, or -a is selected, each new Steiner point added to the mesh will - have attributes assigned to it by linear interpolation. - - If the fourth entry of the first line is `1', the last column of the - remainder of the file is assumed to contain boundary markers. Boundary - markers are used to identify boundary points and points resting on PSLG - segments; a complete description appears in a section below. The .node - file produced by Triangle will contain boundary markers in the last - column unless they are suppressed by the -B switch. - - .ele files: - First line: <# of triangles> <# of attributes> - Remaining lines: ... [attributes] - - Points are indices into the corresponding .node file. The first three - points are the corners, and are listed in counterclockwise order around - each triangle. (The remaining points, if any, depend on the type of - finite element used.) The attributes are just like those of .node - files. Because there is no simple mapping from input to output - triangles, an attempt is made to interpolate attributes, which may - result in a good deal of diffusion of attributes among nearby triangles - as the triangulation is refined. Diffusion does not occur across - segments, so attributes used to identify segment-bounded regions remain - intact. In output .ele files, all triangles have three points each - unless the -o2 switch is used, in which case they have six, and the - fourth, fifth, and sixth points lie on the midpoints of the edges - opposite the first, second, and third corners. - - .poly files: - First line: <# of points> <# of attributes> - <# of boundary markers (0 or 1)> - Following lines: [attributes] [boundary marker] - One line: <# of segments> <# of boundary markers (0 or 1)> - Following lines: [boundary marker] - One line: <# of holes> - Following lines: - Optional line: <# of regional attributes and/or area constraints> - Optional following lines: - - A .poly file represents a PSLG, as well as some additional information. - The first section lists all the points, and is identical to the format - of .node files. <# of points> may be set to zero to indicate that the - points are listed in a separate .node file; .poly files produced by - Triangle always have this format. This has the advantage that a point - set may easily be triangulated with or without segments. (The same - effect can be achieved, albeit using more disk space, by making a copy - of the .poly file with the extension .node; all sections of the file - but the first are ignored.) - - The second section lists the segments. Segments are edges whose - presence in the triangulation is enforced. Each segment is specified - by listing the indices of its two endpoints. This means that you must - include its endpoints in the point list. If -s, -q, and -a are not - selected, Triangle will produce a constrained Delaunay triangulation, - in which each segment appears as a single edge in the triangulation. - If -q or -a is selected, Triangle will produce a conforming Delaunay - triangulation, in which segments may be subdivided into smaller edges. - Each segment, like each point, may have a boundary marker. - - The third section lists holes (and concavities, if -c is selected) in - the triangulation. Holes are specified by identifying a point inside - each hole. After the triangulation is formed, Triangle creates holes - by eating triangles, spreading out from each hole point until its - progress is blocked by PSLG segments; you must be careful to enclose - each hole in segments, or your whole triangulation may be eaten away. - If the two triangles abutting a segment are eaten, the segment itself - is also eaten. Do not place a hole directly on a segment; if you do, - Triangle will choose one side of the segment arbitrarily. - - The optional fourth section lists regional attributes (to be assigned - to all triangles in a region) and regional constraints on the maximum - triangle area. Triangle will read this section only if the -A switch - is used or the -a switch is used without a number following it, and the - -r switch is not used. Regional attributes and area constraints are - propagated in the same manner as holes; you specify a point for each - attribute and/or constraint, and the attribute and/or constraint will - affect the whole region (bounded by segments) containing the point. If - two values are written on a line after the x and y coordinate, the - former is assumed to be a regional attribute (but will only be applied - if the -A switch is selected), and the latter is assumed to be a - regional area constraint (but will only be applied if the -a switch is - selected). You may also specify just one value after the coordinates, - which can serve as both an attribute and an area constraint, depending - on the choice of switches. If you are using the -A and -a switches - simultaneously and wish to assign an attribute to some region without - imposing an area constraint, use a negative maximum area. - - When a triangulation is created from a .poly file, you must either - enclose the entire region to be triangulated in PSLG segments, or - use the -c switch, which encloses the convex hull of the input point - set. If you do not use the -c switch, Triangle will eat all triangles - on the outer boundary that are not protected by segments; if you are - not careful, your whole triangulation may be eaten away. If you do - use the -c switch, you can still produce concavities by appropriate - placement of holes just inside the convex hull. - - An ideal PSLG has no intersecting segments, nor any points that lie - upon segments (except, of course, the endpoints of each segment.) You - aren't required to make your .poly files ideal, but you should be aware - of what can go wrong. Segment intersections are relatively safe - - Triangle will calculate the intersection points for you and add them to - the triangulation - as long as your machine's floating-point precision - doesn't become a problem. You are tempting the fates if you have three - segments that cross at the same location, and expect Triangle to figure - out where the intersection point is. Thanks to floating-point roundoff - error, Triangle will probably decide that the three segments intersect - at three different points, and you will find a minuscule triangle in - your output - unless Triangle tries to refine the tiny triangle, uses - up the last bit of machine precision, and fails to terminate at all. - You're better off putting the intersection point in the input files, - and manually breaking up each segment into two. Similarly, if you - place a point at the middle of a segment, and hope that Triangle will - break up the segment at that point, you might get lucky. On the other - hand, Triangle might decide that the point doesn't lie precisely on the - line, and you'll have a needle-sharp triangle in your output - or a lot - of tiny triangles if you're generating a quality mesh. - - When Triangle reads a .poly file, it also writes a .poly file, which - includes all edges that are part of input segments. If the -c switch - is used, the output .poly file will also include all of the edges on - the convex hull. Hence, the output .poly file is useful for finding - edges associated with input segments and setting boundary conditions in - finite element simulations. More importantly, you will need it if you - plan to refine the output mesh, and don't want segments to be missing - in later triangulations. - - .area files: - First line: <# of triangles> - Following lines: - - An .area file associates with each triangle a maximum area that is used - for mesh refinement. As with other file formats, every triangle must - be represented, and they must be numbered consecutively. A triangle - may be left unconstrained by assigning it a negative maximum area. - - .edge files: - First line: <# of edges> <# of boundary markers (0 or 1)> - Following lines: [boundary marker] - - Endpoints are indices into the corresponding .node file. Triangle can - produce .edge files (use the -e switch), but cannot read them. The - optional column of boundary markers is suppressed by the -B switch. - - In Voronoi diagrams, one also finds a special kind of edge that is an - infinite ray with only one endpoint. For these edges, a different - format is used: - - -1 - - The `direction' is a floating-point vector that indicates the direction - of the infinite ray. - - .neigh files: - First line: <# of triangles> <# of neighbors per triangle (always 3)> - Following lines: - - Neighbors are indices into the corresponding .ele file. An index of -1 - indicates a mesh boundary, and therefore no neighbor. Triangle can - produce .neigh files (use the -n switch), but cannot read them. - - The first neighbor of triangle i is opposite the first corner of - triangle i, and so on. - -Boundary Markers: - - Boundary markers are tags used mainly to identify which output points and - edges are associated with which PSLG segment, and to identify which - points and edges occur on a boundary of the triangulation. A common use - is to determine where boundary conditions should be applied to a finite - element mesh. You can prevent boundary markers from being written into - files produced by Triangle by using the -B switch. - - The boundary marker associated with each segment in an output .poly file - or edge in an output .edge file is chosen as follows: - - If an output edge is part or all of a PSLG segment with a nonzero - boundary marker, then the edge is assigned the same marker. - - Otherwise, if the edge occurs on a boundary of the triangulation - (including boundaries of holes), then the edge is assigned the marker - one (1). - - Otherwise, the edge is assigned the marker zero (0). - The boundary marker associated with each point in an output .node file is - chosen as follows: - - If a point is assigned a nonzero boundary marker in the input file, - then it is assigned the same marker in the output .node file. - - Otherwise, if the point lies on a PSLG segment (including the - segment's endpoints) with a nonzero boundary marker, then the point - is assigned the same marker. If the point lies on several such - segments, one of the markers is chosen arbitrarily. - - Otherwise, if the point occurs on a boundary of the triangulation, - then the point is assigned the marker one (1). - - Otherwise, the point is assigned the marker zero (0). - - If you want Triangle to determine for you which points and edges are on - the boundary, assign them the boundary marker zero (or use no markers at - all) in your input files. Alternatively, you can mark some of them and - leave others marked zero, allowing Triangle to label them. - -Triangulation Iteration Numbers: - - Because Triangle can read and refine its own triangulations, input - and output files have iteration numbers. For instance, Triangle might - read the files mesh.3.node, mesh.3.ele, and mesh.3.poly, refine the - triangulation, and output the files mesh.4.node, mesh.4.ele, and - mesh.4.poly. Files with no iteration number are treated as if - their iteration number is zero; hence, Triangle might read the file - points.node, triangulate it, and produce the files points.1.node and - points.1.ele. - - Iteration numbers allow you to create a sequence of successively finer - meshes suitable for multigrid methods. They also allow you to produce a - sequence of meshes using error estimate-driven mesh refinement. - - If you're not using refinement or quality meshing, and you don't like - iteration numbers, use the -I switch to disable them. This switch will - also disable output of .node and .poly files to prevent your input files - from being overwritten. (If the input is a .poly file that contains its - own points, a .node file will be written.) - -Examples of How to Use Triangle: - - `triangle dots' will read points from dots.node, and write their Delaunay - triangulation to dots.1.node and dots.1.ele. (dots.1.node will be - identical to dots.node.) `triangle -I dots' writes the triangulation to - dots.ele instead. (No additional .node file is needed, so none is - written.) - - `triangle -pe object.1' will read a PSLG from object.1.poly (and possibly - object.1.node, if the points are omitted from object.1.poly) and write - their constrained Delaunay triangulation to object.2.node and - object.2.ele. The segments will be copied to object.2.poly, and all - edges will be written to object.2.edge. - - `triangle -pq31.5a.1 object' will read a PSLG from object.poly (and - possibly object.node), generate a mesh whose angles are all greater than - 31.5 degrees and whose triangles all have area smaller than 0.1, and - write the mesh to object.1.node and object.1.ele. Each segment may have - been broken up into multiple edges; the resulting constrained edges are - written to object.1.poly. - - Here is a sample file `box.poly' describing a square with a square hole: - - # A box with eight points in 2D, no attributes, one boundary marker. - 8 2 0 1 - # Outer box has these vertices: - 1 0 0 0 - 2 0 3 0 - 3 3 0 0 - 4 3 3 33 # A special marker for this point. - # Inner square has these vertices: - 5 1 1 0 - 6 1 2 0 - 7 2 1 0 - 8 2 2 0 - # Five segments with boundary markers. - 5 1 - 1 1 2 5 # Left side of outer box. - 2 5 7 0 # Segments 2 through 5 enclose the hole. - 3 7 8 0 - 4 8 6 10 - 5 6 5 0 - # One hole in the middle of the inner square. - 1 - 1 1.5 1.5 - - Note that some segments are missing from the outer square, so one must - use the `-c' switch. After `triangle -pqc box.poly', here is the output - file `box.1.node', with twelve points. The last four points were added - to meet the angle constraint. Points 1, 2, and 9 have markers from - segment 1. Points 6 and 8 have markers from segment 4. All the other - points but 4 have been marked to indicate that they lie on a boundary. - - 12 2 0 1 - 1 0 0 5 - 2 0 3 5 - 3 3 0 1 - 4 3 3 33 - 5 1 1 1 - 6 1 2 10 - 7 2 1 1 - 8 2 2 10 - 9 0 1.5 5 - 10 1.5 0 1 - 11 3 1.5 1 - 12 1.5 3 1 - # Generated by triangle -pqc box.poly - - Here is the output file `box.1.ele', with twelve triangles. - - 12 3 0 - 1 5 6 9 - 2 10 3 7 - 3 6 8 12 - 4 9 1 5 - 5 6 2 9 - 6 7 3 11 - 7 11 4 8 - 8 7 5 10 - 9 12 2 6 - 10 8 7 11 - 11 5 1 10 - 12 8 4 12 - # Generated by triangle -pqc box.poly - - Here is the output file `box.1.poly'. Note that segments have been added - to represent the convex hull, and some segments have been split by newly - added points. Note also that <# of points> is set to zero to indicate - that the points should be read from the .node file. - - 0 2 0 1 - 12 1 - 1 1 9 5 - 2 5 7 1 - 3 8 7 1 - 4 6 8 10 - 5 5 6 1 - 6 3 10 1 - 7 4 11 1 - 8 2 12 1 - 9 9 2 5 - 10 10 1 1 - 11 11 3 1 - 12 12 4 1 - 1 - 1 1.5 1.5 - # Generated by triangle -pqc box.poly - -Refinement and Area Constraints: - - The -r switch causes a mesh (.node and .ele files) to be read and - refined. If the -p switch is also used, a .poly file is read and used to - specify edges that are constrained and cannot be eliminated (although - they can be divided into smaller edges) by the refinement process. - - When you refine a mesh, you generally want to impose tighter quality - constraints. One way to accomplish this is to use -q with a larger - angle, or -a followed by a smaller area than you used to generate the - mesh you are refining. Another way to do this is to create an .area - file, which specifies a maximum area for each triangle, and use the -a - switch (without a number following). Each triangle's area constraint is - applied to that triangle. Area constraints tend to diffuse as the mesh - is refined, so if there are large variations in area constraint between - adjacent triangles, you may not get the results you want. - - If you are refining a mesh composed of linear (three-node) elements, the - output mesh will contain all the nodes present in the input mesh, in the - same order, with new nodes added at the end of the .node file. However, - there is no guarantee that each output element is contained in a single - input element. Often, output elements will overlap two input elements, - and input edges are not present in the output mesh. Hence, a sequence of - refined meshes will form a hierarchy of nodes, but not a hierarchy of - elements. If you a refining a mesh of higher-order elements, the - hierarchical property applies only to the nodes at the corners of an - element; other nodes may not be present in the refined mesh. - - It is important to understand that maximum area constraints in .poly - files are handled differently from those in .area files. A maximum area - in a .poly file applies to the whole (segment-bounded) region in which a - point falls, whereas a maximum area in an .area file applies to only one - triangle. Area constraints in .poly files are used only when a mesh is - first generated, whereas area constraints in .area files are used only to - refine an existing mesh, and are typically based on a posteriori error - estimates resulting from a finite element simulation on that mesh. - - `triangle -rq25 object.1' will read object.1.node and object.1.ele, then - refine the triangulation to enforce a 25 degree minimum angle, and then - write the refined triangulation to object.2.node and object.2.ele. - - `triangle -rpaa6.2 z.3' will read z.3.node, z.3.ele, z.3.poly, and - z.3.area. After reconstructing the mesh and its segments, Triangle will - refine the mesh so that no triangle has area greater than 6.2, and - furthermore the triangles satisfy the maximum area constraints in - z.3.area. The output is written to z.4.node, z.4.ele, and z.4.poly. - - The sequence `triangle -qa1 x', `triangle -rqa.3 x.1', `triangle -rqa.1 - x.2' creates a sequence of successively finer meshes x.1, x.2, and x.3, - suitable for multigrid. - -Convex Hulls and Mesh Boundaries: - - If the input is a point set (rather than a PSLG), Triangle produces its - convex hull as a by-product in the output .poly file if you use the -c - switch. There are faster algorithms for finding a two-dimensional convex - hull than triangulation, of course, but this one comes for free. If the - input is an unconstrained mesh (you are using the -r switch but not the - -p switch), Triangle produces a list of its boundary edges (including - hole boundaries) as a by-product if you use the -c switch. - -Voronoi Diagrams: - - The -v switch produces a Voronoi diagram, in files suffixed .v.node and - .v.edge. For example, `triangle -v points' will read points.node, - produce its Delaunay triangulation in points.1.node and points.1.ele, - and produce its Voronoi diagram in points.1.v.node and points.1.v.edge. - The .v.node file contains a list of all Voronoi vertices, and the .v.edge - file contains a list of all Voronoi edges, some of which may be infinite - rays. (The choice of filenames makes it easy to run the set of Voronoi - vertices through Triangle, if so desired.) - - This implementation does not use exact arithmetic to compute the Voronoi - vertices, and does not check whether neighboring vertices are identical. - Be forewarned that if the Delaunay triangulation is degenerate or - near-degenerate, the Voronoi diagram may have duplicate points, crossing - edges, or infinite rays whose direction vector is zero. Also, if you - generate a constrained (as opposed to conforming) Delaunay triangulation, - or if the triangulation has holes, the corresponding Voronoi diagram is - likely to have crossing edges and unlikely to make sense. - -Mesh Topology: - - You may wish to know which triangles are adjacent to a certain Delaunay - edge in an .edge file, which Voronoi regions are adjacent to a certain - Voronoi edge in a .v.edge file, or which Voronoi regions are adjacent to - each other. All of this information can be found by cross-referencing - output files with the recollection that the Delaunay triangulation and - the Voronoi diagrams are planar duals. - - Specifically, edge i of an .edge file is the dual of Voronoi edge i of - the corresponding .v.edge file, and is rotated 90 degrees counterclock- - wise from the Voronoi edge. Triangle j of an .ele file is the dual of - vertex j of the corresponding .v.node file; and Voronoi region k is the - dual of point k of the corresponding .node file. - - Hence, to find the triangles adjacent to a Delaunay edge, look at the - vertices of the corresponding Voronoi edge; their dual triangles are on - the left and right of the Delaunay edge, respectively. To find the - Voronoi regions adjacent to a Voronoi edge, look at the endpoints of the - corresponding Delaunay edge; their dual regions are on the right and left - of the Voronoi edge, respectively. To find which Voronoi regions are - adjacent to each other, just read the list of Delaunay edges. - -Statistics: - - After generating a mesh, Triangle prints a count of the number of points, - triangles, edges, boundary edges, and segments in the output mesh. If - you've forgotten the statistics for an existing mesh, the -rNEP switches - (or -rpNEP if you've got a .poly file for the existing mesh) will - regenerate these statistics without writing any output. - - The -V switch produces extended statistics, including a rough estimate - of memory use and a histogram of triangle aspect ratios and angles in the - mesh. - -Exact Arithmetic: - - Triangle uses adaptive exact arithmetic to perform what computational - geometers call the `orientation' and `incircle' tests. If the floating- - point arithmetic of your machine conforms to the IEEE 754 standard (as - most workstations do), and does not use extended precision internal - registers, then your output is guaranteed to be an absolutely true - Delaunay or conforming Delaunay triangulation, roundoff error - notwithstanding. The word `adaptive' implies that these arithmetic - routines compute the result only to the precision necessary to guarantee - correctness, so they are usually nearly as fast as their approximate - counterparts. The exact tests can be disabled with the -X switch. On - most inputs, this switch will reduce the computation time by about eight - percent - it's not worth the risk. There are rare difficult inputs - (having many collinear and cocircular points), however, for which the - difference could be a factor of two. These are precisely the inputs most - likely to cause errors if you use the -X switch. - - Unfortunately, these routines don't solve every numerical problem. Exact - arithmetic is not used to compute the positions of points, because the - bit complexity of point coordinates would grow without bound. Hence, - segment intersections aren't computed exactly; in very unusual cases, - roundoff error in computing an intersection point might actually lead to - an inverted triangle and an invalid triangulation. (This is one reason - to compute your own intersection points in your .poly files.) Similarly, - exact arithmetic is not used to compute the vertices of the Voronoi - diagram. - - Underflow and overflow can also cause difficulties; the exact arithmetic - routines do not ameliorate out-of-bounds exponents, which can arise - during the orientation and incircle tests. As a rule of thumb, you - should ensure that your input values are within a range such that their - third powers can be taken without underflow or overflow. Underflow can - silently prevent the tests from being performed exactly, while overflow - will typically cause a floating exception. - -Calling Triangle from Another Program: - - Read the file triangle.h for details. - -Troubleshooting: - - Please read this section before mailing me bugs. - - `My output mesh has no triangles!' - - If you're using a PSLG, you've probably failed to specify a proper set - of bounding segments, or forgotten to use the -c switch. Or you may - have placed a hole badly. To test these possibilities, try again with - the -c and -O switches. Alternatively, all your input points may be - collinear, in which case you can hardly expect to triangulate them. - - `Triangle doesn't terminate, or just crashes.' - - Bad things can happen when triangles get so small that the distance - between their vertices isn't much larger than the precision of your - machine's arithmetic. If you've compiled Triangle for single-precision - arithmetic, you might do better by recompiling it for double-precision. - Then again, you might just have to settle for more lenient constraints - on the minimum angle and the maximum area than you had planned. - - You can minimize precision problems by ensuring that the origin lies - inside your point set, or even inside the densest part of your - mesh. On the other hand, if you're triangulating an object whose x - coordinates all fall between 6247133 and 6247134, you're not leaving - much floating-point precision for Triangle to work with. - - Precision problems can occur covertly if the input PSLG contains two - segments that meet (or intersect) at a very small angle, or if such an - angle is introduced by the -c switch, which may occur if a point lies - ever-so-slightly inside the convex hull, and is connected by a PSLG - segment to a point on the convex hull. If you don't realize that a - small angle is being formed, you might never discover why Triangle is - crashing. To check for this possibility, use the -S switch (with an - appropriate limit on the number of Steiner points, found by trial-and- - error) to stop Triangle early, and view the output .poly file with - Show Me (described below). Look carefully for small angles between - segments; zoom in closely, as such segments might look like a single - segment from a distance. - - If some of the input values are too large, Triangle may suffer a - floating exception due to overflow when attempting to perform an - orientation or incircle test. (Read the section on exact arithmetic - above.) Again, I recommend compiling Triangle for double (rather - than single) precision arithmetic. - - `The numbering of the output points doesn't match the input points.' - - You may have eaten some of your input points with a hole, or by placing - them outside the area enclosed by segments. - - `Triangle executes without incident, but when I look at the resulting - mesh, it has overlapping triangles or other geometric inconsistencies.' - - If you select the -X switch, Triangle's divide-and-conquer Delaunay - triangulation algorithm occasionally makes mistakes due to floating- - point roundoff error. Although these errors are rare, don't use the -X - switch. If you still have problems, please report the bug. - - Strange things can happen if you've taken liberties with your PSLG. Do - you have a point lying in the middle of a segment? Triangle sometimes - copes poorly with that sort of thing. Do you want to lay out a collinear - row of evenly spaced, segment-connected points? Have you simply defined - one long segment connecting the leftmost point to the rightmost point, - and a bunch of points lying along it? This method occasionally works, - especially with horizontal and vertical lines, but often it doesn't, and - you'll have to connect each adjacent pair of points with a separate - segment. If you don't like it, tough. - - Furthermore, if you have segments that intersect other than at their - endpoints, try not to let the intersections fall extremely close to PSLG - points or each other. - - If you have problems refining a triangulation not produced by Triangle: - Are you sure the triangulation is geometrically valid? Is it formatted - correctly for Triangle? Are the triangles all listed so the first three - points are their corners in counterclockwise order? - -Show Me: - - Triangle comes with a separate program named `Show Me', whose primary - purpose is to draw meshes on your screen or in PostScript. Its secondary - purpose is to check the validity of your input files, and do so more - thoroughly than Triangle does. Show Me requires that you have the X - Windows system. If you didn't receive Show Me with Triangle, complain to - whomever you obtained Triangle from, then send me mail. - -Triangle on the Web: - - To see an illustrated, updated version of these instructions, check out - - http://www.cs.cmu.edu/~quake/triangle.html - -A Brief Plea: - - If you use Triangle, and especially if you use it to accomplish real - work, I would like very much to hear from you. A short letter or email - (to jrs@cs.cmu.edu) describing how you use Triangle will mean a lot to - me. The more people I know are using this program, the more easily I can - justify spending time on improvements and on the three-dimensional - successor to Triangle, which in turn will benefit you. Also, I can put - you on a list to receive email whenever a new version of Triangle is - available. - - If you use a mesh generated by Triangle in a publication, please include - an acknowledgment as well. - -Research credit: - - Of course, I can take credit for only a fraction of the ideas that made - this mesh generator possible. Triangle owes its existence to the efforts - of many fine computational geometers and other researchers, including - Marshall Bern, L. Paul Chew, Boris Delaunay, Rex A. Dwyer, David - Eppstein, Steven Fortune, Leonidas J. Guibas, Donald E. Knuth, C. L. - Lawson, Der-Tsai Lee, Ernst P. Mucke, Douglas M. Priest, Jim Ruppert, - Isaac Saias, Bruce J. Schachter, Micha Sharir, Jorge Stolfi, Christopher - J. Van Wyk, David F. Watson, and Binhai Zhu. See the comments at the - beginning of the source code for references. - diff --git a/Tools/Lib/Triangle/triangle.h b/Tools/Lib/Triangle/triangle.h deleted file mode 100644 index b9be696c3..000000000 --- a/Tools/Lib/Triangle/triangle.h +++ /dev/null @@ -1,289 +0,0 @@ -/*****************************************************************************/ -/* */ -/* (triangle.h) */ -/* */ -/* Include file for programs that call Triangle. */ -/* */ -/* Accompanies Triangle Version 1.3 */ -/* July 19, 1996 */ -/* */ -/* Copyright 1996 */ -/* Jonathan Richard Shewchuk */ -/* School of Computer Science */ -/* Carnegie Mellon University */ -/* 5000 Forbes Avenue */ -/* Pittsburgh, Pennsylvania 15213-3891 */ -/* jrs@cs.cmu.edu */ -/* */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* How to call Triangle from another program */ -/* */ -/* */ -/* If you haven't read Triangle's instructions (run "triangle -h" to read */ -/* them), you won't understand what follows. */ -/* */ -/* Triangle must be compiled into an object file (triangle.o) with the */ -/* TRILIBRARY symbol defined (preferably by using the -DTRILIBRARY compiler */ -/* switch). The makefile included with Triangle will do this for you if */ -/* you run "make trilibrary". The resulting object file can be called via */ -/* the procedure triangulate(). */ -/* */ -/* If the size of the object file is important to you, you may wish to */ -/* generate a reduced version of triangle.o. The REDUCED symbol gets rid */ -/* of all features that are primarily of research interest. Specifically, */ -/* the -DREDUCED switch eliminates Triangle's -i, -F, -s, and -C switches. */ -/* The CDT_ONLY symbol gets rid of all meshing algorithms above and beyond */ -/* constrained Delaunay triangulation. Specifically, the -DCDT_ONLY switch */ -/* eliminates Triangle's -r, -q, -a, -S, and -s switches. */ -/* */ -/* IMPORTANT: These definitions (TRILIBRARY, REDUCED, CDT_ONLY) must be */ -/* made in the makefile or in triangle.c itself. Putting these definitions */ -/* in this file will not create the desired effect. */ -/* */ -/* */ -/* The calling convention for triangulate() follows. */ -/* */ -/* void triangulate(triswitches, in, out, vorout) */ -/* char *triswitches; */ -/* struct triangulateio *in; */ -/* struct triangulateio *out; */ -/* struct triangulateio *vorout; */ -/* */ -/* `triswitches' is a string containing the command line switches you wish */ -/* to invoke. No initial dash is required. Some suggestions: */ -/* */ -/* - You'll probably find it convenient to use the `z' switch so that */ -/* points (and other items) are numbered from zero. This simplifies */ -/* indexing, because the first item of any type always starts at index */ -/* [0] of the corresponding array, whether that item's number is zero or */ -/* one. */ -/* - You'll probably want to use the `Q' (quiet) switch in your final code, */ -/* but you can take advantage of Triangle's printed output (including the */ -/* `V' switch) while debugging. */ -/* - If you are not using the `q' or `a' switches, then the output points */ -/* will be identical to the input points, except possibly for the */ -/* boundary markers. If you don't need the boundary markers, you should */ -/* use the `N' (no nodes output) switch to save memory. (If you do need */ -/* boundary markers, but need to save memory, a good nasty trick is to */ -/* set out->pointlist equal to in->pointlist before calling triangulate(),*/ -/* so that Triangle overwrites the input points with identical copies.) */ -/* - The `I' (no iteration numbers) and `g' (.off file output) switches */ -/* have no effect when Triangle is compiled with TRILIBRARY defined. */ -/* */ -/* `in', `out', and `vorout' are descriptions of the input, the output, */ -/* and the Voronoi output. If the `v' (Voronoi output) switch is not used, */ -/* `vorout' may be NULL. `in' and `out' may never be NULL. */ -/* */ -/* Certain fields of the input and output structures must be initialized, */ -/* as described below. */ -/* */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* The `triangulateio' structure. */ -/* */ -/* Used to pass data into and out of the triangulate() procedure. */ -/* */ -/* */ -/* Arrays are used to store points, triangles, markers, and so forth. In */ -/* all cases, the first item in any array is stored starting at index [0]. */ -/* However, that item is item number `1' unless the `z' switch is used, in */ -/* which case it is item number `0'. Hence, you may find it easier to */ -/* index points (and triangles in the neighbor list) if you use the `z' */ -/* switch. Unless, of course, you're calling Triangle from a Fortran */ -/* program. */ -/* */ -/* Description of fields (except the `numberof' fields, which are obvious): */ -/* */ -/* `pointlist': An array of point coordinates. The first point's x */ -/* coordinate is at index [0] and its y coordinate at index [1], followed */ -/* by the coordinates of the remaining points. Each point occupies two */ -/* REALs. */ -/* `pointattributelist': An array of point attributes. Each point's */ -/* attributes occupy `numberofpointattributes' REALs. */ -/* `pointmarkerlist': An array of point markers; one int per point. */ -/* */ -/* `trianglelist': An array of triangle corners. The first triangle's */ -/* first corner is at index [0], followed by its other two corners in */ -/* counterclockwise order, followed by any other nodes if the triangle */ -/* represents a nonlinear element. Each triangle occupies */ -/* `numberofcorners' ints. */ -/* `triangleattributelist': An array of triangle attributes. Each */ -/* triangle's attributes occupy `numberoftriangleattributes' REALs. */ -/* `trianglearealist': An array of triangle area constraints; one REAL per */ -/* triangle. Input only. */ -/* `neighborlist': An array of triangle neighbors; three ints per */ -/* triangle. Output only. */ -/* */ -/* `segmentlist': An array of segment endpoints. The first segment's */ -/* endpoints are at indices [0] and [1], followed by the remaining */ -/* segments. Two ints per segment. */ -/* `segmentmarkerlist': An array of segment markers; one int per segment. */ -/* */ -/* `holelist': An array of holes. The first hole's x and y coordinates */ -/* are at indices [0] and [1], followed by the remaining holes. Two */ -/* REALs per hole. Input only, although the pointer is copied to the */ -/* output structure for your convenience. */ -/* */ -/* `regionlist': An array of regional attributes and area constraints. */ -/* The first constraint's x and y coordinates are at indices [0] and [1], */ -/* followed by the regional attribute and index [2], followed by the */ -/* maximum area at index [3], followed by the remaining area constraints. */ -/* Four REALs per area constraint. Note that each regional attribute is */ -/* used only if you select the `A' switch, and each area constraint is */ -/* used only if you select the `a' switch (with no number following), but */ -/* omitting one of these switches does not change the memory layout. */ -/* Input only, although the pointer is copied to the output structure for */ -/* your convenience. */ -/* */ -/* `edgelist': An array of edge endpoints. The first edge's endpoints are */ -/* at indices [0] and [1], followed by the remaining edges. Two ints per */ -/* edge. Output only. */ -/* `edgemarkerlist': An array of edge markers; one int per edge. Output */ -/* only. */ -/* `normlist': An array of normal vectors, used for infinite rays in */ -/* Voronoi diagrams. The first normal vector's x and y magnitudes are */ -/* at indices [0] and [1], followed by the remaining vectors. For each */ -/* finite edge in a Voronoi diagram, the normal vector written is the */ -/* zero vector. Two REALs per edge. Output only. */ -/* */ -/* */ -/* Any input fields that Triangle will examine must be initialized. */ -/* Furthermore, for each output array that Triangle will write to, you */ -/* must either provide space by setting the appropriate pointer to point */ -/* to the space you want the data written to, or you must initialize the */ -/* pointer to NULL, which tells Triangle to allocate space for the results. */ -/* The latter option is preferable, because Triangle always knows exactly */ -/* how much space to allocate. The former option is provided mainly for */ -/* people who need to call Triangle from Fortran code, though it also makes */ -/* possible some nasty space-saving tricks, like writing the output to the */ -/* same arrays as the input. */ -/* */ -/* Triangle will not free() any input or output arrays, including those it */ -/* allocates itself; that's up to you. */ -/* */ -/* Here's a guide to help you decide which fields you must initialize */ -/* before you call triangulate(). */ -/* */ -/* `in': */ -/* */ -/* - `pointlist' must always point to a list of points; `numberofpoints' */ -/* and `numberofpointattributes' must be properly set. */ -/* `pointmarkerlist' must either be set to NULL (in which case all */ -/* markers default to zero), or must point to a list of markers. If */ -/* `numberofpointattributes' is not zero, `pointattributelist' must */ -/* point to a list of point attributes. */ -/* - If the `r' switch is used, `trianglelist' must point to a list of */ -/* triangles, and `numberoftriangles', `numberofcorners', and */ -/* `numberoftriangleattributes' must be properly set. If */ -/* `numberoftriangleattributes' is not zero, `triangleattributelist' */ -/* must point to a list of triangle attributes. If the `a' switch is */ -/* used (with no number following), `trianglearealist' must point to a */ -/* list of triangle area constraints. `neighborlist' may be ignored. */ -/* - If the `p' switch is used, `segmentlist' must point to a list of */ -/* segments, `numberofsegments' must be properly set, and */ -/* `segmentmarkerlist' must either be set to NULL (in which case all */ -/* markers default to zero), or must point to a list of markers. */ -/* - If the `p' switch is used without the `r' switch, then */ -/* `numberofholes' and `numberofregions' must be properly set. If */ -/* `numberofholes' is not zero, `holelist' must point to a list of */ -/* holes. If `numberofregions' is not zero, `regionlist' must point to */ -/* a list of region constraints. */ -/* - If the `p' switch is used, `holelist', `numberofholes', */ -/* `regionlist', and `numberofregions' is copied to `out'. (You can */ -/* nonetheless get away with not initializing them if the `r' switch is */ -/* used.) */ -/* - `edgelist', `edgemarkerlist', `normlist', and `numberofedges' may be */ -/* ignored. */ -/* */ -/* `out': */ -/* */ -/* - `pointlist' must be initialized (NULL or pointing to memory) unless */ -/* the `N' switch is used. `pointmarkerlist' must be initialized */ -/* unless the `N' or `B' switch is used. If `N' is not used and */ -/* `in->numberofpointattributes' is not zero, `pointattributelist' must */ -/* be initialized. */ -/* - `trianglelist' must be initialized unless the `E' switch is used. */ -/* `neighborlist' must be initialized if the `n' switch is used. If */ -/* the `E' switch is not used and (`in->numberofelementattributes' is */ -/* not zero or the `A' switch is used), `elementattributelist' must be */ -/* initialized. `trianglearealist' may be ignored. */ -/* - `segmentlist' must be initialized if the `p' or `c' switch is used, */ -/* and the `P' switch is not used. `segmentmarkerlist' must also be */ -/* initialized under these circumstances unless the `B' switch is used. */ -/* - `edgelist' must be initialized if the `e' switch is used. */ -/* `edgemarkerlist' must be initialized if the `e' switch is used and */ -/* the `B' switch is not. */ -/* - `holelist', `regionlist', `normlist', and all scalars may be ignored.*/ -/* */ -/* `vorout' (only needed if `v' switch is used): */ -/* */ -/* - `pointlist' must be initialized. If `in->numberofpointattributes' */ -/* is not zero, `pointattributelist' must be initialized. */ -/* `pointmarkerlist' may be ignored. */ -/* - `edgelist' and `normlist' must both be initialized. */ -/* `edgemarkerlist' may be ignored. */ -/* - Everything else may be ignored. */ -/* */ -/* After a call to triangulate(), the valid fields of `out' and `vorout' */ -/* will depend, in an obvious way, on the choice of switches used. Note */ -/* that when the `p' switch is used, the pointers `holelist' and */ -/* `regionlist' are copied from `in' to `out', but no new space is */ -/* allocated; be careful that you don't free() the same array twice. On */ -/* the other hand, Triangle will never copy the `pointlist' pointer (or any */ -/* others); new space is allocated for `out->pointlist', or if the `N' */ -/* switch is used, `out->pointlist' remains uninitialized. */ -/* */ -/* All of the meaningful `numberof' fields will be properly set; for */ -/* instance, `numberofedges' will represent the number of edges in the */ -/* triangulation whether or not the edges were written. If segments are */ -/* not used, `numberofsegments' will indicate the number of boundary edges. */ -/* */ -/*****************************************************************************/ - -/* CLO: 3/21/99 - this could be done as a compile flag, but I always want -this defined and I don't want to sprinkle extra stuff throughout the -Makefile system if I don't have to. */ -#define ANSI_DECLARATORS 1 - -struct triangulateio { - REAL *pointlist; /* In / out */ - REAL *pointattributelist; /* In / out */ - int *pointmarkerlist; /* In / out */ - int numberofpoints; /* In / out */ - int numberofpointattributes; /* In / out */ - - int *trianglelist; /* In / out */ - REAL *triangleattributelist; /* In / out */ - REAL *trianglearealist; /* In only */ - int *neighborlist; /* Out only */ - int numberoftriangles; /* In / out */ - int numberofcorners; /* In / out */ - int numberoftriangleattributes; /* In / out */ - - int *segmentlist; /* In / out */ - int *segmentmarkerlist; /* In / out */ - int numberofsegments; /* In / out */ - - REAL *holelist; /* In / pointer to array copied out */ - int numberofholes; /* In / copied out */ - - REAL *regionlist; /* In / pointer to array copied out */ - int numberofregions; /* In / copied out */ - - int *edgelist; /* Out only */ - int *edgemarkerlist; /* Not used with Voronoi diagram; out only */ - REAL *normlist; /* Used only with Voronoi diagram; out only */ - int numberofedges; /* Out only */ -}; - -#ifdef ANSI_DECLARATORS -void triangulate(char *, struct triangulateio *, struct triangulateio *, - struct triangulateio *); -#else /* not ANSI_DECLARATORS */ -void triangulate(); -#endif /* not ANSI_DECLARATORS */ diff --git a/Tools/Lib/Triangle/tricall.c b/Tools/Lib/Triangle/tricall.c deleted file mode 100644 index 6beccdc81..000000000 --- a/Tools/Lib/Triangle/tricall.c +++ /dev/null @@ -1,279 +0,0 @@ -/*****************************************************************************/ -/* */ -/* (tricall.c) */ -/* */ -/* Example program that demonstrates how to call Triangle. */ -/* */ -/* Accompanies Triangle Version 1.3 */ -/* July 19, 1996 */ -/* */ -/* This file is placed in the public domain (but the file that it calls */ -/* is still copyrighted!) by */ -/* Jonathan Richard Shewchuk */ -/* School of Computer Science */ -/* Carnegie Mellon University */ -/* 5000 Forbes Avenue */ -/* Pittsburgh, Pennsylvania 15213-3891 */ -/* jrs@cs.cmu.edu */ -/* */ -/*****************************************************************************/ - -/* If SINGLE is defined when triangle.o is compiled, it should also be */ -/* defined here. If not, it should not be defined here. */ - -/* #define SINGLE */ - -#ifdef SINGLE -#define REAL float -#else /* not SINGLE */ -#define REAL double -#endif /* not SINGLE */ - -#include -#include "triangle.h" - -#ifndef _STDLIB_H_ -extern void *malloc(); -extern void free(); -#endif /* _STDLIB_H_ */ - -/*****************************************************************************/ -/* */ -/* report() Print the input or output. */ -/* */ -/*****************************************************************************/ - -void report(io, markers, reporttriangles, reportneighbors, reportsegments, - reportedges, reportnorms) -struct triangulateio *io; -int markers; -int reporttriangles; -int reportneighbors; -int reportsegments; -int reportedges; -int reportnorms; -{ - int i, j; - - for (i = 0; i < io->numberofpoints; i++) { - printf("Point %4d:", i); - for (j = 0; j < 2; j++) { - printf(" %.6g", io->pointlist[i * 2 + j]); - } - if (io->numberofpointattributes > 0) { - printf(" attributes"); - } - for (j = 0; j < io->numberofpointattributes; j++) { - printf(" %.6g", - io->pointattributelist[i * io->numberofpointattributes + j]); - } - if (markers) { - printf(" marker %d\n", io->pointmarkerlist[i]); - } else { - printf("\n"); - } - } - printf("\n"); - - if (reporttriangles || reportneighbors) { - for (i = 0; i < io->numberoftriangles; i++) { - if (reporttriangles) { - printf("Triangle %4d points:", i); - for (j = 0; j < io->numberofcorners; j++) { - printf(" %4d", io->trianglelist[i * io->numberofcorners + j]); - } - if (io->numberoftriangleattributes > 0) { - printf(" attributes"); - } - for (j = 0; j < io->numberoftriangleattributes; j++) { - printf(" %.6g", io->triangleattributelist[i * - io->numberoftriangleattributes + j]); - } - printf("\n"); - } - if (reportneighbors) { - printf("Triangle %4d neighbors:", i); - for (j = 0; j < 3; j++) { - printf(" %4d", io->neighborlist[i * 3 + j]); - } - printf("\n"); - } - } - printf("\n"); - } - - if (reportsegments) { - for (i = 0; i < io->numberofsegments; i++) { - printf("Segment %4d points:", i); - for (j = 0; j < 2; j++) { - printf(" %4d", io->segmentlist[i * 2 + j]); - } - if (markers) { - printf(" marker %d\n", io->segmentmarkerlist[i]); - } else { - printf("\n"); - } - } - printf("\n"); - } - - if (reportedges) { - for (i = 0; i < io->numberofedges; i++) { - printf("Edge %4d points:", i); - for (j = 0; j < 2; j++) { - printf(" %4d", io->edgelist[i * 2 + j]); - } - if (reportnorms && (io->edgelist[i * 2 + 1] == -1)) { - for (j = 0; j < 2; j++) { - printf(" %.6g", io->normlist[i * 2 + j]); - } - } - if (markers) { - printf(" marker %d\n", io->edgemarkerlist[i]); - } else { - printf("\n"); - } - } - printf("\n"); - } -} - -/*****************************************************************************/ -/* */ -/* main() Create and refine a mesh. */ -/* */ -/*****************************************************************************/ - -int main() -{ - struct triangulateio in, mid, out, vorout; - - /* Define input points. */ - - in.numberofpoints = 4; - in.numberofpointattributes = 1; - in.pointlist = (REAL *) malloc(in.numberofpoints * 2 * sizeof(REAL)); - in.pointlist[0] = 0.0; - in.pointlist[1] = 0.0; - in.pointlist[2] = 1.0; - in.pointlist[3] = 0.0; - in.pointlist[4] = 1.0; - in.pointlist[5] = 10.0; - in.pointlist[6] = 0.0; - in.pointlist[7] = 10.0; - in.pointattributelist = (REAL *) malloc(in.numberofpoints * - in.numberofpointattributes * - sizeof(REAL)); - in.pointattributelist[0] = 0.0; - in.pointattributelist[1] = 1.0; - in.pointattributelist[2] = 11.0; - in.pointattributelist[3] = 10.0; - in.pointmarkerlist = (int *) malloc(in.numberofpoints * sizeof(int)); - in.pointmarkerlist[0] = 0; - in.pointmarkerlist[1] = 2; - in.pointmarkerlist[2] = 0; - in.pointmarkerlist[3] = 0; - - in.numberofsegments = 0; - in.numberofholes = 0; - in.numberofregions = 1; - in.regionlist = (REAL *) malloc(in.numberofregions * 4 * sizeof(REAL)); - in.regionlist[0] = 0.5; - in.regionlist[1] = 5.0; - in.regionlist[2] = 7.0; /* Regional attribute (for whole mesh). */ - in.regionlist[3] = 0.1; /* Area constraint that will not be used. */ - - printf("Input point set:\n\n"); - report(&in, 1, 0, 0, 0, 0, 0); - - /* Make necessary initializations so that Triangle can return a */ - /* triangulation in `mid' and a voronoi diagram in `vorout'. */ - - mid.pointlist = (REAL *) NULL; /* Not needed if -N switch used. */ - /* Not needed if -N switch used or number of point attributes is zero: */ - mid.pointattributelist = (REAL *) NULL; - mid.pointmarkerlist = (int *) NULL; /* Not needed if -N or -B switch used. */ - mid.trianglelist = (int *) NULL; /* Not needed if -E switch used. */ - /* Not needed if -E switch used or number of triangle attributes is zero: */ - mid.triangleattributelist = (REAL *) NULL; - mid.neighborlist = (int *) NULL; /* Needed only if -n switch used. */ - /* Needed only if segments are output (-p or -c) and -P not used: */ - mid.segmentlist = (int *) NULL; - /* Needed only if segments are output (-p or -c) and -P and -B not used: */ - mid.segmentmarkerlist = (int *) NULL; - mid.edgelist = (int *) NULL; /* Needed only if -e switch used. */ - mid.edgemarkerlist = (int *) NULL; /* Needed if -e used and -B not used. */ - - vorout.pointlist = (REAL *) NULL; /* Needed only if -v switch used. */ - /* Needed only if -v switch used and number of attributes is not zero: */ - vorout.pointattributelist = (REAL *) NULL; - vorout.edgelist = (int *) NULL; /* Needed only if -v switch used. */ - vorout.normlist = (REAL *) NULL; /* Needed only if -v switch used. */ - - /* Triangulate the points. Switches are chosen to read and write a */ - /* PSLG (p), preserve the convex hull (c), number everything from */ - /* zero (z), assign a regional attribute to each element (A), and */ - /* produce an edge list (e), a Voronoi diagram (v), and a triangle */ - /* neighbor list (n). */ - - triangulate("pczAevn", &in, &mid, &vorout); - - printf("Initial triangulation:\n\n"); - report(&mid, 1, 1, 1, 1, 1, 0); - printf("Initial Voronoi diagram:\n\n"); - report(&vorout, 0, 0, 0, 0, 1, 1); - - /* Attach area constraints to the triangles in preparation for */ - /* refining the triangulation. */ - - /* Needed only if -r and -a switches used: */ - mid.trianglearealist = (REAL *) malloc(mid.numberoftriangles * sizeof(REAL)); - mid.trianglearealist[0] = 3.0; - mid.trianglearealist[1] = 1.0; - - /* Make necessary initializations so that Triangle can return a */ - /* triangulation in `out'. */ - - out.pointlist = (REAL *) NULL; /* Not needed if -N switch used. */ - /* Not needed if -N switch used or number of attributes is zero: */ - out.pointattributelist = (REAL *) NULL; - out.trianglelist = (int *) NULL; /* Not needed if -E switch used. */ - /* Not needed if -E switch used or number of triangle attributes is zero: */ - out.triangleattributelist = (REAL *) NULL; - - /* Refine the triangulation according to the attached */ - /* triangle area constraints. */ - - triangulate("prazBP", &mid, &out, (struct triangulateio *) NULL); - - printf("Refined triangulation:\n\n"); - report(&out, 0, 1, 0, 0, 0, 0); - - /* Free all allocated arrays, including those allocated by Triangle. */ - - free(in.pointlist); - free(in.pointattributelist); - free(in.pointmarkerlist); - free(in.regionlist); - free(mid.pointlist); - free(mid.pointattributelist); - free(mid.pointmarkerlist); - free(mid.trianglelist); - free(mid.triangleattributelist); - free(mid.trianglearealist); - free(mid.neighborlist); - free(mid.segmentlist); - free(mid.segmentmarkerlist); - free(mid.edgelist); - free(mid.edgemarkerlist); - free(vorout.pointlist); - free(vorout.pointattributelist); - free(vorout.edgelist); - free(vorout.normlist); - free(out.pointlist); - free(out.pointattributelist); - free(out.trianglelist); - free(out.triangleattributelist); - - return 0; -} diff --git a/Tools/Makefile.am b/Tools/Makefile.am deleted file mode 100644 index 63cc644b0..000000000 --- a/Tools/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -EXTRA_DIST = process-dem.pl scenery_version.hxx - -SUBDIRS = \ - Lib \ - Prep \ - Construct \ - Utils - -# Areas diff --git a/Tools/Prep/DemChop/Makefile.am b/Tools/Prep/DemChop/Makefile.am deleted file mode 100644 index e8b8f2e02..000000000 --- a/Tools/Prep/DemChop/Makefile.am +++ /dev/null @@ -1,47 +0,0 @@ -#--------------------------------------------------------------------------- -# Makefile -# -# Written by Curtis Olson, started March 1999. -# -# Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id$ -#--------------------------------------------------------------------------- - - -bin_PROGRAMS = demchop - -demchop_SOURCES = \ - demchop.cxx point2d.hxx - -demchop_LDADD = \ - $(top_builddir)/Tools/Lib/DEM/libDEM.a \ - $(top_builddir)/Lib/Bucket/libBucket.a \ - $(top_builddir)/Lib/Misc/libMisc.a \ - $(top_builddir)/Lib/Debug/libDebug.a \ - $(top_builddir)/Lib/zlib/libz.a \ - $(base_LIBS) - -INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib -I$(top_builddir)/Tools/Lib - -# We can't build this with "-O2" (optimization) since this causes a seg fault -# I haven't found a way to strip this out of the CXXFLAGS, so I'm just -# setting it to "-g" -# CXXFLAGS = -g - - -#--------------------------------------------------------------------------- diff --git a/Tools/Prep/DemChop/demchop.cxx b/Tools/Prep/DemChop/demchop.cxx deleted file mode 100644 index 0a98a897d..000000000 --- a/Tools/Prep/DemChop/demchop.cxx +++ /dev/null @@ -1,102 +0,0 @@ -// demchop.cxx -- chop up a dem file into it's corresponding pieces and stuff -// them into the workspace directory -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1997 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include - -#include STL_STRING - -#include -#include -#include - -#include "point2d.hxx" - -FG_USING_STD(string); - - -int main(int argc, char **argv) { - /* - fgDEM dem; - FGBucket p; - string fg_root; - string filename; - double error; - int i, j; - */ - - fglog().setLogLevels( FG_ALL, FG_DEBUG ); - - if ( argc != 3 ) { - FG_LOG( FG_GENERAL, FG_ALERT, - "Usage " << argv[0] << " " ); - exit(-1); - } - - string dem_name = argv[1]; - string work_dir = argv[2]; - string command = "mkdir -p " + work_dir; - system( command.c_str() ); - - FGDem dem(dem_name); - dem.parse(); - dem.close(); - - point2d min, max; - min.x = dem.get_originx() / 3600.0 + FG_HALF_BUCKET_SPAN; - min.y = dem.get_originy() / 3600.0 + FG_HALF_BUCKET_SPAN; - FGBucket b_min( min.x, min.y ); - - max.x = (dem.get_originx() + dem.get_cols() * dem.get_col_step()) / 3600.0 - - FG_HALF_BUCKET_SPAN; - max.y = (dem.get_originy() + dem.get_rows() * dem.get_row_step()) / 3600.0 - - FG_HALF_BUCKET_SPAN; - FGBucket b_max( max.x, max.y ); - - if ( b_min == b_max ) { - dem.write_area( work_dir, b_min, true ); - } else { - FGBucket b_cur; - int dx, dy, i, j; - - fgBucketDiff(b_min, b_max, &dx, &dy); - cout << "DEM file spans tile boundaries" << endl; - cout << " dx = " << dx << " dy = " << dy << endl; - - if ( (dx > 20) || (dy > 20) ) { - cout << "somethings really wrong!!!!" << endl; - exit(-1); - } - - for ( j = 0; j <= dy; j++ ) { - for ( i = 0; i <= dx; i++ ) { - b_cur = fgBucketOffset(min.x, min.y, i, j); - dem.write_area( work_dir, b_cur, true ); - } - } - } - - return 0; -} - - diff --git a/Tools/Prep/DemChop/point2d.cxx b/Tools/Prep/DemChop/point2d.cxx deleted file mode 100644 index 9f5b5da43..000000000 --- a/Tools/Prep/DemChop/point2d.cxx +++ /dev/null @@ -1,39 +0,0 @@ -// point2d.cxx -- 2d coordinate routines -// -// Written by Curtis Olson, started September 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ -// - - -#include - -#include "point2d.hxx" - - -// convert a point from cartesian to polar coordinates -point2d cart_to_polar_2d(point2d in) { - point2d result; - result.dist = sqrt( in.x * in.x + in.y * in.y ); - result.theta = atan2(in.y, in.x); - - return(result); -} - - diff --git a/Tools/Prep/DemChop/point2d.hxx b/Tools/Prep/DemChop/point2d.hxx deleted file mode 100644 index b97a72f79..000000000 --- a/Tools/Prep/DemChop/point2d.hxx +++ /dev/null @@ -1,53 +0,0 @@ -// point2d.hxx -- define a 2d point class -// -// Written by Curtis Olson, started February 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ -// - - -#ifndef _POINT2D_HXX -#define _POINT2D_HXX - - -#include - - -class point2d { -public: - union { - double x; - double dist; - double lon; - }; - union { - double y; - double theta; - double lat; - }; -}; - - -// convert a point from cartesian to polar coordinates -point2d cart_to_polar_2d(point2d in); - - -#endif // _POINT2D_HXX - - diff --git a/Tools/Prep/DemInfo/Makefile.am b/Tools/Prep/DemInfo/Makefile.am deleted file mode 100644 index cd2c06cce..000000000 --- a/Tools/Prep/DemInfo/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -#--------------------------------------------------------------------------- -# Makefile -# -# Written by Curtis Olson, started June 1998. -# -# Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id$ -#--------------------------------------------------------------------------- - - -bin_PROGRAMS = deminfo - -deminfo_SOURCES = \ - deminfo.cxx - -deminfo_LDADD = \ - $(top_builddir)/Tools/Lib/DEM/libDEM.a \ - $(top_builddir)/Lib/Bucket/libBucket.a \ - $(top_builddir)/Lib/Misc/libMisc.a \ - $(top_builddir)/Lib/zlib/libz.a \ - $(base_LIBS) - -INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib -I$(top_builddir)/Tools/Lib - -# We can't build this with "-O2" (optimization) since this causes a seg fault -# I haven't found a way to strip this out of the CXXFLAGS, so I'm just -# setting it to "-g" -# CXXFLAGS = -g - - -#--------------------------------------------------------------------------- diff --git a/Tools/Prep/DemInfo/deminfo.cxx b/Tools/Prep/DemInfo/deminfo.cxx deleted file mode 100644 index 5a586240a..000000000 --- a/Tools/Prep/DemInfo/deminfo.cxx +++ /dev/null @@ -1,67 +0,0 @@ -// deminfo.cxx -- main loop -// -// Written by Curtis Olson, started June 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ -// - - -#include -#include -#include -#include - -#include - - -// static float dem_data[DEM_SIZE_1][DEM_SIZE_1]; -// static float output_data[DEM_SIZE_1][DEM_SIZE_1]; - - -int main(int argc, char **argv) { - // DEM data - FGDem dem; - string filename; - double error; - int i, j; - - if ( argc != 2 ) { - printf("Usage: %s \n", argv[0]); - exit(-1); - } - - // set input dem file name - filename = argv[1]; - - dem.open(filename); - - if ( dem.read_a_record() ) { - cout << "Results = " << filename << " " - << dem.get_originx() / 3600.0 << " " - << dem.get_originy() / 3600.0 << "\n"; - } else { - cout << "Error parsing DEM file.\n"; - } - - dem.close(); - - return(0); -} - - diff --git a/Tools/Prep/DemInfo/gather-dem-info.pl b/Tools/Prep/DemInfo/gather-dem-info.pl deleted file mode 100755 index 11875c92a..000000000 --- a/Tools/Prep/DemInfo/gather-dem-info.pl +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/perl - -#--------------------------------------------------------------------------- -# script to gather DEM position info so we can associate a file name with a -# position. -# -# Written by Curtis Olson, started June 1998. -# -# Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id$ -#--------------------------------------------------------------------------- - - -if ( $#ARGV < 0 ) { - die "Usage: $0 search_dir ... \n"; -} - -while ( $dir = shift(@ARGV) ) { - # print "processing $dir\n"; - - @allfiles = `find $dir -print`; - - foreach $file (@allfiles) { - chop($file); - # print "trying $file\n"; - if ( -f $file ) { - # print "really trying $file\n"; - open ( INFO, "./deminfo $file |" ); - while ( ) { - if ( m/Results = / ) { - $_ =~ s/Results = //; - print $_; - } - } - close(INFO); - } - } -} - - -#--------------------------------------------------------------------------- diff --git a/Tools/Prep/DemRaw2ascii/Makefile.am b/Tools/Prep/DemRaw2ascii/Makefile.am deleted file mode 100644 index 115935376..000000000 --- a/Tools/Prep/DemRaw2ascii/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -#--------------------------------------------------------------------------- -# Makefile -# -# Written by Curtis Olson, started February 1998. -# -# Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id$ -#--------------------------------------------------------------------------- - - -bin_PROGRAMS = raw2ascii - -raw2ascii_SOURCES = main.c rawdem.c rawdem.h - -raw2ascii_LDADD = $(base_LIBS) - -INCLUDES += - - -#--------------------------------------------------------------------------- diff --git a/Tools/Prep/DemRaw2ascii/main.c b/Tools/Prep/DemRaw2ascii/main.c deleted file mode 100644 index 47bb7be7b..000000000 --- a/Tools/Prep/DemRaw2ascii/main.c +++ /dev/null @@ -1,78 +0,0 @@ -/* main.c -- main loop - * - * Written by Curtis Olson, started February 1998. - * - * Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id$ - */ - - -#include -#include - -#include "rawdem.h" - - -int main(int argc, char **argv) { - fgRAWDEM raw; - char basename[256], output_dir[256], hdr_file[256], dem_file[256]; - int i, start_lat, end_lat; - - if ( argc != 3 ) { - printf("Usage: %s \n", argv[0]); - exit(-1); - } - - /* get basename */ - strcpy(basename, argv[1]); - - /* get output dir */ - strcpy(output_dir, argv[2]); - - /* generate header file name */ - strcpy(hdr_file, basename); - strcat(hdr_file, ".HDR"); - - /* generate input file name (raw dem) */ - strcpy(dem_file, basename); - strcat(dem_file, ".DEM"); - - printf("Header file = %s Input file = %s\n", hdr_file, dem_file); - printf("Output Directory = %s\n", output_dir); - - /* scan the header file and extract important values */ - rawReadDemHdr(&raw, hdr_file); - - /* open up the raw data file */ - rawOpenDemFile(&raw, dem_file); - - end_lat = raw.rooty / 3600; - start_lat = end_lat - ((raw.nrows * raw.ydim) / 3600); - printf("Latitude ranges from %d to %d\n", start_lat, end_lat); - - for ( i = start_lat + 1; i <= end_lat; i++ ) { - rawProcessStrip(&raw, i, output_dir); - } - - /* close the raw data file */ - rawCloseDemFile(&raw); - - return(0); -} - - diff --git a/Tools/Prep/DemRaw2ascii/rawdem.c b/Tools/Prep/DemRaw2ascii/rawdem.c deleted file mode 100644 index 4e4db680f..000000000 --- a/Tools/Prep/DemRaw2ascii/rawdem.c +++ /dev/null @@ -1,462 +0,0 @@ -/* rawdem.c -- library of routines for processing raw dem files (30 arcsec) - * - * Written by Curtis Olson, started February 1998. - * - * Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id$ - */ - - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include /* rint() */ -#include -#include /* atoi() atof() */ -#include /* swab() */ - -#include /* open() */ -#include -#include -#include /* close() */ - -#include "rawdem.h" - - -/* Read the DEM header to determine various key parameters for this - * DEM file */ -void rawReadDemHdr( fgRAWDEM *raw, char *hdr_file ) { - FILE *hdr; - char line[256], key[256], value[256]; - int i, len, offset; - double tmp; - - if ( (hdr = fopen(hdr_file, "r")) == NULL ) { - printf("Error opening DEM header file: %s\n", hdr_file); - exit(-1); - } - - /* process each line */ - while ( (fgets(line, 256, hdr) != NULL) ) { - /* printf("%s", line); */ - len = strlen(line); - - /* extract key */ - i = 0; - while ( (line[i] != ' ') && (i < len) ) { - key[i] = line[i]; - i++; - } - key[i] = '\0'; - - /* skip middle space */ - while ( (line[i] == ' ') && (i < len) ) { - i++; - } - offset = i; - - /* extract value */ - while ( (line[i] != '\n') && (i < len) ) { - value[i-offset] = line[i]; - i++; - } - value[i-offset] = '\0'; - /* printf("key='%s' value='%s'\n", key, value); */ - - if ( strcmp(key, "NROWS") == 0 ) { - raw->nrows = atoi(value); - } else if ( strcmp(key, "NCOLS") == 0 ) { - raw->ncols = atoi(value); - } else if ( strcmp(key, "ULXMAP") == 0 ) { - tmp = atof(value); -#ifdef HAVE_RINT - raw->ulxmap = (int)rint(tmp * 3600.0); /* convert to arcsec */ -#else -# error Port me rint() -#endif - } else if ( strcmp(key, "ULYMAP") == 0 ) { - tmp = atof(value); -#ifdef HAVE_RINT - raw->ulymap = (int)rint(tmp * 3600.0); /* convert to arcsec */ -#else -# error Port me rint() -#endif - } else if ( strcmp(key, "XDIM") == 0 ) { - tmp = atof(value); -#ifdef HAVE_RINT - raw->xdim = (int)rint(tmp * 3600.0); /* convert to arcsec */ -#else -# error Port me rint() -#endif - } else if ( strcmp(key, "YDIM") == 0 ) { - tmp = atof(value); -#ifdef HAVE_RINT - raw->ydim = (int)rint(tmp * 3600.0); /* convert to arcsec */ -#else -# error Port me rint() -#endif - } else { - /* ignore for now */ - } - } - - raw->rootx = raw->ulxmap - (raw->xdim / 2); - raw->rooty = raw->ulymap + (raw->ydim / 2); - - printf("%d %d %d %d %d %d %d %d\n", raw->nrows, raw->ncols, - raw->ulxmap, raw->ulymap, raw->rootx, raw->rooty, raw->xdim, - raw->ydim); -} - - -/* Open a raw DEM file. */ -void rawOpenDemFile( fgRAWDEM *raw, char *raw_dem_file ) { - printf("Opening Raw DEM file: %s\n", raw_dem_file); - if ( (raw->fd = open(raw_dem_file ,O_RDONLY)) == -1 ) { - printf("Error opening Raw DEM file: %s\n", raw_dem_file); - exit(-1); - } -} - - -/* Close a raw DEM file. */ -void rawCloseDemFile( fgRAWDEM *raw ) { - close(raw->fd); -} - - -/* Advance file pointer position to correct latitude (row) */ -void rawAdvancePosition( fgRAWDEM *raw, int arcsec ) { - long offset, result; - - offset = 2 * raw->ncols * ( arcsec / raw->ydim ); - - if ( (result = lseek(raw->fd, offset, SEEK_SET)) == -1 ) { - printf("Error lseek filed trying to offset by %ld\n", offset); - exit(-1); - } - - printf("Successful seek ahead of %ld bytes\n", result); -} - - -/* Read the next row of data */ -void rawReadNextRow( fgRAWDEM *raw, int index ) { - char buf[MAX_COLS_X_2]; - int i, result; - - if ( raw->ncols > MAX_ROWS ) { - printf("Error, buf needs to be bigger in rawReadNextRow()\n"); - exit(-1); - } - - /* printf("Attempting to read %d bytes\n", 2 * raw->ncols); */ - result = read(raw->fd, buf, 2 * raw->ncols); - /* printf("Read %d bytes\n", result); */ - - /* reverse byte order */ - /* it would be nice to test in advance some how if we need to do - * this */ - /* swab(frombuf, tobuf, 2 * raw->ncols); */ - - for ( i = 0; i < raw->ncols; i++ ) { - /* printf("hi = %d lo = %d\n", buf[2*i], buf[2*i + 1]); */ - raw->strip[index][i] = ( (buf[2*i] + 1) << 8 ) + buf[2*i + 1]; - } -} - - -/* Convert from pixel centered values to pixel corner values. This is - accomplished by taking the average of the closes center nodes. In - the following diagram "x" marks the data point location: - - +-----+ x-----x - | | | | - | x | ===> | | - | | | | - +-----+ x-----x - - */ -void rawConvertCenter2Edge( fgRAWDEM *raw ) { - int i, j; - - /* derive corner nodes */ - raw->edge[0][0] = raw->center[0][0]; - raw->edge[120][0] = raw->center[119][0]; - raw->edge[120][120] = raw->center[119][119]; - raw->edge[0][120] = raw->center[0][119]; - - /* derive edge nodes */ - for ( i = 1; i < 120; i++ ) { - raw->edge[i][0] = (raw->center[i-1][0] + raw->center[i][0]) / 2.0; - raw->edge[i][120] = (raw->center[i-1][119] + raw->center[i][119]) / 2.0; - raw->edge[0][i] = (raw->center[0][i-1] + raw->center[0][i]) / 2.0; - raw->edge[120][i] = (raw->center[119][i-1] + raw->center[119][i]) / 2.0; - } - - /* derive internal nodes */ - for ( j = 1; j < 120; j++ ) { - for ( i = 1; i < 120; i++ ) { - raw->edge[i][j] = ( raw->center[i-1][j-1] + - raw->center[i] [j-1] + - raw->center[i] [j] + - raw->center[i-1][j] ) / 4; - } - } -} - - -/* Dump out the ascii format DEM file */ -void rawDumpAsciiDEM( fgRAWDEM *raw, char *path, int ilon, int ilat ) { - char outfile[256]; - char tmp[256]; - int lon, lat; - char lon_sign, lat_sign; - int i, j; - FILE *fd; - - /* Generate output file name */ - - if ( ilon >= 0 ) { - lon = ilon; - lon_sign = 'e'; - } else { - lon = -ilon; - lon_sign = 'w'; - } - - if ( ilat >= 0 ) { - lat = ilat; - lat_sign = 'n'; - } else { - lat = -ilat; - lat_sign = 's'; - } - - sprintf(outfile, "%s/%c%03d%c%03d.dem", path, lon_sign, lon, lat_sign, lat); - - printf("outfile = %s\n", outfile); - - if ( (fd = fopen(outfile, "w")) == NULL ) { - printf("Error opening output file = %s\n", outfile); - exit(-1); - } - - /* Dump the "A" record */ - - /* print descriptive header (144 characters) */ - sprintf(tmp, "%s - Generated from a 30 arcsec binary DEM", outfile); - fprintf(fd, "%-144s", tmp); - - /* DEM level code, 3 reflects processing by DMA */ - fprintf(fd, "%6d", 1); - - /* Pattern code, 1 indicates a regular elevation pattern */ - fprintf(fd, "%6d", 1); - - /* Planimetric reference system code, 0 indicates geographic - * coordinate system. */ - fprintf(fd, "%6d", 0); - - /* Zone code */ - fprintf(fd, "%6d", 0); - - /* Map projection parameters (ignored) */ - for ( i = 0; i < 15; i++ ) { - fprintf(fd, "%6.1f%18s", 0.0, ""); - } - - /* Units code, 3 represents arc-seconds as the unit of measure for - * ground planimetric coordinates throughout the file. */ - fprintf(fd, "%6d", 3); - - /* Units code; 2 represents meters as the unit of measure for - * elevation coordinates throughout the file. */ - fprintf(fd, "%6d", 2); - - /* Number (n) of sides in the polygon which defines the coverage of - * the DEM file (usually equal to 4). */ - fprintf(fd, "%6d", 4); - - /* Ground coordinates of bounding box in arc-seconds */ - fprintf(fd, "%20.15fD+06", ilon * 3600.0 / 1000000.0); - fprintf(fd, "%20.15fD+06", ilat * 3600.0 / 1000000.0); - - fprintf(fd, "%20.15fD+06", ilon * 3600.0 / 1000000.0); - fprintf(fd, "%20.15fD+06", (ilat+1) * 3600.0 / 1000000.0); - - fprintf(fd, "%20.15fD+06", (ilon+1) * 3600.0 / 1000000.0); - fprintf(fd, "%20.15fD+06", (ilat+1) * 3600.0 / 1000000.0); - - fprintf(fd, "%20.15fD+06", (ilon+1) * 3600.0 / 1000000.0); - fprintf(fd, "%20.15fD+06", (ilat) * 3600.0 / 1000000.0); - - /* Minimum/maximum elevations in meters */ - fprintf(fd, " %20.15E", (double)raw->tmp_min); - fprintf(fd, " %20.15E", (double)raw->tmp_max); - - /* Counterclockwise angle from the primary axis of ground - * planimetric referenced to the primary axis of the DEM local - * reference system. */ - fprintf(fd, "%6.1f", 0.0); - - /* Accuracy code; 0 indicates that a record of accuracy does not - * exist and that no record type C will follow. */ - fprintf(fd, "%24d", 0); - - /* DEM spacial resolution. Usually (3,3) (3,6) or (3,9) - * depending on latitude */ - fprintf(fd, "%12.6E", 30.0); - fprintf(fd, "%12.6E", 30.0); - - /* accuracy code */ - fprintf(fd, "%12.6E", 1.0); - - /* dimension of arrays to follow (1)*/ - fprintf(fd, "%6d", 1); - - /* number of profiles */ - fprintf(fd, "%6d", 3600 / raw->ydim + 1); - - /* pad the end */ - fprintf(fd, "%160s", ""); - - - /* Dump "B" records */ - - for ( j = 0; j <= 120; j++ ) { - /* row / column id of this profile */ - fprintf(fd, "%6d%6d", 1, j + 1); - - /* Number of rows and columns (elevation points) in this - profile */ - fprintf(fd, "%6d%6d", 3600 / raw->xdim + 1, 1); - - /* Ground planimetric coordinates (arc-seconds) of the first - * elevation in the profile */ - fprintf(fd, "%20.15fD+06", ilon * 3600.0 / 1000000.0); - fprintf(fd, "%20.15fD+06", (ilat * 3600.0 + j * raw->ydim) / 1000000.0); - - /* Elevation of local datum for the profile. Always zero for - * 1-degree DEM, the reference is mean sea level. */ - fprintf(fd, "%6.1f", 0.0); - fprintf(fd, "%18s", ""); - - /* Minimum and maximum elevations for the profile. */ - fprintf(fd, " %20.15E", 0.0); - fprintf(fd, " %20.15E", 0.0); - - /* One (usually) dimensional array (1,prof_num_cols) of - elevations */ - for ( i = 0; i <= 120; i++ ) { - fprintf(fd, "%6.0f", raw->edge[j][i]); - } - } - - fprintf(fd, "\n"); - - fclose(fd); -} - - -/* Read a horizontal strip of (1 vertical degree) from the raw DEM - * file specified by the upper latitude of the stripe specified in - * degrees. The output the individual ASCII format DEM tiles. */ -void rawProcessStrip( fgRAWDEM *raw, int lat_degrees, char *path ) { - int lat, yrange; - int i, j, index, row, col; - int min, max; - int span, num_degrees, tile_width; - int xstart, xend; - - /* convert to arcsec */ - lat = lat_degrees * 3600; - - printf("Max Latitude = %d arcsec\n", lat); - - /* validity check ... */ - if ( (lat > raw->rooty) || - (lat < (raw->rooty - raw->nrows * raw->ydim + 1)) ) { - printf("Latitude out of range for this DEM file\n"); - return; - } - - printf ("Reading strip starting at %d (top and working down)\n", lat); - - /* advance to the correct latitude */ - rawAdvancePosition(raw, (raw->rooty - lat)); - - /* printf("short = %d\n", sizeof(short)); */ - - yrange = 3600 / raw->ydim; - - for ( i = 0; i < yrange; i++ ) { - index = yrange - i - 1; - /* printf("About to read into row %d\n", index); */ - rawReadNextRow(raw, index); - - for ( j = 0; j < raw->ncols; j++ ) { - if ( raw->strip[index][j] == -9999 ) { - /* map ocean to 0 for now */ - raw->strip[index][j] = 0; - } - } - } - - /* extract individual tiles from the strip */ - span = raw->ncols * raw->xdim; - num_degrees = span / 3600; - tile_width = raw->ncols / num_degrees; - printf("span = %d num_degrees = %d width = %d\n", - span, num_degrees, tile_width); - - for ( i = 0; i < num_degrees; i++ ) { - xstart = i * tile_width; - xend = xstart + 120; - - min = 10000; max = -10000; - for ( row = 0; row < yrange; row++ ) { - for ( col = xstart; col < xend; col++ ) { - /* Copy from strip to pixel centered tile. Yep, - * row/col are reversed here. raw->strip is backwards - * for convenience. I am converting to [x,y] now. */ - raw->center[col-xstart][row] = raw->strip[row][col]; - - if ( raw->strip[row][col] < min) { - min = raw->strip[row][col]; - } - - if ( raw->strip[row][col] > max) { - max = raw->strip[row][col]; - } - } - } - - raw->tmp_min = min; - raw->tmp_max = max; - - /* Convert from pixel centered to pixel edge values */ - rawConvertCenter2Edge(raw); - - /* Dump out the ascii format DEM file */ - rawDumpAsciiDEM(raw, path, (raw->rootx / 3600) + i, lat_degrees - 1); - } -} - - diff --git a/Tools/Prep/DemRaw2ascii/rawdem.h b/Tools/Prep/DemRaw2ascii/rawdem.h deleted file mode 100644 index 5fe6a4c3e..000000000 --- a/Tools/Prep/DemRaw2ascii/rawdem.h +++ /dev/null @@ -1,76 +0,0 @@ -/* rawdem.h -- library of routines for processing raw dem files (30 arcsec) - * - * Written by Curtis Olson, started February 1998. - * - * Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id$ - */ - - -#ifndef _RAWDEM_H -#define _RAWDEM_H - - -#define MAX_ROWS 6000 -#define MAX_COLS 7200 -#define MAX_COLS_X_2 14400 - -typedef struct { - /* header info */ - int nrows; /* number of rows */ - int ncols; /* number of cols */ - int ulxmap; /* X coord of center of upper left pixel in arcsec */ - int ulymap; /* Y coord of center of upper left pixel in arcsec */ - int rootx; /* X coord of upper left *edge* of DEM region in degrees */ - int rooty; /* Y coord of upper left *edge* of DEM region in degrees */ - int xdim; /* X dimension of a pixel */ - int ydim; /* Y dimension of a pixel */ - int tmp_min; /* current 1x1 degree tile minimum */ - int tmp_max; /* current 1x1 degree tile maximum */ - - /* file ptr */ - int fd; /* Raw DEM file descriptor */ - - /* storage area for a 1 degree high strip of data. Note, for - * convenience this is in y,x order */ - short strip[120][MAX_ROWS]; - - short center[120][120]; /* tile with data taken at center of pixel */ - float edge[121][121]; /* tile with data converted to corners */ -} fgRAWDEM; - - -/* Read the DEM header to determine various key parameters for this - * DEM file */ -void rawReadDemHdr( fgRAWDEM *raw, char *hdr_file ); - -/* Open a raw DEM file. */ -void rawOpenDemFile( fgRAWDEM *raw, char *raw_dem_file ); - -/* Close a raw DEM file. */ -void rawCloseDemFile( fgRAWDEM *raw ); - -/* Read a horizontal strip of (1 vertical degree) from the raw DEM - * file specified by the upper latitude of the stripe specified in - * degrees. The output the individual ASCII format DEM tiles. */ -void rawProcessStrip( fgRAWDEM *raw, int lat_degrees, char *path ); - - -#endif /* _RAWDEM_H */ - - diff --git a/Tools/Prep/GenAirports/Makefile.am b/Tools/Prep/GenAirports/Makefile.am deleted file mode 100644 index 2cae86fb2..000000000 --- a/Tools/Prep/GenAirports/Makefile.am +++ /dev/null @@ -1,45 +0,0 @@ -#--------------------------------------------------------------------------- -# Makefile -# -# Written by Curtis Olson, started January 1998. -# -# Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id$ -#--------------------------------------------------------------------------- - - -bin_PROGRAMS = genapts - -genapts_SOURCES = \ - area.cxx area.hxx \ - convex_hull.cxx convex_hull.hxx \ - main.cxx \ - point2d.cxx point2d.hxx - -genapts_LDADD = \ - $(top_builddir)/Tools/Lib/Polygon/libPolygon.a \ - $(top_builddir)/Lib/Bucket/libBucket.a \ - $(top_builddir)/Lib/Debug/libDebug.a \ - $(top_builddir)/Lib/Misc/libMisc.a \ - $(top_builddir)/Lib/zlib/libz.a \ - $(base_LIBS) - -INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib -I$(top_builddir)/Tools/Lib - - -#--------------------------------------------------------------------------- diff --git a/Tools/Prep/GenAirports/area.cxx b/Tools/Prep/GenAirports/area.cxx deleted file mode 100644 index 341d64c9e..000000000 --- a/Tools/Prep/GenAirports/area.cxx +++ /dev/null @@ -1,218 +0,0 @@ -// area.c -- routines to assist with inserting "areas" into FG terrain -// -// Written by Curtis Olson, started March 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ -// - - -#include -#include - -#include - -#include "area.hxx" -#include "point2d.hxx" - - -// calc new x, y for a rotation -double rot_x(double x, double y, double theta) { - return ( x * cos(theta) + y * sin(theta) ); -} - - -// calc new x, y for a rotation -double rot_y(double x, double y, double theta) { - return ( -x * sin(theta) + y * cos(theta) ); -} - - -// calc new lon/lat given starting lon/lat, and offset radial, and -// distance. NOTE: distance is specified in meters (and converted -// internally to radians) -point2d calc_lon_lat( point2d orig, point2d offset ) { - point2d result; - - // printf("calc_lon_lat() offset.theta = %.2f offset.dist = %.2f\n", - // offset.theta, offset.dist); - - offset.dist *= METER_TO_NM * NM_TO_RAD; - - result.lat = asin( sin(orig.lat) * cos(offset.dist) + - cos(orig.lat) * sin(offset.dist) * cos(offset.theta) ); - - if ( cos(result.lat) < FG_EPSILON ) { - result.lon = orig.lon; // endpoint a pole - } else { - result.lon = - fmod(orig.lon - asin( sin(offset.theta) * sin(offset.dist) / - cos(result.lat) ) + FG_PI, FG_2PI) - FG_PI; - } - - return(result); -} - - -list < point2d > -batch_cart_to_polar_2d( list < point2d > in_list) -{ - list < point2d > out_list; - list < point2d > :: iterator current; - list < point2d > :: iterator last; - point2d p; - - current = in_list.begin(); - last = in_list.end(); - for ( ; current != last ; ++current ) { - p = cart_to_polar_2d( *current ); - out_list.push_back(p); - } - - return out_list; -} - - -// given a set of 2d coordinates relative to a center point, and the -// lon, lat of that center point (specified in degrees), as well as a -// potential orientation angle, generate the corresponding lon and lat -// of the original 2d verticies. -list < point2d > -gen_area(point2d origin, double angle, list < point2d > cart_list) -{ - list < point2d > rad_list; - list < point2d > result_list; - list < point2d > :: iterator current; - list < point2d > :: iterator last; - point2d origin_rad, p; - - origin_rad.lon = origin.lon * DEG_TO_RAD; - origin_rad.lat = origin.lat * DEG_TO_RAD; - - // convert to polar coordinates - rad_list = batch_cart_to_polar_2d(cart_list); - - /* - // display points - printf("converted to polar\n"); - current = rad_list.begin(); - last = rad_list.end(); - while ( current != last ) { - printf("(%.2f, %.2f)\n", current->theta, current->dist); - ++current; - } - printf("\n"); - */ - - // rotate by specified angle - // printf("Rotating points by %.2f\n", angle); - current = rad_list.begin(); - last = rad_list.end(); - for ( ; current != last ; ++current ) { - current->theta -= angle; - while ( current->theta > FG_2PI ) { - current->theta -= FG_2PI; - // (*current).theta -= angle; - // while ( (*current).theta > FG_2PI ) { - // (*current).theta -= FG_2PI; - } - // printf("(%.2f, %.2f)\n", current->theta, current->dist); - } - // printf("\n"); - - // find actual lon,lat of coordinates - // printf("convert to lon, lat relative to %.2f %.2f\n", - // origin.lon, origin.lat); - current = rad_list.begin(); - last = rad_list.end(); - for ( ; current != last ; ++current ) { - p = calc_lon_lat(origin_rad, *current); - // convert from radians to degress - p.lon *= RAD_TO_DEG; - p.lat *= RAD_TO_DEG; - // printf("(%.8f, %.8f)\n", p.lon, p.lat); - result_list.push_back(p); - } - // printf("\n"); - - return result_list; -} - - -// generate an area for a runway -list < point2d > -gen_runway_area( double lon, double lat, double heading, - double length, double width) -{ - list < point2d > result_list; - list < point2d > tmp_list; - list < point2d > :: iterator current; - list < point2d > :: iterator last; - - point2d p; - point2d origin; - double l, w; - int i; - - /* - printf("runway: lon = %.2f lat = %.2f hdg = %.2f len = %.2f width = %.2f\n", - lon, lat, heading, length, width); - */ - - origin.lon = lon; - origin.lat = lat; - l = length / 2.0; - w = width / 2.0; - - // generate untransformed runway area vertices - p.x = l; p.y = w; tmp_list.push_back(p); - p.x = l; p.y = -w; tmp_list.push_back(p); - p.x = -l; p.y = -w; tmp_list.push_back(p); - p.x = -l; p.y = w; tmp_list.push_back(p); - - /* - // display points - printf("Untransformed, unrotated runway\n"); - current = tmp_list.begin(); - last = tmp_list.end(); - while ( current != last ) { - printf("(%.2f, %.2f)\n", current->x, current->y); - ++current; - } - printf("\n"); - */ - - // rotate, transform, and convert points to lon, lat in degrees - result_list = gen_area(origin, heading, tmp_list); - - /* - // display points - printf("Results in radians.\n"); - current = result_list.begin(); - last = result_list.end(); - while ( current != last ) { - printf("(%.8f, %.8f)\n", current->lon, current->lat); - ++current; - } - printf("\n"); - */ - - return result_list; -} - - diff --git a/Tools/Prep/GenAirports/area.hxx b/Tools/Prep/GenAirports/area.hxx deleted file mode 100644 index 147359a66..000000000 --- a/Tools/Prep/GenAirports/area.hxx +++ /dev/null @@ -1,42 +0,0 @@ -// area.h -- routines to assist with inserting "areas" into FG terrain -// -// Written by Curtis Olson, started February 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ -// - - -#ifndef _AREA_H -#define _AREA_H - - -#include - -#include "point2d.hxx" - - -// generate an area for a runway (return result points in degrees) -list < point2d > -gen_runway_area( double lon, double lat, double heading, - double length, double width); - - -#endif // _AREA_H - - diff --git a/Tools/Prep/GenAirports/convex_hull.cxx b/Tools/Prep/GenAirports/convex_hull.cxx deleted file mode 100644 index 2160f5147..000000000 --- a/Tools/Prep/GenAirports/convex_hull.cxx +++ /dev/null @@ -1,256 +0,0 @@ -// convex_hull.cxx -- calculate the convex hull of a set of points -// -// Written by Curtis Olson, started September 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ -// - - -#include -#include - -#include -#include - -#ifdef NEEDNAMESPACESTD -using namespace std; -#endif - -#include - -#include "convex_hull.hxx" -#include "point2d.hxx" - - -// stl map typedefs -typedef map < double, double, less > map_container; -typedef map_container::iterator map_iterator; - - -// Calculate theta of angle (a, b, c) -double calc_angle(point2d a, point2d b, point2d c) { - point2d u, v; - double udist, vdist, uv_dot, tmp; - - // u . v = ||u|| * ||v|| * cos(theta) - - u.x = b.x - a.x; - u.y = b.y - a.y; - udist = sqrt( u.x * u.x + u.y * u.y ); - // printf("udist = %.6f\n", udist); - - v.x = b.x - c.x; - v.y = b.y - c.y; - vdist = sqrt( v.x * v.x + v.y * v.y ); - // printf("vdist = %.6f\n", vdist); - - uv_dot = u.x * v.x + u.y * v.y; - // printf("uv_dot = %.6f\n", uv_dot); - - tmp = uv_dot / (udist * vdist); - // printf("tmp = %.6f\n", tmp); - - return acos(tmp); -} - - -// Test to see if angle(Pa, Pb, Pc) < 180 degrees -bool test_point(point2d Pa, point2d Pb, point2d Pc) { - point2d origin, a, b, c; - double a1, a2; - - origin.x = origin.y = 0.0; - - a.x = cos(Pa.theta) * Pa.dist; - a.y = sin(Pa.theta) * Pa.dist; - - b.x = cos(Pb.theta) * Pb.dist; - b.y = sin(Pb.theta) * Pb.dist; - - c.x = cos(Pc.theta) * Pc.dist; - c.y = sin(Pc.theta) * Pc.dist; - - // printf("a is %.6f %.6f\n", a.x, a.y); - // printf("b is %.6f %.6f\n", b.x, b.y); - // printf("c is %.6f %.6f\n", c.x, c.y); - - a1 = calc_angle(a, b, origin); - a2 = calc_angle(origin, b, c); - - // printf("a1 = %.2f a2 = %.2f\n", a1 * RAD_TO_DEG, a2 * RAD_TO_DEG); - - return ( (a1 + a2) < FG_PI ); -} - - -// calculate the convex hull of a set of points, return as a list of -// point2d. The algorithm description can be found at: -// http://riot.ieor.berkeley.edu/riot/Applications/ConvexHull/CHDetails.html -list_container convex_hull( list_container input_list ) -{ - list_iterator current, last; - map_iterator map_current, map_next, map_next_next, map_last; - - // list of translated points - list_container trans_list; - - // points sorted by radian degrees - map_container radians_map; - - // will contain the convex hull - list_container con_hull; - - point2d p, average, Pa, Pb, Pc, result; - double sum_x, sum_y; - int in_count, last_size; - - // STEP ONE: Find an average midpoint of the input set of points - current = input_list.begin(); - last = input_list.end(); - in_count = input_list.size(); - sum_x = sum_y = 0.0; - - for ( ; current != last ; ++current ) { - sum_x += (*current).x; - sum_y += (*current).y; - } - - average.x = sum_x / in_count; - average.y = sum_y / in_count; - - // printf("Average center point is %.4f %.4f\n", average.x, average.y); - - // STEP TWO: Translate input points so average is at origin - current = input_list.begin(); - last = input_list.end(); - trans_list.erase( trans_list.begin(), trans_list.end() ); - - for ( ; current != last ; ++current ) { - p.x = (*current).x - average.x; - p.y = (*current).y - average.y; - // printf("%.6f %.6f\n", p.x, p.y); - trans_list.push_back(p); - } - - // STEP THREE: convert to radians and sort by theta - current = trans_list.begin(); - last = trans_list.end(); - radians_map.erase( radians_map.begin(), radians_map.end() ); - - for ( ; current != last ; ++current) { - p = cart_to_polar_2d(*current); - if ( p.dist > radians_map[p.theta] ) { - radians_map[p.theta] = p.dist; - } - } - - // printf("Sorted list\n"); - map_current = radians_map.begin(); - map_last = radians_map.end(); - for ( ; map_current != map_last ; ++map_current ) { - p.x = (*map_current).first; - p.y = (*map_current).second; - - // printf("p is %.6f %.6f\n", p.x, p.y); - } - - // STEP FOUR: traverse the sorted list and eliminate everything - // not on the perimeter. - // printf("Traversing list\n"); - - // double check list size ... this should never fail because a - // single runway will always generate four points. - if ( radians_map.size() < 3 ) { - cout << "convex hull not possible with < 3 points" << endl; - exit(-1); - } - - // ensure that we run the while loop at least once - last_size = radians_map.size() + 1; - - while ( last_size > radians_map.size() ) { - // printf("Running an iteration of the graham scan algorithm\n"); - last_size = radians_map.size(); - - map_current = radians_map.begin(); - while ( map_current != radians_map.end() ) { - // get first element - Pa.theta = (*map_current).first; - Pa.dist = (*map_current).second; - - // get second element - map_next = map_current; - ++map_next; - if ( map_next == radians_map.end() ) { - map_next = radians_map.begin(); - } - Pb.theta = (*map_next).first; - Pb.dist = (*map_next).second; - - // get third element - map_next_next = map_next; - ++map_next_next; - if ( map_next_next == radians_map.end() ) { - map_next_next = radians_map.begin(); - } - Pc.theta = (*map_next_next).first; - Pc.dist = (*map_next_next).second; - - // printf("Pa is %.6f %.6f\n", Pa.theta, Pa.dist); - // printf("Pb is %.6f %.6f\n", Pb.theta, Pb.dist); - // printf("Pc is %.6f %.6f\n", Pc.theta, Pc.dist); - - if ( test_point(Pa, Pb, Pc) ) { - // printf("Accepted a point\n"); - // accept point, advance Pa, Pb, and Pc. - ++map_current; - } else { - // printf("REJECTED A POINT\n"); - // reject point, delete it and advance only Pb and Pc - map_next = map_current; - ++map_next; - if ( map_next == radians_map.end() ) { - map_next = radians_map.begin(); - } - radians_map.erase( map_next ); - } - } - } - - // translate back to correct lon/lat - // printf("Final sorted convex hull\n"); - con_hull.erase( con_hull.begin(), con_hull.end() ); - map_current = radians_map.begin(); - map_last = radians_map.end(); - for ( ; map_current != map_last ; ++map_current ) { - p.theta = (*map_current).first; - p.dist = (*map_current).second; - - result.x = cos(p.theta) * p.dist + average.x; - result.y = sin(p.theta) * p.dist + average.y; - - // printf("%.6f %.6f\n", result.x, result.y); - - con_hull.push_back(result); - } - - return con_hull; -} - - diff --git a/Tools/Prep/GenAirports/convex_hull.hxx b/Tools/Prep/GenAirports/convex_hull.hxx deleted file mode 100644 index 292c15968..000000000 --- a/Tools/Prep/GenAirports/convex_hull.hxx +++ /dev/null @@ -1,51 +0,0 @@ -// convex_hull.hxx -- calculate the convex hull of a set of points -// -// Written by Curtis Olson, started September 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ -// - - -#ifndef _CONVEX_HULL_HXX -#define _CONVEX_HULL_HXX - - -#include - -#ifdef NEEDNAMESPACESTD -using namespace std; -#endif - -#include "point2d.hxx" - - -// stl list typedefs -typedef list < point2d > list_container; -typedef list_container::iterator list_iterator; - - -// calculate the convex hull of a set of points, return as a list of -// point2d. The algorithm description can be found at: -// http://riot.ieor.berkeley.edu/riot/Applications/ConvexHull/CHDetails.html -list_container convex_hull( list_container input_list ); - - -#endif // _CONVEX_HULL_HXX - - diff --git a/Tools/Prep/GenAirports/main.cxx b/Tools/Prep/GenAirports/main.cxx deleted file mode 100644 index 978a152d6..000000000 --- a/Tools/Prep/GenAirports/main.cxx +++ /dev/null @@ -1,352 +0,0 @@ -// main.cxx -- main loop -// -// Written by Curtis Olson, started March 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ -// - - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#ifdef HAVE_STDLIB_H -#include -#endif - -#include -#include -#include -#include STL_STRING - -#include -#include -#include -#include -#include - -#include "area.hxx" -#include "convex_hull.hxx" - - -// write out airport data -void write_airport( long int p_index, list_container hull_list, FGBucket b, - const string& root, const bool cut_and_keep ) { - char tile_name[256], poly_index[256]; - - string base = b.gen_base_path(); - string path = root + "/Scenery/" + base; - string command = "mkdir -p " + path; - system( command.c_str() ); - - long int b_index = b.gen_index(); - sprintf(tile_name, "%ld", b_index); - string aptfile = path + "/" + tile_name; - - sprintf( poly_index, "%ld", p_index ); - aptfile += "."; - aptfile += poly_index; - cout << "apt file = " << aptfile << endl; - - FILE *fd; - if ( (fd = fopen(aptfile.c_str(), "a")) == NULL ) { - cout << "Cannot open file: " << aptfile << endl; - exit(-1); - } - - // polygon type - if ( cut_and_keep ) { - fprintf( fd, "AirportKeep\n" ); - } else { - fprintf( fd, "AirportIgnore\n" ); - } - - // number of contours - fprintf( fd, "1\n" ); - - // size of first contour - fprintf( fd, "%d\n", hull_list.size() ); - - // hole flag - fprintf( fd, "%d\n", 0 ); // not a hole - - // write contour (polygon) points - list_iterator current = hull_list.begin(); - list_iterator last = hull_list.end(); - for ( ; current != last ; ++current ) { - fprintf( fd, "%.7f %.7f\n", (*current).lon, (*current).lat ); - } - - fclose(fd); -} - - -// process and airport + runway list -void process_airport( string airport, list < string > & runway_list, - const string& root ) { - list_container rwy_list, apt_list, hull_list; - list_iterator current, last; - - // parse main airport information - int elev; - - cout << airport << endl; - string apt_type = airport.substr(0, 1); - string apt_code = airport.substr(2, 4); - string apt_lat = airport.substr(7, 10); - string apt_lon = airport.substr(18, 11); - string apt_elev = airport.substr(30, 5); - sscanf( apt_elev.c_str(), "%d", &elev ); - string apt_use = airport.substr(36, 1); - string apt_twr = airport.substr(37, 1); - string apt_bldg = airport.substr(38, 1); - string apt_name = airport.substr(40); - - /* - cout << " type = " << apt_type << endl; - cout << " code = " << apt_code << endl; - cout << " lat = " << apt_lat << endl; - cout << " lon = " << apt_lon << endl; - cout << " elev = " << apt_elev << " " << elev << endl; - cout << " use = " << apt_use << endl; - cout << " twr = " << apt_twr << endl; - cout << " bldg = " << apt_bldg << endl; - cout << " name = " << apt_name << endl; - */ - - // Ignore any seaplane bases - if ( apt_type == "S" ) { - return; - } - - // parse runways and generate the vertex list - string rwy_str; - double lon, lat, hdg; - int len, width; - - list < string >::iterator last_runway = runway_list.end(); - for ( list < string >::iterator current_runway = runway_list.begin(); - current_runway != last_runway ; ++current_runway ) { - rwy_str = (*current_runway); - - cout << rwy_str << endl; - string rwy_no = rwy_str.substr(2, 4); - string rwy_lat = rwy_str.substr(6, 10); - sscanf( rwy_lat.c_str(), "%lf", &lat); - string rwy_lon = rwy_str.substr(17, 11); - sscanf( rwy_lon.c_str(), "%lf", &lon); - string rwy_hdg = rwy_str.substr(29, 7); - sscanf( rwy_hdg.c_str(), "%lf", &hdg); - string rwy_len = rwy_str.substr(36, 7); - sscanf( rwy_len.c_str(), "%d", &len); - string rwy_width = rwy_str.substr(43, 4); - sscanf( rwy_width.c_str(), "%d", &width); - string rwy_sfc = rwy_str.substr(47, 4); - string rwy_end1 = rwy_str.substr(52, 8); - string rwy_end2 = rwy_str.substr(61, 8); - - /* - cout << " no = " << rwy_no << endl; - cout << " lat = " << rwy_lat << " " << lat << endl; - cout << " lon = " << rwy_lon << " " << lon << endl; - cout << " hdg = " << rwy_hdg << " " << hdg << endl; - cout << " len = " << rwy_len << " " << len << endl; - cout << " width = " << rwy_width << " " << width << endl; - cout << " sfc = " << rwy_sfc << endl; - cout << " end1 = " << rwy_end1 << endl; - cout << " end2 = " << rwy_end2 << endl; - */ - - rwy_list = gen_runway_area( lon, lat, hdg * DEG_TO_RAD, - (double)len * FEET_TO_METER, - (double)width * FEET_TO_METER ); - - // add rwy_list to apt_list - current = rwy_list.begin(); - last = rwy_list.end(); - for ( ; current != last ; ++current ) { - apt_list.push_back(*current); - } - } - - if ( apt_list.size() == 0 ) { - cout << "no runway points generated" << endl; - return; - } - - // printf("Runway points in degrees\n"); - // current = apt_list.begin(); - // last = apt_list.end(); - // for ( ; current != last; ++current ) { - // printf( "%.5f %.5f\n", current->lon, current->lat ); - // } - // printf("\n"); - - // generate convex hull - hull_list = convex_hull(apt_list); - - // get next polygon index - long int index = poly_index_next(); - - // find average center, min, and max point of convex hull - point2d average, min, max; - double sum_x, sum_y; - int count = hull_list.size(); - current = hull_list.begin(); - last = hull_list.end(); - sum_x = sum_y = 0.0; - min.x = min.y = 200.0; - max.x = max.y = -200.0; - for ( ; current != last; ++current ) { - // printf("return = %.6f %.6f\n", (*current).x, (*current).y); - sum_x += (*current).x; - sum_y += (*current).y; - - if ( (*current).x < min.x ) { min.x = (*current).x; } - if ( (*current).y < min.y ) { min.y = (*current).y; } - if ( (*current).x > max.x ) { max.x = (*current).x; } - if ( (*current).y > max.y ) { max.y = (*current).y; } - } - average.x = sum_x / count; - average.y = sum_y / count; - - // find buckets for center, min, and max points of convex hull. - // note to self: self, you should think about checking for runways - // that span the data line - FGBucket b(average.lon, average.lat); - FGBucket b_min(min.x, min.y); - FGBucket b_max(max.x, max.y); - cout << "Bucket center = " << b << endl; - cout << "Bucket min = " << b_min << endl; - cout << "Bucket max = " << b_max << endl; - - if ( b_min == b_max ) { - write_airport( index, hull_list, b, root, true ); - } else { - FGBucket b_cur; - int dx, dy, i, j; - - fgBucketDiff(b_min, b_max, &dx, &dy); - cout << "airport spans tile boundaries" << endl; - cout << " dx = " << dx << " dy = " << dy << endl; - - if ( (dx > 2) || (dy > 2) ) { - cout << "somethings really wrong!!!!" << endl; - exit(-1); - } - - for ( j = 0; j <= dy; j++ ) { - for ( i = 0; i <= dx; i++ ) { - b_cur = fgBucketOffset(min.x, min.y, i, j); - if ( b_cur == b ) { - write_airport( index, hull_list, b_cur, root, true ); - } else { - write_airport( index, hull_list, b_cur, root, true ); - } - } - } - // string answer; cin >> answer; - } -} - - -// reads the apt_full file and extracts and processes the individual -// airport records -int main( int argc, char **argv ) { - list < string > runway_list; - string airport, last_airport; - string line; - char tmp[256]; - - fglog().setLogLevels( FG_ALL, FG_DEBUG ); - - if ( argc != 3 ) { - FG_LOG( FG_GENERAL, FG_ALERT, - "Usage " << argv[0] << " " ); - exit(-1); - } - - // make work directory - string work_dir = argv[2]; - string command = "mkdir -p " + work_dir; - system( command.c_str() ); - - // initialize persistant polygon counter - string counter_file = work_dir + "/../work.counter"; - poly_index_init( counter_file ); - - fg_gzifstream in( argv[1] ); - if ( !in ) { - FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << argv[1] ); - exit(-1); - } - - // throw away the first 3 lines - in.getline(tmp, 256); - in.getline(tmp, 256); - in.getline(tmp, 256); - - last_airport = ""; - - while ( ! in.eof() ) { - in.getline(tmp, 256); - line = tmp; - // cout << line << endl; - - if ( line.length() == 0 ) { - // empty, skip - } else if ( line[0] == '#' ) { - // comment, skip - } else if ( (line[0] == 'A') || (line[0] == 'S') ) { - // start of airport record - airport = line; - - if ( last_airport.length() ) { - // process previous record - process_airport(last_airport, runway_list, argv[2]); - } - - // clear runway list for start of next airport - runway_list.erase(runway_list.begin(), runway_list.end()); - - last_airport = airport; - } else if ( line[0] == 'R' ) { - // runway entry - runway_list.push_back(line); - } else if ( line == "[End]" ) { - // end of file - break; - } else { - FG_LOG( FG_GENERAL, FG_ALERT, - "Unknown line in file" << endl << line ); - exit(-1); - } - } - - if ( last_airport.length() ) { - // process previous record - process_airport(last_airport, runway_list, argv[2]); - } - - return 0; -} - - diff --git a/Tools/Prep/GenAirports/point2d.cxx b/Tools/Prep/GenAirports/point2d.cxx deleted file mode 100644 index 9f5b5da43..000000000 --- a/Tools/Prep/GenAirports/point2d.cxx +++ /dev/null @@ -1,39 +0,0 @@ -// point2d.cxx -- 2d coordinate routines -// -// Written by Curtis Olson, started September 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ -// - - -#include - -#include "point2d.hxx" - - -// convert a point from cartesian to polar coordinates -point2d cart_to_polar_2d(point2d in) { - point2d result; - result.dist = sqrt( in.x * in.x + in.y * in.y ); - result.theta = atan2(in.y, in.x); - - return(result); -} - - diff --git a/Tools/Prep/GenAirports/point2d.hxx b/Tools/Prep/GenAirports/point2d.hxx deleted file mode 100644 index b97a72f79..000000000 --- a/Tools/Prep/GenAirports/point2d.hxx +++ /dev/null @@ -1,53 +0,0 @@ -// point2d.hxx -- define a 2d point class -// -// Written by Curtis Olson, started February 1998. -// -// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ -// - - -#ifndef _POINT2D_HXX -#define _POINT2D_HXX - - -#include - - -class point2d { -public: - union { - double x; - double dist; - double lon; - }; - union { - double y; - double theta; - double lat; - }; -}; - - -// convert a point from cartesian to polar coordinates -point2d cart_to_polar_2d(point2d in); - - -#endif // _POINT2D_HXX - - diff --git a/Tools/Prep/Makefile.am b/Tools/Prep/Makefile.am deleted file mode 100644 index 96c87b412..000000000 --- a/Tools/Prep/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -SUBDIRS = \ - DemChop \ - DemInfo \ - DemRaw2ascii \ - GenAirports \ - ShapeFile diff --git a/Tools/Prep/ShapeFile/Makefile.am b/Tools/Prep/ShapeFile/Makefile.am deleted file mode 100644 index b3c41b82b..000000000 --- a/Tools/Prep/ShapeFile/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -bin_PROGRAMS = shape-decode - -shape_decode_SOURCES = main.cxx shape.cxx shape.hxx - -shape_decode_LDADD = \ - $(top_builddir)/Tools/Lib/Polygon/libPolygon.a \ - $(top_builddir)/Lib/Debug/libDebug.a \ - $(top_builddir)/Lib/Bucket/libBucket.a \ - $(top_builddir)/Lib/Misc/libMisc.a \ - $(top_builddir)/Lib/zlib/libz.a \ - -lgfc -lgpc - - -INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib -I$(top_builddir)/Tools/Lib diff --git a/Tools/Prep/ShapeFile/main.cxx b/Tools/Prep/ShapeFile/main.cxx deleted file mode 100644 index bca915ff2..000000000 --- a/Tools/Prep/ShapeFile/main.cxx +++ /dev/null @@ -1,330 +0,0 @@ -// main.cxx -- process shapefiles and extract polygon outlines, -// clipping against and sorting them into the revelant -// tiles. -// -// Written by Curtis Olson, started February 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -// Include Geographic Foundation Classes library - -// libgfc.a includes need this bit o' strangeness -#if defined ( linux ) -# define _LINUX_ -#endif -#include -#include -#include -#undef E -#undef DEG_TO_RAD -#undef RAD_TO_DEG - -// include Generic Polygon Clipping Library -extern "C" { -#include -} - -#include - -#include STL_STRING - -#include - -#include -#include -#include "shape.hxx" - - -// return the type of the shapefile record -AreaType get_shapefile_type(GDBFile *dbf, int rec) { - // GDBFieldDesc *fdesc[128]; // 128 is an arbitrary number here - GDBFValue *fields; //an array of field values - char* dbf_rec; //a record containing all the fields - - // grab the meta-information for all the fields - // this applies to all the records in the DBF file. - // for ( int i = 0; i < dbf->numFields(); i++ ) { - // fdesc[i] = dbf->getFieldDesc(i); - // cout << i << ") " << fdesc[i]->name << endl; - // } - - // this is the whole name record - dbf_rec = dbf->getRecord( rec ); - - // parse it into individual fields - if ( dbf_rec ) { - fields = dbf->recordDeform( dbf_rec ); - } else { - return UnknownArea; - } - - string area = fields[4].str_v; - // strip leading spaces - while ( area[0] == ' ' ) { - area = area.substr(1, area.length() - 1); - } - // strip trailing spaces - while ( area[area.length() - 1] == ' ' ) { - area = area.substr(0, area.length() - 1); - } - // strip other junk encountered - while ( (int)area[area.length() - 1] == 9 ) { - area = area.substr(0, area.length() - 1); - } - - return get_area_type( area ); -} - - -int main( int argc, char **argv ) { - gpc_polygon gpc_shape; - int i, j; - - fglog().setLogLevels( FG_ALL, FG_DEBUG ); - - if ( argc < 3 ) { - FG_LOG( FG_GENERAL, FG_ALERT, "Usage: " << argv[0] - << " [ area_string ]" ); - exit(-1); - } - - FG_LOG( FG_GENERAL, FG_DEBUG, "Opening " << argv[1] << " for reading." ); - - // make work directory - string work_dir = argv[2]; - string command = "mkdir -p " + work_dir; - system( command.c_str() ); - - // allow us to override the area type from the command line. All - // polygons in the processed shape file will be assigned this area - // type - string force_area_type = ""; - if ( argc == 4 ) { - force_area_type = argv[3]; - } - - // initialize persistant polygon counter - string counter_file = work_dir + "/../work.counter"; - poly_index_init( counter_file ); - - // initialize structure for building gpc polygons - shape_utils_init(); - - GShapeFile * sf = new GShapeFile( argv[1] ); - GDBFile *dbf = new GDBFile( argv[1] ); - string path = argv[2]; - - GPolygon shape; - double *coords; // in decimal degrees - int n_vertices; - - FG_LOG( FG_GENERAL, FG_INFO, "shape file records = " << sf->numRecords() ); - - GShapeFile::ShapeType t = sf->shapeType(); - if ( t != GShapeFile::av_Polygon ) { - FG_LOG( FG_GENERAL, FG_ALERT, "Can't handle non-polygon shape files" ); - exit(-1); - } - - for ( i = 0; i < sf->numRecords(); i++ ) { - //fetch i-th record (shape) - sf->getShapeRec(i, &shape); - FG_LOG( FG_GENERAL, FG_DEBUG, "Record = " << i << " rings = " - << shape.numRings() ); - - AreaType area; - if ( force_area_type.length() == 0 ) { - area = get_shapefile_type(dbf, i); - FG_LOG( FG_GENERAL, FG_DEBUG, "area type = " << get_area_name(area) - << " (" << (int)area << ")" ); - } - - FG_LOG( FG_GENERAL, FG_INFO, " record = " << i - << " ring = " << 0 ); - - if ( force_area_type.length() > 0 ) { - // interior of polygon is assigned to force_area_type, - // holes are maintained - - area = get_area_type( force_area_type ); - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == MarshArea ) { - // interior of polygon is marsh, holes are water - - // do main outline first - init_shape(&gpc_shape); - n_vertices = shape.getRing(0, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - - // do lakes (individually) next - for ( j = 1; j < shape.numRings(); j++ ) { - FG_LOG( FG_GENERAL, FG_INFO, " record = " << i - << " ring = " << j ); - init_shape(&gpc_shape); - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - process_shape(path, LakeArea, &gpc_shape); - free_shape(&gpc_shape); - } - } else if ( area == OceanArea ) { - // interior of polygon is ocean, holes are islands - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == LakeArea ) { - // interior of polygon is lake, holes are islands - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == DryLakeArea ) { - // interior of polygon is dry lake, holes are islands - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == IntLakeArea ) { - // interior of polygon is intermittent lake, holes are islands - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == ReservoirArea ) { - // interior of polygon is reservoir, holes are islands - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == IntReservoirArea ) { - // interior of polygon is intermittent reservoir, holes are islands - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == StreamArea ) { - // interior of polygon is stream, holes are islands - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == CanalArea ) { - // interior of polygon is canal, holes are islands - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == GlacierArea ) { - // interior of polygon is glacier, holes are dry land - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == VoidArea ) { - // interior is ???? - - // skip for now - FG_LOG( FG_GENERAL, FG_ALERT, "Void area ... SKIPPING!" ); - - if ( shape.numRings() > 1 ) { - FG_LOG( FG_GENERAL, FG_ALERT, " Void area with holes!" ); - // exit(-1); - } - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - // process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else if ( area == NullArea ) { - // interior is ???? - - // skip for now - FG_LOG( FG_GENERAL, FG_ALERT, "Null area ... SKIPPING!" ); - - if ( shape.numRings() > 1 ) { - FG_LOG( FG_GENERAL, FG_ALERT, " Null area with holes!" ); - // exit(-1); - } - - init_shape(&gpc_shape); - for ( j = 0; j < shape.numRings(); j++ ) { - n_vertices = shape.getRing(j, coords); - add_to_shape(n_vertices, coords, &gpc_shape); - } - // process_shape(path, area, &gpc_shape); - free_shape(&gpc_shape); - } else { - FG_LOG( FG_GENERAL, FG_ALERT, "Uknown area!" ); - exit(-1); - } - } - - return 0; -} - - diff --git a/Tools/Prep/ShapeFile/shape.cxx b/Tools/Prep/ShapeFile/shape.cxx deleted file mode 100644 index a36ddb8ad..000000000 --- a/Tools/Prep/ShapeFile/shape.cxx +++ /dev/null @@ -1,322 +0,0 @@ -// shape.cxx -- shape/gpc utils -// -// Written by Curtis Olson, started February 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#include - -#include STL_STRING - -#include -#include - -#include -#include -#include "shape.hxx" - - -#define FG_MAX_VERTICES 100000 -static gpc_vertex_list v_list; - - -class point2d { -public: - double x, y; -}; - - -static void clip_and_write_poly( string root, long int p_index, AreaType area, - FGBucket b, gpc_polygon *shape ) { - point2d c, min, max; - c.x = b.get_center_lon(); - c.y = b.get_center_lat(); - double span = bucket_span(c.y); - gpc_polygon base, result; - char tile_name[256], poly_index[256]; - - // calculate bucket dimensions - if ( (c.y >= -89.0) && (c.y < 89.0) ) { - min.x = c.x - span / 2.0; - max.x = c.x + span / 2.0; - min.y = c.y - FG_HALF_BUCKET_SPAN; - max.y = c.y + FG_HALF_BUCKET_SPAN; - } else if ( c.y < -89.0) { - min.x = -90.0; - max.x = -89.0; - min.y = -180.0; - max.y = 180.0; - } else if ( c.y >= 89.0) { - min.x = 89.0; - max.x = 90.0; - min.y = -180.0; - max.y = 180.0; - } else { - FG_LOG ( FG_GENERAL, FG_ALERT, - "Out of range latitude in clip_and_write_poly() = " << c.y ); - } - - FG_LOG( FG_GENERAL, FG_INFO, " (" << min.x << "," << min.y << ") (" - << max.x << "," << max.y << ")" ); - - // set up clipping tile - v_list.vertex[0].x = min.x; - v_list.vertex[0].y = min.y; - - v_list.vertex[1].x = max.x; - v_list.vertex[1].y = min.y; - - v_list.vertex[2].x = max.x; - v_list.vertex[2].y = max.y; - - v_list.vertex[3].x = min.x; - v_list.vertex[3].y = max.y; - - v_list.num_vertices = 4; - - base.num_contours = 0; - base.contour = NULL; - base.hole = NULL; - gpc_add_contour( &base, &v_list, 0 ); - - // FG_LOG( FG_GENERAL, FG_DEBUG, "base = 4 vertices" ); - - /* - FILE *bfp= fopen("base", "w"); - gpc_write_polygon(bfp, &base); - fclose(bfp); - */ - - gpc_polygon_clip(GPC_INT, &base, shape, &result); - - if ( result.num_contours > 0 ) { - long int t_index = b.gen_index(); - string path = root + "/Scenery/" + b.gen_base_path(); - string command = "mkdir -p " + path; - system( command.c_str() ); - - sprintf( tile_name, "%ld", t_index ); - string polyfile = path + "/" + tile_name; - - sprintf( poly_index, "%ld", p_index ); - polyfile += "."; - polyfile += poly_index; - - string poly_type = get_area_name( area ); - if ( poly_type == "Unknown" ) { - cout << "unknown area type in clip_and_write_poly()!" << endl; - exit(-1); - } - - FILE *rfp= fopen( polyfile.c_str(), "w" ); - fprintf( rfp, "%s\n", poly_type.c_str() ); - gpc_write_polygon( rfp, 1, &result ); - fclose( rfp ); - - // only free result if it is not empty - gpc_free_polygon(&result); - } - - gpc_free_polygon(&base); -} - - -// Initialize structure we use to create polygons for the gpc library -bool shape_utils_init() { - v_list.num_vertices = 0; - v_list.vertex = new gpc_vertex[FG_MAX_VERTICES];; - - return true; -} - - -// initialize a gpc_polygon -void init_shape(gpc_polygon *shape) { - shape->num_contours = 0; - shape->contour = NULL; - shape->hole = NULL; -} - - -// make a gpc_polygon, first contour is outline, remaining contours -// are holes -void add_to_shape(int count, double *coords, gpc_polygon *shape) { - - for ( int i = 0; i < count; i++ ) { - v_list.vertex[i].x = coords[i*2+0]; - v_list.vertex[i].y = coords[i*2+1]; - } - - v_list.num_vertices = count; - - if ( shape->num_contours == 0 ) { - // outline - gpc_add_contour( shape, &v_list, 0 ); - } else { - // hole - gpc_add_contour( shape, &v_list, 1 ); - } -} - - -// process shape (write polygon to all intersecting tiles) -void process_shape(string path, AreaType area, gpc_polygon *master_gpc_shape) { - point2d min, max; - long int index; - int i, j; - - min.x = min.y = 200.0; - max.x = max.y = -200.0; - - // find min/max of polygon - for ( i = 0; i < master_gpc_shape->num_contours; i++ ) { - for ( j = 0; j < master_gpc_shape->contour[i].num_vertices; j++ ) { - double x = master_gpc_shape->contour[i].vertex[j].x; - double y = master_gpc_shape->contour[i].vertex[j].y; - - if ( x < min.x ) { min.x = x; } - if ( y < min.y ) { min.y = y; } - if ( x > max.x ) { max.x = x; } - if ( y > max.y ) { max.y = y; } - } - } - - /* - FILE *sfp= fopen("shape", "w"); - gpc_write_polygon(sfp, master_gpc_shape); - fclose(sfp); - exit(-1); - */ - - // get next polygon index - index = poly_index_next(); - - FG_LOG( FG_GENERAL, FG_INFO, " min = " << min.x << "," << min.y - << " max = " << max.x << "," << max.y ); - - // find buckets for min, and max points of convex hull. - // note to self: self, you should think about checking for - // polygons that span the date line - FGBucket b_min(min.x, min.y); - FGBucket b_max(max.x, max.y); - FG_LOG( FG_GENERAL, FG_INFO, " Bucket min = " << b_min ); - FG_LOG( FG_GENERAL, FG_INFO, " Bucket max = " << b_max ); - - if ( b_min == b_max ) { - clip_and_write_poly( path, index, area, b_min, master_gpc_shape ); - } else { - FGBucket b_cur; - int dx, dy, i, j; - - fgBucketDiff(b_min, b_max, &dx, &dy); - FG_LOG( FG_GENERAL, FG_INFO, - " polygon spans tile boundaries" ); - FG_LOG( FG_GENERAL, FG_INFO, " dx = " << dx - << " dy = " << dy ); - - if ( (dx > 200) || (dy > 200) ) { - FG_LOG( FG_GENERAL, FG_ALERT, - "somethings really wrong!!!!" ); - exit(-1); - } - - for ( j = 0; j <= dy; j++ ) { - // for performance reasons, we'll clip out just this - // horizontal row, and clip all the tiles in this row - // against the smaller shape - - FG_LOG ( FG_GENERAL, FG_INFO, - "Generating clip row " << j << " of " << dy ); - - FGBucket b_clip = fgBucketOffset(min.x, min.y, 0, j); - gpc_polygon row, clip_row; - point2d c, clip_max, clip_min; - c.x = b_clip.get_center_lon(); - c.y = b_clip.get_center_lat(); - - // calculate bucket clip_min.y and clip_max.y - if ( (c.y >= -89.0) && (c.y < 89.0) ) { - clip_min.y = c.y - FG_HALF_BUCKET_SPAN; - clip_max.y = c.y + FG_HALF_BUCKET_SPAN; - } else if ( c.y < -89.0) { - clip_min.y = -90.0; - clip_max.y = -89.0; - } else if ( c.y >= 89.0) { - clip_min.y = 89.0; - clip_max.y = 90.0; - } else { - FG_LOG ( FG_GENERAL, FG_ALERT, - "Out of range latitude in clip_and_write_poly() = " - << c.y ); - } - clip_min.x = -180.0; - clip_max.x = 180.0; - - // set up clipping tile - v_list.vertex[0].x = clip_min.x; - v_list.vertex[0].y = clip_min.y; - - v_list.vertex[1].x = clip_max.x; - v_list.vertex[1].y = clip_min.y; - - v_list.vertex[2].x = clip_max.x; - v_list.vertex[2].y = clip_max.y; - - v_list.vertex[3].x = clip_min.x; - v_list.vertex[3].y = clip_max.y; - - v_list.num_vertices = 4; - - row.num_contours = 0; - row.contour = NULL; - row.hole = NULL; - gpc_add_contour( &row, &v_list, 0 ); - - clip_row.num_contours = 0; - clip_row.contour = NULL; - clip_row.hole = NULL; - - gpc_polygon_clip(GPC_INT, &row, master_gpc_shape, &clip_row); - - /* FILE *sfp = fopen("master_shape", "w"); - gpc_write_polygon(sfp, 0, master_gpc_shape); - fclose(sfp); - sfp = fopen("clip_row", "w"); - gpc_write_polygon(sfp, 0, &clip_row); - fclose(sfp); */ - - for ( i = 0; i <= dx; i++ ) { - b_cur = fgBucketOffset(min.x, min.y, i, j); - clip_and_write_poly( path, index, area, b_cur, &clip_row ); - } - gpc_free_polygon(&row); - gpc_free_polygon(&clip_row); - } - // string answer; cin >> answer; - } -} - - -// free a gpc_polygon -void free_shape(gpc_polygon *shape) { - gpc_free_polygon(shape); -} - - diff --git a/Tools/Prep/ShapeFile/shape.hxx b/Tools/Prep/ShapeFile/shape.hxx deleted file mode 100644 index 96009b5ec..000000000 --- a/Tools/Prep/ShapeFile/shape.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// shape.hxx -- shape/gpc utils -// -// Written by Curtis Olson, started February 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#ifndef _SHAPE_HXX -#define _SHAPE_HXX - - -// include Generic Polygon Clipping Library -extern "C" { -#include -} - -#include - - -// Initialize structure we use to create polygons for the gpc library -// this must be called once from main for any program that uses this library -bool shape_utils_init(); - - -// initialize a gpc_polygon -void init_shape(gpc_polygon *shape); - -// make a gpc_polygon -void add_to_shape(int count, double *coords, gpc_polygon *shape); - -// process shape (write polygon to all intersecting tiles) -void process_shape(string path, AreaType area, gpc_polygon *gpc_shape); - -// free a gpc_polygon -void free_shape(gpc_polygon *shape); - - -#endif // _SHAPE_HXX - - diff --git a/Tools/README b/Tools/README deleted file mode 100644 index 253e47e04..000000000 --- a/Tools/README +++ /dev/null @@ -1,75 +0,0 @@ -FG Scenery Tools README -======================= - -Contained here-in are the FG scenery creation tools. These can be -used to convert 3 arcsec ASCII format DEM files and 30 arcsec binary -format DEM files into Flight Gear scenery. - -Eventually these tools will expand to support insertion of airports, -roads, rivers, lakes, etc. - - -Building the Tools -================== - -These tools are compiled and tested under Linux. I'm all for -portability, but I just haven't been as motivated to port these tools, -since scenery creation is less of a general need ... especially at -this stage. However, if anyone wants to work on porting to other -platforms, I will be happy to incorporate patches. - -The process for building these tools is very similar to building the -main FG source code. - -1. Set the FG_ROOT, FG_ROOT_SRC, and FG_ROOT_LIB environment - variables. - -2. Run ``make depend'' - -3. Run ``make clean'' - -4. Run ``make'' - - -3 Arcsec ASCII DEM files -======================== - -Data files for the USA are available in this format from: - - http://edcwww.cr.usgs.gov/doc/edchome/ndcdb/ndcdb.html - -To generate FG scenery from one of these dem files, run: - - ./process-dem.pl dem-file-1 [ dem-file-2 ...] - -You can vary the error tolerance to control the level of detail (and -size) of the resulting scenery. Note, you must specify the error -tolerance squared. So, if you wish to allow up to a 10 meter error -margin (very high level of detail) you would specify a value of 100. -If you desire an error tolerance of 200 meters (medium detail level) -you would specify a value of 40000. - -The process-dem.pl script will automatically dump the resulting .obj -files in the proper directory tree. - - -30 Arcsec Binary DEM files -========================== - -These data files have world wide coverage and are available from: - - http://edcwww.cr.usgs.gov/landdaac/gtopo30/gtopo30.html - -To process these data files, you must first run: - - DemRaw2Ascii/raw2ascii - -For example: - - DemRaw2Ascii/raw2ascii /tmp/W020N90 asciidems/ - -This will create ASCII DEM files for each 1 degree x 1 degree area in -the specified output dir. - -Then, you can take these ascii dem files and feed them through the -same procedure you use with the 3 arcsec dem files. \ No newline at end of file diff --git a/Tools/Todo b/Tools/Todo deleted file mode 100644 index d056dfc03..000000000 --- a/Tools/Todo +++ /dev/null @@ -1,37 +0,0 @@ --------------------------------------------------------------------------- -| Done --------------------------------------------------------------------------- - -4/6/98 - fix 30 arcsec dem file processing - -4/6/98 - incorporate autoconf/automake build system - -1/10/98 - Split areas into smaller tiles - -1/14/98 - Don't create shared corners or edges if one already exists. - -1/14/98 - Reassemble triangles using only body, shared corners, and - shared edges. - -1/19/98 - Retro-fit tri2obj to use shared normals rather than regenerating - normals for shared vertices. - - --------------------------------------------------------------------------- -| Todo --------------------------------------------------------------------------- - -1/12/98 - Try reversing cw-wound strips rather than calling glFrontFace() - in the display list. - - gnuplot> set label "1" at 1,1 - gnuplot> set label "2" at 2,2 - - gnuplot> plot x - -1/21/98 - Generate an elevation quad tree. - -1/12/98 - Generate a face adjacency matrix - -1/21/98 - Remove internal shared edges and corners that are not needed - after an area is generated. diff --git a/Tools/Utils/Makedir/Makefile.am b/Tools/Utils/Makedir/Makefile.am deleted file mode 100644 index e93857cc0..000000000 --- a/Tools/Utils/Makedir/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -bin_PROGRAMS = makedir - -makedir_SOURCES = makedir.cxx - -makedir_LDADD = \ - $(top_builddir)/Lib/Bucket/libBucket.a \ - $(base_LIBS) - -INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib diff --git a/Tools/Utils/Makedir/makedir.cxx b/Tools/Utils/Makedir/makedir.cxx deleted file mode 100644 index 1bc7734cb..000000000 --- a/Tools/Utils/Makedir/makedir.cxx +++ /dev/null @@ -1,119 +0,0 @@ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifdef HAVE_STDLIB_H -#include -#endif - -#include -#include // stat() -#include // stat() - -#include - -#include - - - -#ifdef WIN32 -#ifndef TRUE - #define FALSE 0 - #define TRUE 1 -#endif - -char* PathDivider() -{ - return "\\"; -} // PathDivider - -void ReplaceDivider( char* path ) -{ - char div = PathDivider()[0]; - int i; - - if ( ! path ) - return; - if ( div == '/' ) - return; - - for ( i = 0; path[i]; i++ ) - if ( path[i] == '/' ) - path[i] = div; - -} // ReplaceDivider - -int Exists( char* path ) -{ - struct stat statbuff; - - ReplaceDivider( path ); - if ( path[strlen( path ) - 1] == ':' ) - return TRUE; - if ( _stat( path, &statbuff ) != 0 ) - return FALSE; - return TRUE; -} // Exists - - -void CreateDir( char* path ) -{ - if ( ! path || ! strlen( path ) ) - return; - ReplaceDivider( path ); - // see if the parent exists yet - int i; // looping index - string parent; // path to parent - - parent = path; - for ( i = strlen( parent.c_str() )-1; i >= 0; i-- ) - if ( parent[i] == PathDivider()[0] ) - { - parent[i] = '\0'; - break; - } - - if ( ! Exists( parent.c_str() ) ) - { - CreateDir( parent.c_str() ); - } - - if ( ! Exists( path ) ) - { - if (mkdir(path, S_IRWXU) != 0 ) - { - cout << "Could not create directory " << path << endl; - }else{ - cout << "CreateDir: " << path << endl; - } - } - -} // CreateDir - - -int main(int argc, char **argv) -{ - string root; - - if(argc != 2) - { - cout << "Makedir failed needs one argument\n"; - return(10); - } - root = argv[1]; - - CreateDir(root.c_str()); - - return(0); -} -#else - -int main(int argc, char **argv) -{ - cout << "This program is intended to work with windoze\n"; - cout << "Other platforms can use mkdir\n"; -} - -#endif // WIN32 - diff --git a/Tools/Utils/Makefile.am b/Tools/Utils/Makefile.am deleted file mode 100644 index 8d1ee7313..000000000 --- a/Tools/Utils/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -# SUBDIRS = Makedir - -EXTRA_DIST = mirror-dem diff --git a/Tools/Utils/convert.pl b/Tools/Utils/convert.pl deleted file mode 100755 index fe28671ea..000000000 --- a/Tools/Utils/convert.pl +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/local/bin/perl - -# do some star data file conversion - -$PI = 3.14159265358979323846; -$DEG_TO_RAD = $PI / 180.0; - -while ( <> ) { - chop; - ($name, $junk, $ra, $decl, $mag, $junk) = split(/,/); - - @RA = split(/:/, $ra); - @DECL = split(/:/, $decl); - - $new_ra = $RA[0] + ( $RA[1] / 60.0 ) + ( $RA[2] / 3600.0 ); - $new_decl = $DECL[0] + ( $DECL[1] / 60.0 ) + ( $DECL[2] / 3600.0 ); - - printf("%s,%.6f,%.6f,%.6f\n", $name, $new_ra * 15 * $DEG_TO_RAD, - $new_decl * $DEG_TO_RAD, $mag); -} diff --git a/Tools/Utils/mirror-dem b/Tools/Utils/mirror-dem deleted file mode 100644 index 4bd1fa7a9..000000000 --- a/Tools/Utils/mirror-dem +++ /dev/null @@ -1,29 +0,0 @@ -# Example parameter file for the Debian GNU/Linux "mirror" package -# -# This serves as an illustration for a valid mirror parameter file. See the -# man page mirror(1) and the files in /usr/doc/example/mirror/* for details. -# -# This is for illustration. It worked for me when I wrote it, but it might -# fail for you. No warranties whatsoever. Use at your own risk. -# -# Written by Dirk Eddelbuettel - -package=DEM-3-Arc-Sec - comment=USGS DEM files from ftp://edcftp.cr.usgs.gov/pub/data/DEM/250/ - # specify remote host and directory - site=edcftp.cr.usgs.gov - remote_dir=/pub/data/DEM/250/ - # specify local directory - local_dir=/stage/video/curt/DEM/250 - # inform this user about results - mail_to=curt - # compress these files (see perlre(1) for regular expressions) - compress_patt=\.*(Contents|Packages|Packages-Master)$ - # exclude these files or directories (see perlre(1) for reg. expr.) - # exclude_patt= - # preserve these files or directories (see perlre(1) for reg. expr.) - # delete_excl= - # do not delete if more than 20% of all files would vanish - max_delete_files=20% - # this speeds up the construction of the remote ls-lR by pruning - # recurse_hard=true diff --git a/Tools/process-dem.pl b/Tools/process-dem.pl deleted file mode 100755 index 7e83c7881..000000000 --- a/Tools/process-dem.pl +++ /dev/null @@ -1,544 +0,0 @@ -#!/usr/bin/perl - -#--------------------------------------------------------------------------- -# Toplevel script to automate DEM file processing and conversion -# -# Written by Curtis Olson, started January 1998. -# -# Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id$ -#--------------------------------------------------------------------------- - - -# format version number -$scenery_format_version = "0.1"; - -$max_area = 10000; # maximum triangle area -$remove_tmps = 1; - -$| = 1; # flush buffers after every write - -$do_dem2node = 1; -$do_triangle_1 = 1; -$do_fixnode = 1; -$do_splittris = 1; -$do_assemtris = 1; -$do_triangle_2 = 1; - -$do_tri2obj = 1; -$do_strips = 1; -$do_fixobj = 1; - -$do_install = 1; - - -if ( $#ARGV < 3 ) { - die "Usage: $0 dem-file(s)\n"; -} - -# Start with file.dem - -$fg_root = shift(@ARGV); -$work_dir = shift(@ARGV); -$error = shift(@ARGV); -$error += 0.0; -$system_name = `uname -s`; chop($system_name); - -while ( $dem_file = shift(@ARGV) ) { - print "Source file = $dem_file Error tolerance = $error\n"; - - if ( $error < 0.5 ) { - die "I doubt you'll be happy with an error tolerance as " . - "low as $error.\n"; - } - - - if ( $do_dem2node ) { - dem2node() ; - } else { - $subdir = "./work/Scenery/w120n030/w111n033"; - print "WARNING: Hardcoding subdir = $subdir\n"; - } - - triangle_1() if ( $do_triangle_1 ); - fixnode() if ( $do_fixnode ); - splittris() if ( $do_splittris ); - assemtris() if ( $do_assemtris ); - triangle_2() if ( $do_triangle_2); - tri2obj() if ( $do_tri2obj ); - strips() if ( $do_strips ); - fixobj() if ( $do_fixobj ); - install() if ( $do_install ); -} - - -# exit normally -exit(0); - - -# replace all unix forward slashes with windoze backwards slashes if -# running on a cygwin32 system -sub fix_slashes { my($in) = @_; - if ( $system_name =~ m/CYGWIN32/ ) { - $in =~ s/\/+/\//g; - $in =~ s/\//\\/g; - } - - return($in); -} - - -# return the file name root (ending at last ".") -sub file_root { - my($file) = @_; - my($pos); - - $pos = rindex($file, "."); - return substr($file, 0, $pos); -} - - -# 1. dem2node work_dir dem_file tolerance^2 (meters) -# -# - dem2node .. dem_file 160000 -# -# splits dem file into 64 file.node's which contain the -# irregularly fitted vertices - -sub dem2node { - $command = "Dem2node/dem2node $work_dir $dem_file $error"; - $command = fix_slashes($command); - print "Running '$command'\n"; - - open(OUT, "$command |"); - while ( ) { - print $_; - if ( m/^Dir = / ) { - $subdir = $_; - $subdir =~ s/^Dir = //; - chop($subdir); - } - if ( m/Quad name field/ ) { - $quad_name = $_; - # strip header - $quad_name =~ s/.*Quad name field: //; - # crunch consequetive spaces - $quad_name =~ s/ +/ /g; - chop($quad_name); - print "QUAD NAME = $quad_name\n"; - } - } - close(OUT); -} - - -# 2. triangle -q file (Takes file.node and produces file.1.node and -# file.1.ele) - -print "Subdirectory for this dem file is $subdir\n"; - -sub triangle_1 { - @FILES = `ls $subdir`; - foreach $file ( @FILES ) { - # print $file; - chop($file); - if ( ($file =~ m/\.node$/) && ($file !~ m/\.\d\.node$/) ) { - # special handling is needed if .poly file exists - $fileroot = $file; - $fileroot =~ s/\.node$//; - print "$subdir/$fileroot\n"; - $command = "Triangle/triangle"; - $command = fix_slashes($command); - if ( -r "$subdir/$fileroot.poly" ) { - $command .= " -pc"; - } - $command .= " -a$max_area -q10 $subdir/$file"; - print "Running '$command'\n"; - open(OUT, "$command |"); - while ( ) { - print $_; - } - close(OUT); - - # remove input file.node - if ( $remove_tmps ) { - $file1 = "$subdir/$file"; - $file1 = fix_slashes($file1); - unlink($file1); - } - } - } -} - - -# 3. fixnode file.dem subdir -# -# Take the original .dem file (for interpolating Z values) and the -# subdirecotry containing all the file.1.node's and replace with -# fixed file.1.node - -sub fixnode { - $command = "FixNode/fixnode"; - $command = fix_slashes($command); - $command .= " $dem_file $subdir"; - print "Running '$command'\n"; - open(OUT, "$command |") || die "cannot run command\n"; - while ( ) { - print $_; - } - close(OUT); -} - - -# 4.1 splittris file (.1.node) (.1.ele) - -# Extract the corner, edge, and body vertices (in original -# geodetic coordinates) and normals (in cartesian coordinates) and -# save them in something very close to the .obj format as file.se, -# file.sw, file.nw, file.ne, file.north, file.south, file.east, -# file.west, and file.body. This way we can reconstruct the -# region using consistant edges and corners. - -# Arbitration rules: If an opposite edge file already exists, -# don't create our matching edge. If a corner already exists, -# don't create ours. Basically, the early bird gets the worm and -# gets to define the edge verticies and normals. All the other -# adjacent tiles must use these. - -sub splittris { - @FILES = `ls $subdir`; - foreach $file ( @FILES ) { - chop($file); - if ( $file =~ m/\.1\.node$/ ) { - $file =~ s/\.node$//; # strip off the ".node" - - $command = "SplitTris/splittris"; - $command = fix_slashes($command); - $command .= " $subdir/$file"; - print "Running '$command'\n"; - open(OUT, "$command |"); - while ( ) { - print $_; - } - close(OUT); - - if ( $remove_tmps ) { - $file1 = "$subdir/$file.node"; - $file1 = fix_slashes($file1); - unlink($file1); - $file1 = "$subdir/$file.node.orig"; - $file1 = fix_slashes($file1); - unlink($file1); - $file1 = "$subdir/$file.ele"; - $file1 = fix_slashes($file1); - unlink($file1); - } - } - } -} - - -# 4.2 read in the split of version of the tiles, reconstruct the tile -# using the proper shared corners and edges. Save as a node file -# so we can retriangulate. - -sub assemtris { - @FILES = `ls $subdir`; - foreach $file ( @FILES ) { - chop($file); - if ( $file =~ m/\.1\.body$/ ) { - $file =~ s/\.1\.body$//; # strip off the ".body" - - $command = "AssemTris/assemtris"; - $command = fix_slashes($command); - $command .= " $subdir/$file"; - print "Running '$command'\n"; - open(OUT, "$command |"); - while ( ) { - print $_; - } - close(OUT); - } - if ( $remove_tmps ) { - $file1 = "$subdir/$file.body"; - $file1 = fix_slashes($file1); - unlink($file1); - } - } -} - - -# 4.3 Retriangulate reassembled files (without -q option) so no new -# nodes are generated. - -sub triangle_2 { - @FILES = `ls $subdir`; - foreach $file ( @FILES ) { - # print $file; - chop($file); - if ( ($file =~ m/\.node$/) && ($file !~ m/\.\d\.node$/) ) { - $base = $file; - $base =~ s/\.node$//; - print("Test for $subdir/$base.q\n"); - - $command = "Triangle/triangle"; - $command = fix_slashes($command); - - if ( -r "$subdir/$base.q" ) { - # if triangle hangs, we can create a filebase.q for - # the file it hung on. Then, we test for that file - # here which causes the incremental algorithm to run - # (which shouldn't ever hang.) - $command .= " -i"; - } - - if ( -r "$subdir/$base.poly" ) { - $command .= " -pc $subdir/$base"; - } else { - $command .= " $subdir/$file"; - } - - print "Running '$command'\n"; - open(OUT, "$command |"); - while ( ) { - print $_; - } - close(OUT); - - # remove input file.node - if ( $remove_tmps ) { - $file1 = "$subdir/$file"; - $file1 = fix_slashes($file1); - unlink($file1); - } - } - } -} - - -# 5. tri2obj file (.1.node) (.1.ele) -# -# Take the file.1.node and file.1.ele and produce file.1.obj -# -# Extracts normals out of the shared edge/vertex files, and uses -# the precalcuated normals for these nodes instead of calculating -# new ones. By sharing normals as well as vertices, not only are -# the gaps between tiles eliminated, but the colors and lighting -# transition smoothly across tile boundaries. - -sub tri2obj { - @FILES = `ls $subdir`; - foreach $file ( @FILES ) { - chop($file); - if ( $file =~ m/\.1\.node$/ ) { - $file =~ s/\.node$//; # strip off the ".node" - - $command = "Tri2obj/tri2obj"; - $command = fix_slashes($command); - $command .= " $subdir/$file"; - print "Running '$command'\n"; - open(OUT, "$command |"); - while ( ) { - print $_; - } - close(OUT); - - if ( $remove_tmps ) { - $file1 = "$subdir/$file.node"; - $file1 = fix_slashes($file1); - unlink($file1); - $file1 = "$subdir/$file.node.orig"; - $file1 = fix_slashes($file1); - unlink($file1); - $file1 = "$subdir/$file.ele"; - $file1 = fix_slashes($file1); - unlink($file1); - } - } - } -} - - -# 6. strip file.1.obj -# -# Strip the file.1.obj's. Note, strips doesn't handle the minimal -# case of striping a square correctly. -# -# 7. cp stripe.objf file.2.obj -# -# strips produces a file called "stripe.objf" ... copy this to file.2.obj - -sub strips { - @FILES = `ls $subdir`; - foreach $file ( @FILES ) { - chop($file); - if ( $file =~ m/\.1\.obj$/ ) { - $newfile = $file; - $newfile =~ s/\.1\.obj$//; - $command = "Stripe_w/strips"; - $command = fix_slashes($command); - $command .= " $subdir/$file $subdir/$newfile.2.obj"; - print "Running '$command'\n"; - # $input = ; - open(OUT, "$command |"); - while ( ) { - print $_; - } - close(OUT); - - # copy to destination file - # $newfile = $file; - # $newfile =~ s/\.1\.obj$//; - # print "Copying to $subdir/$newfile.2.obj\n"; - # open(IN, "$subdir/$newfile.2.obj"); - # while ( ) { - # print OUT $_; - # } - # close(IN); - # close(OUT); - - if ( $remove_tmps ) { - $file1 = "$subdir/$file"; - $file1 = fix_slashes($file1); - unlink($file1); - } - } - } -} - - -# 8. fixobj file-new -# -# Sort file.2.obj by strip winding - -sub fixobj { - @FILES = `ls $subdir`; - foreach $file ( @FILES ) { - chop($file); - if ( $file =~ m/\.2\.obj$/ ) { - $newfile = $file; - $newfile =~ s/\.2\.obj$/.obj/; - - $command = "FixObj/fixobj"; - $command = fix_slashes($command); - $command .= " $subdir/$file $subdir/$newfile"; - print "Running '$command'\n"; - open(OUT, "$command |"); - while ( ) { - print $_; - } - close(OUT); - - if ( $remove_tmps ) { - $file1 = "$subdir/$file"; - $file1 = fix_slashes($file1); - unlink($file1); - } - } - } -} - - -# 9. install -# -# rename, compress, and install scenery files - -sub install { - $tmp = $subdir; - $tmp =~ s/$work_dir//; - # print "Temp dir = $tmp\n"; - $install_dir = "$fg_root/$tmp"; - - # try to get rid of double // - $install_dir =~ s/\/+/\//g; - print "Install dir = $install_dir\n"; - - if ( $system_name !~ m/CYGWIN32/ ) { - $command = "mkdir -p $install_dir"; - } else { - $command = "Makedir/makedir $install_dir"; - $command = fix_slashes($command); - } - - # print "Running '$command'\n"; - open(OUT, "$command |"); - while ( ) { - print $_; - } - close(OUT); - - # write out version and info record - $version_file = "$install_dir/VERSION"; - open(VERSION, ">$version_file") || - die "Cannot open $version_file for writing\n"; - print VERSION "FGFS Scenery Version $scenery_format_version\n"; - if ( $system_name !~ m/CYGWIN32/ ) { - $date = `date`; chop($date); - } else { - # ??? - $date = "not available"; - } - $hostname = `hostname`; chop($hostname); - print VERSION "Creator = $ENV{LOGNAME}\n"; - print VERSION "Date = $date\n"; - print VERSION "Machine = $hostname\n"; - print VERSION "\n"; - print VERSION "DEM File Name = $dem_file\n"; - print VERSION "DEM Label = $quad_name\n"; - print VERSION "Error Tolerance = $error (this value is squared)\n"; - close(VERSION); - - @FILES = `ls $subdir`; - foreach $file ( @FILES ) { - chop($file); - if ( $file =~ m/\d\d.obj$/ ) { - $new_file = file_root($file); - - $command = - "gzip -c --best -v < $subdir/$file > $install_dir/$new_file.gz"; - $command = fix_slashes($command); - - print "Running '$command'\n"; - open(OUT, "$command |"); - while ( ) { - print $_; - } - close(OUT); - - if ( $remove_tmps ) { - $file1 = "$subdir/$file"; - $file1 = fix_slashes($file1); - unlink($file1); - } - } elsif ( $file =~ m/\d\d.apt$/ ) { - $command = "cp $subdir/$file $install_dir/$file"; - $command = fix_slashes($command); - print "Running '$command'\n"; - open(OUT, "$command |"); - while ( ) { - print $_; - } - close(OUT); - } - } -} - - -#--------------------------------------------------------------------------- diff --git a/Tools/scenery_version.hxx b/Tools/scenery_version.hxx deleted file mode 100644 index c48bdfc9f..000000000 --- a/Tools/scenery_version.hxx +++ /dev/null @@ -1,26 +0,0 @@ -// scenery_version.hxx -- Scenery file format version -// -// Written by Curtis Olson, started March 1999. -// -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// -// $Id$ - - -#define FG_SCENERY_FILE_FORMAT "0.2" - - diff --git a/Simulator/Aircraft/Makefile.am b/src/Aircraft/Makefile.am similarity index 100% rename from Simulator/Aircraft/Makefile.am rename to src/Aircraft/Makefile.am diff --git a/Simulator/Aircraft/aircraft.cxx b/src/Aircraft/aircraft.cxx similarity index 100% rename from Simulator/Aircraft/aircraft.cxx rename to src/Aircraft/aircraft.cxx diff --git a/Simulator/Aircraft/aircraft.hxx b/src/Aircraft/aircraft.hxx similarity index 100% rename from Simulator/Aircraft/aircraft.hxx rename to src/Aircraft/aircraft.hxx diff --git a/Simulator/Airports/Makefile.am b/src/Airports/Makefile.am similarity index 100% rename from Simulator/Airports/Makefile.am rename to src/Airports/Makefile.am diff --git a/Simulator/Airports/genapt.cxx b/src/Airports/genapt.cxx similarity index 100% rename from Simulator/Airports/genapt.cxx rename to src/Airports/genapt.cxx diff --git a/Simulator/Airports/genapt.hxx b/src/Airports/genapt.hxx similarity index 100% rename from Simulator/Airports/genapt.hxx rename to src/Airports/genapt.hxx diff --git a/Simulator/Airports/old_draw_runways.c b/src/Airports/old_draw_runways.c similarity index 100% rename from Simulator/Airports/old_draw_runways.c rename to src/Airports/old_draw_runways.c diff --git a/Simulator/Airports/simple.cxx b/src/Airports/simple.cxx similarity index 100% rename from Simulator/Airports/simple.cxx rename to src/Airports/simple.cxx diff --git a/Simulator/Airports/simple.hxx b/src/Airports/simple.hxx similarity index 100% rename from Simulator/Airports/simple.hxx rename to src/Airports/simple.hxx diff --git a/Simulator/Airports/testair.cxx b/src/Airports/testair.cxx similarity index 100% rename from Simulator/Airports/testair.cxx rename to src/Airports/testair.cxx diff --git a/Simulator/Astro/Makefile.am b/src/Astro/Makefile.am similarity index 100% rename from Simulator/Astro/Makefile.am rename to src/Astro/Makefile.am diff --git a/Simulator/Astro/celestialBody.cxx b/src/Astro/celestialBody.cxx similarity index 100% rename from Simulator/Astro/celestialBody.cxx rename to src/Astro/celestialBody.cxx diff --git a/Simulator/Astro/celestialBody.hxx b/src/Astro/celestialBody.hxx similarity index 100% rename from Simulator/Astro/celestialBody.hxx rename to src/Astro/celestialBody.hxx diff --git a/Simulator/Astro/jupiter.cxx b/src/Astro/jupiter.cxx similarity index 100% rename from Simulator/Astro/jupiter.cxx rename to src/Astro/jupiter.cxx diff --git a/Simulator/Astro/jupiter.hxx b/src/Astro/jupiter.hxx similarity index 100% rename from Simulator/Astro/jupiter.hxx rename to src/Astro/jupiter.hxx diff --git a/Simulator/Astro/mars.cxx b/src/Astro/mars.cxx similarity index 100% rename from Simulator/Astro/mars.cxx rename to src/Astro/mars.cxx diff --git a/Simulator/Astro/mars.hxx b/src/Astro/mars.hxx similarity index 100% rename from Simulator/Astro/mars.hxx rename to src/Astro/mars.hxx diff --git a/Simulator/Astro/mercury.cxx b/src/Astro/mercury.cxx similarity index 100% rename from Simulator/Astro/mercury.cxx rename to src/Astro/mercury.cxx diff --git a/Simulator/Astro/mercury.hxx b/src/Astro/mercury.hxx similarity index 100% rename from Simulator/Astro/mercury.hxx rename to src/Astro/mercury.hxx diff --git a/Simulator/Astro/moon.cxx b/src/Astro/moon.cxx similarity index 100% rename from Simulator/Astro/moon.cxx rename to src/Astro/moon.cxx diff --git a/Simulator/Astro/moon.hxx b/src/Astro/moon.hxx similarity index 100% rename from Simulator/Astro/moon.hxx rename to src/Astro/moon.hxx diff --git a/Simulator/Astro/neptune.cxx b/src/Astro/neptune.cxx similarity index 100% rename from Simulator/Astro/neptune.cxx rename to src/Astro/neptune.cxx diff --git a/Simulator/Astro/neptune.hxx b/src/Astro/neptune.hxx similarity index 100% rename from Simulator/Astro/neptune.hxx rename to src/Astro/neptune.hxx diff --git a/Simulator/Astro/pluto.hxx b/src/Astro/pluto.hxx similarity index 100% rename from Simulator/Astro/pluto.hxx rename to src/Astro/pluto.hxx diff --git a/Simulator/Astro/saturn.cxx b/src/Astro/saturn.cxx similarity index 100% rename from Simulator/Astro/saturn.cxx rename to src/Astro/saturn.cxx diff --git a/Simulator/Astro/saturn.hxx b/src/Astro/saturn.hxx similarity index 100% rename from Simulator/Astro/saturn.hxx rename to src/Astro/saturn.hxx diff --git a/Simulator/Astro/sky.cxx b/src/Astro/sky.cxx similarity index 100% rename from Simulator/Astro/sky.cxx rename to src/Astro/sky.cxx diff --git a/Simulator/Astro/sky.hxx b/src/Astro/sky.hxx similarity index 100% rename from Simulator/Astro/sky.hxx rename to src/Astro/sky.hxx diff --git a/Simulator/Astro/solarsystem.cxx b/src/Astro/solarsystem.cxx similarity index 100% rename from Simulator/Astro/solarsystem.cxx rename to src/Astro/solarsystem.cxx diff --git a/Simulator/Astro/solarsystem.hxx b/src/Astro/solarsystem.hxx similarity index 100% rename from Simulator/Astro/solarsystem.hxx rename to src/Astro/solarsystem.hxx diff --git a/Simulator/Astro/star.cxx b/src/Astro/star.cxx similarity index 100% rename from Simulator/Astro/star.cxx rename to src/Astro/star.cxx diff --git a/Simulator/Astro/star.hxx b/src/Astro/star.hxx similarity index 100% rename from Simulator/Astro/star.hxx rename to src/Astro/star.hxx diff --git a/Simulator/Astro/stars.cxx b/src/Astro/stars.cxx similarity index 100% rename from Simulator/Astro/stars.cxx rename to src/Astro/stars.cxx diff --git a/Simulator/Astro/stars.hxx b/src/Astro/stars.hxx similarity index 100% rename from Simulator/Astro/stars.hxx rename to src/Astro/stars.hxx diff --git a/Simulator/Astro/uranus.cxx b/src/Astro/uranus.cxx similarity index 100% rename from Simulator/Astro/uranus.cxx rename to src/Astro/uranus.cxx diff --git a/Simulator/Astro/uranus.hxx b/src/Astro/uranus.hxx similarity index 100% rename from Simulator/Astro/uranus.hxx rename to src/Astro/uranus.hxx diff --git a/Simulator/Astro/venus.cxx b/src/Astro/venus.cxx similarity index 100% rename from Simulator/Astro/venus.cxx rename to src/Astro/venus.cxx diff --git a/Simulator/Astro/venus.hxx b/src/Astro/venus.hxx similarity index 100% rename from Simulator/Astro/venus.hxx rename to src/Astro/venus.hxx diff --git a/Simulator/Autopilot/Makefile.am b/src/Autopilot/Makefile.am similarity index 100% rename from Simulator/Autopilot/Makefile.am rename to src/Autopilot/Makefile.am diff --git a/Simulator/Autopilot/autopilot.cxx b/src/Autopilot/autopilot.cxx similarity index 100% rename from Simulator/Autopilot/autopilot.cxx rename to src/Autopilot/autopilot.cxx diff --git a/Simulator/Autopilot/autopilot.hxx b/src/Autopilot/autopilot.hxx similarity index 100% rename from Simulator/Autopilot/autopilot.hxx rename to src/Autopilot/autopilot.hxx diff --git a/Simulator/Cockpit/Makefile.am b/src/Cockpit/Makefile.am similarity index 100% rename from Simulator/Cockpit/Makefile.am rename to src/Cockpit/Makefile.am diff --git a/Simulator/Cockpit/cockpit.cxx b/src/Cockpit/cockpit.cxx similarity index 100% rename from Simulator/Cockpit/cockpit.cxx rename to src/Cockpit/cockpit.cxx diff --git a/Simulator/Cockpit/cockpit.hxx b/src/Cockpit/cockpit.hxx similarity index 100% rename from Simulator/Cockpit/cockpit.hxx rename to src/Cockpit/cockpit.hxx diff --git a/Simulator/Cockpit/hud.cxx b/src/Cockpit/hud.cxx similarity index 100% rename from Simulator/Cockpit/hud.cxx rename to src/Cockpit/hud.cxx diff --git a/Simulator/Cockpit/hud.hxx b/src/Cockpit/hud.hxx similarity index 100% rename from Simulator/Cockpit/hud.hxx rename to src/Cockpit/hud.hxx diff --git a/Simulator/Cockpit/hud_card.cxx b/src/Cockpit/hud_card.cxx similarity index 100% rename from Simulator/Cockpit/hud_card.cxx rename to src/Cockpit/hud_card.cxx diff --git a/Simulator/Cockpit/hud_dnst.cxx b/src/Cockpit/hud_dnst.cxx similarity index 100% rename from Simulator/Cockpit/hud_dnst.cxx rename to src/Cockpit/hud_dnst.cxx diff --git a/Simulator/Cockpit/hud_guag.cxx b/src/Cockpit/hud_guag.cxx similarity index 100% rename from Simulator/Cockpit/hud_guag.cxx rename to src/Cockpit/hud_guag.cxx diff --git a/Simulator/Cockpit/hud_inst.cxx b/src/Cockpit/hud_inst.cxx similarity index 100% rename from Simulator/Cockpit/hud_inst.cxx rename to src/Cockpit/hud_inst.cxx diff --git a/Simulator/Cockpit/hud_labl.cxx b/src/Cockpit/hud_labl.cxx similarity index 100% rename from Simulator/Cockpit/hud_labl.cxx rename to src/Cockpit/hud_labl.cxx diff --git a/Simulator/Cockpit/hud_ladr.cxx b/src/Cockpit/hud_ladr.cxx similarity index 100% rename from Simulator/Cockpit/hud_ladr.cxx rename to src/Cockpit/hud_ladr.cxx diff --git a/Simulator/Cockpit/hud_lat.cxx b/src/Cockpit/hud_lat.cxx similarity index 100% rename from Simulator/Cockpit/hud_lat.cxx rename to src/Cockpit/hud_lat.cxx diff --git a/Simulator/Cockpit/hud_lon.cxx b/src/Cockpit/hud_lon.cxx similarity index 100% rename from Simulator/Cockpit/hud_lon.cxx rename to src/Cockpit/hud_lon.cxx diff --git a/Simulator/Cockpit/hud_scal.cxx b/src/Cockpit/hud_scal.cxx similarity index 100% rename from Simulator/Cockpit/hud_scal.cxx rename to src/Cockpit/hud_scal.cxx diff --git a/Simulator/Cockpit/hud_tbi.cxx b/src/Cockpit/hud_tbi.cxx similarity index 100% rename from Simulator/Cockpit/hud_tbi.cxx rename to src/Cockpit/hud_tbi.cxx diff --git a/Simulator/Cockpit/panel.cxx b/src/Cockpit/panel.cxx similarity index 100% rename from Simulator/Cockpit/panel.cxx rename to src/Cockpit/panel.cxx diff --git a/Simulator/Cockpit/panel.hxx b/src/Cockpit/panel.hxx similarity index 100% rename from Simulator/Cockpit/panel.hxx rename to src/Cockpit/panel.hxx diff --git a/Simulator/Cockpit/proposed-navaids.hpp b/src/Cockpit/proposed-navaids.hpp similarity index 100% rename from Simulator/Cockpit/proposed-navaids.hpp rename to src/Cockpit/proposed-navaids.hpp diff --git a/Simulator/Controls/Makefile.am b/src/Controls/Makefile.am similarity index 100% rename from Simulator/Controls/Makefile.am rename to src/Controls/Makefile.am diff --git a/Simulator/Controls/controls.cxx b/src/Controls/controls.cxx similarity index 100% rename from Simulator/Controls/controls.cxx rename to src/Controls/controls.cxx diff --git a/Simulator/Controls/controls.hxx b/src/Controls/controls.hxx similarity index 100% rename from Simulator/Controls/controls.hxx rename to src/Controls/controls.hxx diff --git a/Simulator/Done b/src/Done similarity index 100% rename from Simulator/Done rename to src/Done diff --git a/Simulator/FDM/External/Makefile.am b/src/FDM/External/Makefile.am similarity index 100% rename from Simulator/FDM/External/Makefile.am rename to src/FDM/External/Makefile.am diff --git a/Simulator/FDM/External/external.cxx b/src/FDM/External/external.cxx similarity index 100% rename from Simulator/FDM/External/external.cxx rename to src/FDM/External/external.cxx diff --git a/Simulator/FDM/External/external.hxx b/src/FDM/External/external.hxx similarity index 100% rename from Simulator/FDM/External/external.hxx rename to src/FDM/External/external.hxx diff --git a/Simulator/FDM/JSBsim.cxx b/src/FDM/JSBsim.cxx similarity index 100% rename from Simulator/FDM/JSBsim.cxx rename to src/FDM/JSBsim.cxx diff --git a/Simulator/FDM/JSBsim.hxx b/src/FDM/JSBsim.hxx similarity index 100% rename from Simulator/FDM/JSBsim.hxx rename to src/FDM/JSBsim.hxx diff --git a/Simulator/FDM/JSBsim/FGAircraft.cpp b/src/FDM/JSBsim/FGAircraft.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGAircraft.cpp rename to src/FDM/JSBsim/FGAircraft.cpp diff --git a/Simulator/FDM/JSBsim/FGAircraft.h b/src/FDM/JSBsim/FGAircraft.h similarity index 100% rename from Simulator/FDM/JSBsim/FGAircraft.h rename to src/FDM/JSBsim/FGAircraft.h diff --git a/Simulator/FDM/JSBsim/FGAtmosphere.cpp b/src/FDM/JSBsim/FGAtmosphere.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGAtmosphere.cpp rename to src/FDM/JSBsim/FGAtmosphere.cpp diff --git a/Simulator/FDM/JSBsim/FGAtmosphere.h b/src/FDM/JSBsim/FGAtmosphere.h similarity index 100% rename from Simulator/FDM/JSBsim/FGAtmosphere.h rename to src/FDM/JSBsim/FGAtmosphere.h diff --git a/Simulator/FDM/JSBsim/FGAuxiliary.cpp b/src/FDM/JSBsim/FGAuxiliary.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGAuxiliary.cpp rename to src/FDM/JSBsim/FGAuxiliary.cpp diff --git a/Simulator/FDM/JSBsim/FGAuxiliary.h b/src/FDM/JSBsim/FGAuxiliary.h similarity index 100% rename from Simulator/FDM/JSBsim/FGAuxiliary.h rename to src/FDM/JSBsim/FGAuxiliary.h diff --git a/Simulator/FDM/JSBsim/FGCoefficient.cpp b/src/FDM/JSBsim/FGCoefficient.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGCoefficient.cpp rename to src/FDM/JSBsim/FGCoefficient.cpp diff --git a/Simulator/FDM/JSBsim/FGCoefficient.h b/src/FDM/JSBsim/FGCoefficient.h similarity index 100% rename from Simulator/FDM/JSBsim/FGCoefficient.h rename to src/FDM/JSBsim/FGCoefficient.h diff --git a/Simulator/FDM/JSBsim/FGControls.cpp b/src/FDM/JSBsim/FGControls.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGControls.cpp rename to src/FDM/JSBsim/FGControls.cpp diff --git a/Simulator/FDM/JSBsim/FGControls.h b/src/FDM/JSBsim/FGControls.h similarity index 100% rename from Simulator/FDM/JSBsim/FGControls.h rename to src/FDM/JSBsim/FGControls.h diff --git a/Simulator/FDM/JSBsim/FGDefs.h b/src/FDM/JSBsim/FGDefs.h similarity index 100% rename from Simulator/FDM/JSBsim/FGDefs.h rename to src/FDM/JSBsim/FGDefs.h diff --git a/Simulator/FDM/JSBsim/FGEngine.cpp b/src/FDM/JSBsim/FGEngine.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGEngine.cpp rename to src/FDM/JSBsim/FGEngine.cpp diff --git a/Simulator/FDM/JSBsim/FGEngine.h b/src/FDM/JSBsim/FGEngine.h similarity index 100% rename from Simulator/FDM/JSBsim/FGEngine.h rename to src/FDM/JSBsim/FGEngine.h diff --git a/Simulator/FDM/JSBsim/FGFCS.cpp b/src/FDM/JSBsim/FGFCS.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGFCS.cpp rename to src/FDM/JSBsim/FGFCS.cpp diff --git a/Simulator/FDM/JSBsim/FGFCS.h b/src/FDM/JSBsim/FGFCS.h similarity index 100% rename from Simulator/FDM/JSBsim/FGFCS.h rename to src/FDM/JSBsim/FGFCS.h diff --git a/Simulator/FDM/JSBsim/FGFDMExec.cpp b/src/FDM/JSBsim/FGFDMExec.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGFDMExec.cpp rename to src/FDM/JSBsim/FGFDMExec.cpp diff --git a/Simulator/FDM/JSBsim/FGFDMExec.h b/src/FDM/JSBsim/FGFDMExec.h similarity index 100% rename from Simulator/FDM/JSBsim/FGFDMExec.h rename to src/FDM/JSBsim/FGFDMExec.h diff --git a/Simulator/FDM/JSBsim/FGMain.cpp b/src/FDM/JSBsim/FGMain.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGMain.cpp rename to src/FDM/JSBsim/FGMain.cpp diff --git a/Simulator/FDM/JSBsim/FGMatrix.cpp b/src/FDM/JSBsim/FGMatrix.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGMatrix.cpp rename to src/FDM/JSBsim/FGMatrix.cpp diff --git a/Simulator/FDM/JSBsim/FGMatrix.h b/src/FDM/JSBsim/FGMatrix.h similarity index 100% rename from Simulator/FDM/JSBsim/FGMatrix.h rename to src/FDM/JSBsim/FGMatrix.h diff --git a/Simulator/FDM/JSBsim/FGModel.cpp b/src/FDM/JSBsim/FGModel.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGModel.cpp rename to src/FDM/JSBsim/FGModel.cpp diff --git a/Simulator/FDM/JSBsim/FGModel.h b/src/FDM/JSBsim/FGModel.h similarity index 100% rename from Simulator/FDM/JSBsim/FGModel.h rename to src/FDM/JSBsim/FGModel.h diff --git a/Simulator/FDM/JSBsim/FGOutput.cpp b/src/FDM/JSBsim/FGOutput.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGOutput.cpp rename to src/FDM/JSBsim/FGOutput.cpp diff --git a/Simulator/FDM/JSBsim/FGOutput.h b/src/FDM/JSBsim/FGOutput.h similarity index 100% rename from Simulator/FDM/JSBsim/FGOutput.h rename to src/FDM/JSBsim/FGOutput.h diff --git a/Simulator/FDM/JSBsim/FGPosition.cpp b/src/FDM/JSBsim/FGPosition.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGPosition.cpp rename to src/FDM/JSBsim/FGPosition.cpp diff --git a/Simulator/FDM/JSBsim/FGPosition.h b/src/FDM/JSBsim/FGPosition.h similarity index 100% rename from Simulator/FDM/JSBsim/FGPosition.h rename to src/FDM/JSBsim/FGPosition.h diff --git a/Simulator/FDM/JSBsim/FGRotation.cpp b/src/FDM/JSBsim/FGRotation.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGRotation.cpp rename to src/FDM/JSBsim/FGRotation.cpp diff --git a/Simulator/FDM/JSBsim/FGRotation.h b/src/FDM/JSBsim/FGRotation.h similarity index 100% rename from Simulator/FDM/JSBsim/FGRotation.h rename to src/FDM/JSBsim/FGRotation.h diff --git a/Simulator/FDM/JSBsim/FGState.cpp b/src/FDM/JSBsim/FGState.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGState.cpp rename to src/FDM/JSBsim/FGState.cpp diff --git a/Simulator/FDM/JSBsim/FGState.h b/src/FDM/JSBsim/FGState.h similarity index 100% rename from Simulator/FDM/JSBsim/FGState.h rename to src/FDM/JSBsim/FGState.h diff --git a/Simulator/FDM/JSBsim/FGTank.cpp b/src/FDM/JSBsim/FGTank.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGTank.cpp rename to src/FDM/JSBsim/FGTank.cpp diff --git a/Simulator/FDM/JSBsim/FGTank.h b/src/FDM/JSBsim/FGTank.h similarity index 100% rename from Simulator/FDM/JSBsim/FGTank.h rename to src/FDM/JSBsim/FGTank.h diff --git a/Simulator/FDM/JSBsim/FGTranslation.cpp b/src/FDM/JSBsim/FGTranslation.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGTranslation.cpp rename to src/FDM/JSBsim/FGTranslation.cpp diff --git a/Simulator/FDM/JSBsim/FGTranslation.h b/src/FDM/JSBsim/FGTranslation.h similarity index 100% rename from Simulator/FDM/JSBsim/FGTranslation.h rename to src/FDM/JSBsim/FGTranslation.h diff --git a/Simulator/FDM/JSBsim/FGUtility.cpp b/src/FDM/JSBsim/FGUtility.cpp similarity index 100% rename from Simulator/FDM/JSBsim/FGUtility.cpp rename to src/FDM/JSBsim/FGUtility.cpp diff --git a/Simulator/FDM/JSBsim/FGUtility.h b/src/FDM/JSBsim/FGUtility.h similarity index 100% rename from Simulator/FDM/JSBsim/FGUtility.h rename to src/FDM/JSBsim/FGUtility.h diff --git a/Simulator/FDM/JSBsim/Makefile.am b/src/FDM/JSBsim/Makefile.am similarity index 100% rename from Simulator/FDM/JSBsim/Makefile.am rename to src/FDM/JSBsim/Makefile.am diff --git a/Simulator/FDM/LaRCsim.cxx b/src/FDM/LaRCsim.cxx similarity index 100% rename from Simulator/FDM/LaRCsim.cxx rename to src/FDM/LaRCsim.cxx diff --git a/Simulator/FDM/LaRCsim.hxx b/src/FDM/LaRCsim.hxx similarity index 100% rename from Simulator/FDM/LaRCsim.hxx rename to src/FDM/LaRCsim.hxx diff --git a/Simulator/FDM/LaRCsim/Cherokee.txt b/src/FDM/LaRCsim/Cherokee.txt similarity index 100% rename from Simulator/FDM/LaRCsim/Cherokee.txt rename to src/FDM/LaRCsim/Cherokee.txt diff --git a/Simulator/FDM/LaRCsim/Makefile.am b/src/FDM/LaRCsim/Makefile.am similarity index 100% rename from Simulator/FDM/LaRCsim/Makefile.am rename to src/FDM/LaRCsim/Makefile.am diff --git a/Simulator/FDM/LaRCsim/atmos_62.c b/src/FDM/LaRCsim/atmos_62.c similarity index 100% rename from Simulator/FDM/LaRCsim/atmos_62.c rename to src/FDM/LaRCsim/atmos_62.c diff --git a/Simulator/FDM/LaRCsim/atmos_62.h b/src/FDM/LaRCsim/atmos_62.h similarity index 100% rename from Simulator/FDM/LaRCsim/atmos_62.h rename to src/FDM/LaRCsim/atmos_62.h diff --git a/Simulator/FDM/LaRCsim/c172_aero.c b/src/FDM/LaRCsim/c172_aero.c similarity index 100% rename from Simulator/FDM/LaRCsim/c172_aero.c rename to src/FDM/LaRCsim/c172_aero.c diff --git a/Simulator/FDM/LaRCsim/c172_engine.c b/src/FDM/LaRCsim/c172_engine.c similarity index 100% rename from Simulator/FDM/LaRCsim/c172_engine.c rename to src/FDM/LaRCsim/c172_engine.c diff --git a/Simulator/FDM/LaRCsim/c172_gear.c b/src/FDM/LaRCsim/c172_gear.c similarity index 100% rename from Simulator/FDM/LaRCsim/c172_gear.c rename to src/FDM/LaRCsim/c172_gear.c diff --git a/Simulator/FDM/LaRCsim/c172_init.c b/src/FDM/LaRCsim/c172_init.c similarity index 100% rename from Simulator/FDM/LaRCsim/c172_init.c rename to src/FDM/LaRCsim/c172_init.c diff --git a/Simulator/FDM/LaRCsim/c172_main.c b/src/FDM/LaRCsim/c172_main.c similarity index 100% rename from Simulator/FDM/LaRCsim/c172_main.c rename to src/FDM/LaRCsim/c172_main.c diff --git a/Simulator/FDM/LaRCsim/cherokee_aero.c b/src/FDM/LaRCsim/cherokee_aero.c similarity index 100% rename from Simulator/FDM/LaRCsim/cherokee_aero.c rename to src/FDM/LaRCsim/cherokee_aero.c diff --git a/Simulator/FDM/LaRCsim/cherokee_engine.c b/src/FDM/LaRCsim/cherokee_engine.c similarity index 100% rename from Simulator/FDM/LaRCsim/cherokee_engine.c rename to src/FDM/LaRCsim/cherokee_engine.c diff --git a/Simulator/FDM/LaRCsim/cherokee_gear.c b/src/FDM/LaRCsim/cherokee_gear.c similarity index 100% rename from Simulator/FDM/LaRCsim/cherokee_gear.c rename to src/FDM/LaRCsim/cherokee_gear.c diff --git a/Simulator/FDM/LaRCsim/cherokee_init.c b/src/FDM/LaRCsim/cherokee_init.c similarity index 100% rename from Simulator/FDM/LaRCsim/cherokee_init.c rename to src/FDM/LaRCsim/cherokee_init.c diff --git a/Simulator/FDM/LaRCsim/default_model_routines.c b/src/FDM/LaRCsim/default_model_routines.c similarity index 100% rename from Simulator/FDM/LaRCsim/default_model_routines.c rename to src/FDM/LaRCsim/default_model_routines.c diff --git a/Simulator/FDM/LaRCsim/default_model_routines.h b/src/FDM/LaRCsim/default_model_routines.h similarity index 100% rename from Simulator/FDM/LaRCsim/default_model_routines.h rename to src/FDM/LaRCsim/default_model_routines.h diff --git a/Simulator/FDM/LaRCsim/ls_accel.c b/src/FDM/LaRCsim/ls_accel.c similarity index 100% rename from Simulator/FDM/LaRCsim/ls_accel.c rename to src/FDM/LaRCsim/ls_accel.c diff --git a/Simulator/FDM/LaRCsim/ls_accel.h b/src/FDM/LaRCsim/ls_accel.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_accel.h rename to src/FDM/LaRCsim/ls_accel.h diff --git a/Simulator/FDM/LaRCsim/ls_aux.c b/src/FDM/LaRCsim/ls_aux.c similarity index 100% rename from Simulator/FDM/LaRCsim/ls_aux.c rename to src/FDM/LaRCsim/ls_aux.c diff --git a/Simulator/FDM/LaRCsim/ls_aux.h b/src/FDM/LaRCsim/ls_aux.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_aux.h rename to src/FDM/LaRCsim/ls_aux.h diff --git a/Simulator/FDM/LaRCsim/ls_cockpit.h b/src/FDM/LaRCsim/ls_cockpit.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_cockpit.h rename to src/FDM/LaRCsim/ls_cockpit.h diff --git a/Simulator/FDM/LaRCsim/ls_constants.h b/src/FDM/LaRCsim/ls_constants.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_constants.h rename to src/FDM/LaRCsim/ls_constants.h diff --git a/Simulator/FDM/LaRCsim/ls_generic.h b/src/FDM/LaRCsim/ls_generic.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_generic.h rename to src/FDM/LaRCsim/ls_generic.h diff --git a/Simulator/FDM/LaRCsim/ls_geodesy.c b/src/FDM/LaRCsim/ls_geodesy.c similarity index 100% rename from Simulator/FDM/LaRCsim/ls_geodesy.c rename to src/FDM/LaRCsim/ls_geodesy.c diff --git a/Simulator/FDM/LaRCsim/ls_geodesy.h b/src/FDM/LaRCsim/ls_geodesy.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_geodesy.h rename to src/FDM/LaRCsim/ls_geodesy.h diff --git a/Simulator/FDM/LaRCsim/ls_gravity.c b/src/FDM/LaRCsim/ls_gravity.c similarity index 100% rename from Simulator/FDM/LaRCsim/ls_gravity.c rename to src/FDM/LaRCsim/ls_gravity.c diff --git a/Simulator/FDM/LaRCsim/ls_gravity.h b/src/FDM/LaRCsim/ls_gravity.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_gravity.h rename to src/FDM/LaRCsim/ls_gravity.h diff --git a/Simulator/FDM/LaRCsim/ls_init.c b/src/FDM/LaRCsim/ls_init.c similarity index 100% rename from Simulator/FDM/LaRCsim/ls_init.c rename to src/FDM/LaRCsim/ls_init.c diff --git a/Simulator/FDM/LaRCsim/ls_init.h b/src/FDM/LaRCsim/ls_init.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_init.h rename to src/FDM/LaRCsim/ls_init.h diff --git a/Simulator/FDM/LaRCsim/ls_interface.c b/src/FDM/LaRCsim/ls_interface.c similarity index 100% rename from Simulator/FDM/LaRCsim/ls_interface.c rename to src/FDM/LaRCsim/ls_interface.c diff --git a/Simulator/FDM/LaRCsim/ls_interface.h b/src/FDM/LaRCsim/ls_interface.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_interface.h rename to src/FDM/LaRCsim/ls_interface.h diff --git a/Simulator/FDM/LaRCsim/ls_matrix.c b/src/FDM/LaRCsim/ls_matrix.c similarity index 100% rename from Simulator/FDM/LaRCsim/ls_matrix.c rename to src/FDM/LaRCsim/ls_matrix.c diff --git a/Simulator/FDM/LaRCsim/ls_matrix.h b/src/FDM/LaRCsim/ls_matrix.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_matrix.h rename to src/FDM/LaRCsim/ls_matrix.h diff --git a/Simulator/FDM/LaRCsim/ls_model.c b/src/FDM/LaRCsim/ls_model.c similarity index 100% rename from Simulator/FDM/LaRCsim/ls_model.c rename to src/FDM/LaRCsim/ls_model.c diff --git a/Simulator/FDM/LaRCsim/ls_model.h b/src/FDM/LaRCsim/ls_model.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_model.h rename to src/FDM/LaRCsim/ls_model.h diff --git a/Simulator/FDM/LaRCsim/ls_sim_control.h b/src/FDM/LaRCsim/ls_sim_control.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_sim_control.h rename to src/FDM/LaRCsim/ls_sim_control.h diff --git a/Simulator/FDM/LaRCsim/ls_step.c b/src/FDM/LaRCsim/ls_step.c similarity index 100% rename from Simulator/FDM/LaRCsim/ls_step.c rename to src/FDM/LaRCsim/ls_step.c diff --git a/Simulator/FDM/LaRCsim/ls_step.h b/src/FDM/LaRCsim/ls_step.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_step.h rename to src/FDM/LaRCsim/ls_step.h diff --git a/Simulator/FDM/LaRCsim/ls_sym.h b/src/FDM/LaRCsim/ls_sym.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_sym.h rename to src/FDM/LaRCsim/ls_sym.h diff --git a/Simulator/FDM/LaRCsim/ls_trim.c b/src/FDM/LaRCsim/ls_trim.c similarity index 100% rename from Simulator/FDM/LaRCsim/ls_trim.c rename to src/FDM/LaRCsim/ls_trim.c diff --git a/Simulator/FDM/LaRCsim/ls_types.h b/src/FDM/LaRCsim/ls_types.h similarity index 100% rename from Simulator/FDM/LaRCsim/ls_types.h rename to src/FDM/LaRCsim/ls_types.h diff --git a/Simulator/FDM/LaRCsim/mymain.c b/src/FDM/LaRCsim/mymain.c similarity index 100% rename from Simulator/FDM/LaRCsim/mymain.c rename to src/FDM/LaRCsim/mymain.c diff --git a/Simulator/FDM/LaRCsim/navion_aero.c b/src/FDM/LaRCsim/navion_aero.c similarity index 100% rename from Simulator/FDM/LaRCsim/navion_aero.c rename to src/FDM/LaRCsim/navion_aero.c diff --git a/Simulator/FDM/LaRCsim/navion_engine.c b/src/FDM/LaRCsim/navion_engine.c similarity index 100% rename from Simulator/FDM/LaRCsim/navion_engine.c rename to src/FDM/LaRCsim/navion_engine.c diff --git a/Simulator/FDM/LaRCsim/navion_gear.c b/src/FDM/LaRCsim/navion_gear.c similarity index 100% rename from Simulator/FDM/LaRCsim/navion_gear.c rename to src/FDM/LaRCsim/navion_gear.c diff --git a/Simulator/FDM/LaRCsim/navion_init.c b/src/FDM/LaRCsim/navion_init.c similarity index 100% rename from Simulator/FDM/LaRCsim/navion_init.c rename to src/FDM/LaRCsim/navion_init.c diff --git a/Simulator/FDM/LaRCsim/navion_init.h b/src/FDM/LaRCsim/navion_init.h similarity index 100% rename from Simulator/FDM/LaRCsim/navion_init.h rename to src/FDM/LaRCsim/navion_init.h diff --git a/Simulator/FDM/LaRCsim/on_ground.ic b/src/FDM/LaRCsim/on_ground.ic similarity index 100% rename from Simulator/FDM/LaRCsim/on_ground.ic rename to src/FDM/LaRCsim/on_ground.ic diff --git a/Simulator/FDM/Makefile.am b/src/FDM/Makefile.am similarity index 100% rename from Simulator/FDM/Makefile.am rename to src/FDM/Makefile.am diff --git a/Simulator/FDM/Slew/Makefile.am b/src/FDM/Slew/Makefile.am similarity index 100% rename from Simulator/FDM/Slew/Makefile.am rename to src/FDM/Slew/Makefile.am diff --git a/Simulator/FDM/Slew/slew.cxx b/src/FDM/Slew/slew.cxx similarity index 100% rename from Simulator/FDM/Slew/slew.cxx rename to src/FDM/Slew/slew.cxx diff --git a/Simulator/FDM/Slew/slew.hxx b/src/FDM/Slew/slew.hxx similarity index 100% rename from Simulator/FDM/Slew/slew.hxx rename to src/FDM/Slew/slew.hxx diff --git a/Simulator/FDM/flight.cxx b/src/FDM/flight.cxx similarity index 100% rename from Simulator/FDM/flight.cxx rename to src/FDM/flight.cxx diff --git a/Simulator/FDM/flight.hxx b/src/FDM/flight.hxx similarity index 100% rename from Simulator/FDM/flight.hxx rename to src/FDM/flight.hxx diff --git a/Simulator/GUI/Makefile.am b/src/GUI/Makefile.am similarity index 100% rename from Simulator/GUI/Makefile.am rename to src/GUI/Makefile.am diff --git a/Simulator/GUI/gui.cxx b/src/GUI/gui.cxx similarity index 100% rename from Simulator/GUI/gui.cxx rename to src/GUI/gui.cxx diff --git a/Simulator/GUI/gui.h b/src/GUI/gui.h similarity index 100% rename from Simulator/GUI/gui.h rename to src/GUI/gui.h diff --git a/Include/Makefile.am b/src/Include/Makefile.am similarity index 100% rename from Include/Makefile.am rename to src/Include/Makefile.am diff --git a/Include/auto_ptr.hxx b/src/Include/auto_ptr.hxx similarity index 100% rename from Include/auto_ptr.hxx rename to src/Include/auto_ptr.hxx diff --git a/Include/cmdargs.h b/src/Include/cmdargs.h similarity index 100% rename from Include/cmdargs.h rename to src/Include/cmdargs.h diff --git a/Include/compiler.h b/src/Include/compiler.h similarity index 100% rename from Include/compiler.h rename to src/Include/compiler.h diff --git a/Include/config.h.in b/src/Include/config.h.in similarity index 100% rename from Include/config.h.in rename to src/Include/config.h.in diff --git a/Include/fg_callback.hxx b/src/Include/fg_callback.hxx similarity index 100% rename from Include/fg_callback.hxx rename to src/Include/fg_callback.hxx diff --git a/Include/fg_constants.h b/src/Include/fg_constants.h similarity index 100% rename from Include/fg_constants.h rename to src/Include/fg_constants.h diff --git a/Include/fg_memory.h b/src/Include/fg_memory.h similarity index 100% rename from Include/fg_memory.h rename to src/Include/fg_memory.h diff --git a/Include/fg_stl_config.h b/src/Include/fg_stl_config.h similarity index 100% rename from Include/fg_stl_config.h rename to src/Include/fg_stl_config.h diff --git a/Include/fg_traits.hxx b/src/Include/fg_traits.hxx similarity index 100% rename from Include/fg_traits.hxx rename to src/Include/fg_traits.hxx diff --git a/Include/fg_typedefs.h b/src/Include/fg_typedefs.h similarity index 100% rename from Include/fg_typedefs.h rename to src/Include/fg_typedefs.h diff --git a/Include/fg_zlib.h b/src/Include/fg_zlib.h similarity index 100% rename from Include/fg_zlib.h rename to src/Include/fg_zlib.h diff --git a/Include/general.hxx b/src/Include/general.hxx similarity index 100% rename from Include/general.hxx rename to src/Include/general.hxx diff --git a/Simulator/Joystick/Makefile.am b/src/Joystick/Makefile.am similarity index 100% rename from Simulator/Joystick/Makefile.am rename to src/Joystick/Makefile.am diff --git a/Simulator/Joystick/joystick.cxx b/src/Joystick/joystick.cxx similarity index 100% rename from Simulator/Joystick/joystick.cxx rename to src/Joystick/joystick.cxx diff --git a/Simulator/Joystick/joystick.hxx b/src/Joystick/joystick.hxx similarity index 100% rename from Simulator/Joystick/joystick.hxx rename to src/Joystick/joystick.hxx diff --git a/Simulator/Main/3dfx.sh b/src/Main/3dfx.sh similarity index 100% rename from Simulator/Main/3dfx.sh rename to src/Main/3dfx.sh diff --git a/Simulator/Main/GLUTkey.cxx b/src/Main/GLUTkey.cxx similarity index 100% rename from Simulator/Main/GLUTkey.cxx rename to src/Main/GLUTkey.cxx diff --git a/Simulator/Main/GLUTkey.hxx b/src/Main/GLUTkey.hxx similarity index 100% rename from Simulator/Main/GLUTkey.hxx rename to src/Main/GLUTkey.hxx diff --git a/Simulator/Main/GLUTmain.cxx b/src/Main/GLUTmain.cxx similarity index 100% rename from Simulator/Main/GLUTmain.cxx rename to src/Main/GLUTmain.cxx diff --git a/Simulator/Main/Makefile.am b/src/Main/Makefile.am similarity index 100% rename from Simulator/Main/Makefile.am rename to src/Main/Makefile.am diff --git a/Simulator/Main/fg_init.cxx b/src/Main/fg_init.cxx similarity index 100% rename from Simulator/Main/fg_init.cxx rename to src/Main/fg_init.cxx diff --git a/Simulator/Main/fg_init.hxx b/src/Main/fg_init.hxx similarity index 100% rename from Simulator/Main/fg_init.hxx rename to src/Main/fg_init.hxx diff --git a/Simulator/Main/fg_serial.cxx b/src/Main/fg_serial.cxx similarity index 100% rename from Simulator/Main/fg_serial.cxx rename to src/Main/fg_serial.cxx diff --git a/Simulator/Main/fg_serial.hxx b/src/Main/fg_serial.hxx similarity index 100% rename from Simulator/Main/fg_serial.hxx rename to src/Main/fg_serial.hxx diff --git a/Simulator/Main/mtest.c b/src/Main/mtest.c similarity index 100% rename from Simulator/Main/mtest.c rename to src/Main/mtest.c diff --git a/Simulator/Main/options.cxx b/src/Main/options.cxx similarity index 100% rename from Simulator/Main/options.cxx rename to src/Main/options.cxx diff --git a/Simulator/Main/options.hxx b/src/Main/options.hxx similarity index 100% rename from Simulator/Main/options.hxx rename to src/Main/options.hxx diff --git a/Simulator/Main/runfgfs.bat.in b/src/Main/runfgfs.bat.in similarity index 100% rename from Simulator/Main/runfgfs.bat.in rename to src/Main/runfgfs.bat.in diff --git a/Simulator/Main/runfgfs.in b/src/Main/runfgfs.in similarity index 100% rename from Simulator/Main/runfgfs.in rename to src/Main/runfgfs.in diff --git a/Simulator/Main/splash.cxx b/src/Main/splash.cxx similarity index 100% rename from Simulator/Main/splash.cxx rename to src/Main/splash.cxx diff --git a/Simulator/Main/splash.hxx b/src/Main/splash.hxx similarity index 100% rename from Simulator/Main/splash.hxx rename to src/Main/splash.hxx diff --git a/Simulator/Main/ttest.cxx b/src/Main/ttest.cxx similarity index 100% rename from Simulator/Main/ttest.cxx rename to src/Main/ttest.cxx diff --git a/Simulator/Main/views.cxx b/src/Main/views.cxx similarity index 100% rename from Simulator/Main/views.cxx rename to src/Main/views.cxx diff --git a/Simulator/Main/views.hxx b/src/Main/views.hxx similarity index 100% rename from Simulator/Main/views.hxx rename to src/Main/views.hxx diff --git a/Simulator/Makefile.am b/src/Makefile.am similarity index 100% rename from Simulator/Makefile.am rename to src/Makefile.am diff --git a/Simulator/Objects/Makefile.am b/src/Objects/Makefile.am similarity index 100% rename from Simulator/Objects/Makefile.am rename to src/Objects/Makefile.am diff --git a/Simulator/Objects/colours.h b/src/Objects/colours.h similarity index 100% rename from Simulator/Objects/colours.h rename to src/Objects/colours.h diff --git a/Simulator/Objects/fragment.cxx b/src/Objects/fragment.cxx similarity index 100% rename from Simulator/Objects/fragment.cxx rename to src/Objects/fragment.cxx diff --git a/Simulator/Objects/fragment.hxx b/src/Objects/fragment.hxx similarity index 100% rename from Simulator/Objects/fragment.hxx rename to src/Objects/fragment.hxx diff --git a/Simulator/Objects/material.cxx b/src/Objects/material.cxx similarity index 100% rename from Simulator/Objects/material.cxx rename to src/Objects/material.cxx diff --git a/Simulator/Objects/material.hxx b/src/Objects/material.hxx similarity index 100% rename from Simulator/Objects/material.hxx rename to src/Objects/material.hxx diff --git a/Simulator/Objects/materialmgr.cxx b/src/Objects/materialmgr.cxx similarity index 100% rename from Simulator/Objects/materialmgr.cxx rename to src/Objects/materialmgr.cxx diff --git a/Simulator/Objects/materialmgr.hxx b/src/Objects/materialmgr.hxx similarity index 100% rename from Simulator/Objects/materialmgr.hxx rename to src/Objects/materialmgr.hxx diff --git a/Simulator/Objects/obj.cxx b/src/Objects/obj.cxx similarity index 100% rename from Simulator/Objects/obj.cxx rename to src/Objects/obj.cxx diff --git a/Simulator/Objects/obj.hxx b/src/Objects/obj.hxx similarity index 100% rename from Simulator/Objects/obj.hxx rename to src/Objects/obj.hxx diff --git a/Simulator/Objects/texload.c b/src/Objects/texload.c similarity index 100% rename from Simulator/Objects/texload.c rename to src/Objects/texload.c diff --git a/Simulator/Objects/texload.h b/src/Objects/texload.h similarity index 100% rename from Simulator/Objects/texload.h rename to src/Objects/texload.h diff --git a/Simulator/Scenery/Makefile.am b/src/Scenery/Makefile.am similarity index 100% rename from Simulator/Scenery/Makefile.am rename to src/Scenery/Makefile.am diff --git a/Simulator/Scenery/design b/src/Scenery/design similarity index 100% rename from Simulator/Scenery/design rename to src/Scenery/design diff --git a/Simulator/Scenery/maptest.cxx b/src/Scenery/maptest.cxx similarity index 100% rename from Simulator/Scenery/maptest.cxx rename to src/Scenery/maptest.cxx diff --git a/Simulator/Scenery/scenery.cxx b/src/Scenery/scenery.cxx similarity index 100% rename from Simulator/Scenery/scenery.cxx rename to src/Scenery/scenery.cxx diff --git a/Simulator/Scenery/scenery.hxx b/src/Scenery/scenery.hxx similarity index 100% rename from Simulator/Scenery/scenery.hxx rename to src/Scenery/scenery.hxx diff --git a/Simulator/Scenery/test.cxx b/src/Scenery/test.cxx similarity index 100% rename from Simulator/Scenery/test.cxx rename to src/Scenery/test.cxx diff --git a/Simulator/Scenery/tilecache.cxx b/src/Scenery/tilecache.cxx similarity index 100% rename from Simulator/Scenery/tilecache.cxx rename to src/Scenery/tilecache.cxx diff --git a/Simulator/Scenery/tilecache.hxx b/src/Scenery/tilecache.hxx similarity index 100% rename from Simulator/Scenery/tilecache.hxx rename to src/Scenery/tilecache.hxx diff --git a/Simulator/Scenery/tileentry.cxx b/src/Scenery/tileentry.cxx similarity index 100% rename from Simulator/Scenery/tileentry.cxx rename to src/Scenery/tileentry.cxx diff --git a/Simulator/Scenery/tileentry.hxx b/src/Scenery/tileentry.hxx similarity index 100% rename from Simulator/Scenery/tileentry.hxx rename to src/Scenery/tileentry.hxx diff --git a/Simulator/Scenery/tilemgr.cxx b/src/Scenery/tilemgr.cxx similarity index 100% rename from Simulator/Scenery/tilemgr.cxx rename to src/Scenery/tilemgr.cxx diff --git a/Simulator/Scenery/tilemgr.hxx b/src/Scenery/tilemgr.hxx similarity index 100% rename from Simulator/Scenery/tilemgr.hxx rename to src/Scenery/tilemgr.hxx diff --git a/Simulator/Time/Makefile.am b/src/Time/Makefile.am similarity index 100% rename from Simulator/Time/Makefile.am rename to src/Time/Makefile.am diff --git a/Simulator/Time/event.cxx b/src/Time/event.cxx similarity index 100% rename from Simulator/Time/event.cxx rename to src/Time/event.cxx diff --git a/Simulator/Time/event.hxx b/src/Time/event.hxx similarity index 100% rename from Simulator/Time/event.hxx rename to src/Time/event.hxx diff --git a/Simulator/Time/fg_time.cxx b/src/Time/fg_time.cxx similarity index 100% rename from Simulator/Time/fg_time.cxx rename to src/Time/fg_time.cxx diff --git a/Simulator/Time/fg_time.hxx b/src/Time/fg_time.hxx similarity index 100% rename from Simulator/Time/fg_time.hxx rename to src/Time/fg_time.hxx diff --git a/Simulator/Time/fg_timer.cxx b/src/Time/fg_timer.cxx similarity index 100% rename from Simulator/Time/fg_timer.cxx rename to src/Time/fg_timer.cxx diff --git a/Simulator/Time/fg_timer.hxx b/src/Time/fg_timer.hxx similarity index 100% rename from Simulator/Time/fg_timer.hxx rename to src/Time/fg_timer.hxx diff --git a/Simulator/Time/light.cxx b/src/Time/light.cxx similarity index 100% rename from Simulator/Time/light.cxx rename to src/Time/light.cxx diff --git a/Simulator/Time/light.hxx b/src/Time/light.hxx similarity index 100% rename from Simulator/Time/light.hxx rename to src/Time/light.hxx diff --git a/Simulator/Time/moonpos.cxx b/src/Time/moonpos.cxx similarity index 100% rename from Simulator/Time/moonpos.cxx rename to src/Time/moonpos.cxx diff --git a/Simulator/Time/moonpos.hxx b/src/Time/moonpos.hxx similarity index 100% rename from Simulator/Time/moonpos.hxx rename to src/Time/moonpos.hxx diff --git a/Simulator/Time/sunpos.cxx b/src/Time/sunpos.cxx similarity index 100% rename from Simulator/Time/sunpos.cxx rename to src/Time/sunpos.cxx diff --git a/Simulator/Time/sunpos.hxx b/src/Time/sunpos.hxx similarity index 100% rename from Simulator/Time/sunpos.hxx rename to src/Time/sunpos.hxx diff --git a/Simulator/Time/test_event.c b/src/Time/test_event.c similarity index 100% rename from Simulator/Time/test_event.c rename to src/Time/test_event.c diff --git a/Simulator/Time/timestamp.hxx b/src/Time/timestamp.hxx similarity index 100% rename from Simulator/Time/timestamp.hxx rename to src/Time/timestamp.hxx diff --git a/Simulator/Time/ttest.c b/src/Time/ttest.c similarity index 100% rename from Simulator/Time/ttest.c rename to src/Time/ttest.c diff --git a/Simulator/Time/win32test.c b/src/Time/win32test.c similarity index 100% rename from Simulator/Time/win32test.c rename to src/Time/win32test.c diff --git a/Simulator/Todo b/src/Todo similarity index 100% rename from Simulator/Todo rename to src/Todo diff --git a/Simulator/Weather/Makefile.am b/src/Weather/Makefile.am similarity index 100% rename from Simulator/Weather/Makefile.am rename to src/Weather/Makefile.am diff --git a/Simulator/Weather/weather.cxx b/src/Weather/weather.cxx similarity index 100% rename from Simulator/Weather/weather.cxx rename to src/Weather/weather.cxx diff --git a/Simulator/Weather/weather.hxx b/src/Weather/weather.hxx similarity index 100% rename from Simulator/Weather/weather.hxx rename to src/Weather/weather.hxx diff --git a/Tests/Makefile.am b/tests/Makefile.am similarity index 100% rename from Tests/Makefile.am rename to tests/Makefile.am diff --git a/Tests/est-epsilon.c b/tests/est-epsilon.c similarity index 100% rename from Tests/est-epsilon.c rename to tests/est-epsilon.c diff --git a/Tests/gl-info.c b/tests/gl-info.c similarity index 100% rename from Tests/gl-info.c rename to tests/gl-info.c diff --git a/Tests/test-mktime.cxx b/tests/test-mktime.cxx similarity index 100% rename from Tests/test-mktime.cxx rename to tests/test-mktime.cxx -- 2.39.5