From: Tim Moore Date: Mon, 14 Sep 2009 12:26:20 +0000 (+0200) Subject: source tree reorganization prior to flightgear 0.7 X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=c90db01dc8d5462a3da22771ffa7c96f5ea31217;p=flightgear.git source tree reorganization prior to flightgear 0.7 SimGear and TerraGear appear to have been split off at this time. --- 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 14f1dfc82..000000000 Binary files a/Docs/FDM/LaRCsim/LaRCsim_generics_v_1.4.xls and /dev/null differ diff --git a/Docs/FDM/LaRCsim/manual.ps.gz b/Docs/FDM/LaRCsim/manual.ps.gz deleted file mode 100644 index 1cc09b8a2..000000000 Binary files a/Docs/FDM/LaRCsim/manual.ps.gz and /dev/null differ diff --git a/Docs/FDM/LaRCsim/manual.tex.gz b/Docs/FDM/LaRCsim/manual.tex.gz deleted file mode 100644 index 94603b726..000000000 Binary files a/Docs/FDM/LaRCsim/manual.tex.gz and /dev/null differ 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 3ba1865f4..000000000 Binary files a/Docs/InstallGuide/HTML/arizona.gif and /dev/null differ 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: - -

- -

-

-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. - -

- -

-

- 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: - -

- -

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: - -

- -

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: - -

- -

-

-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

- -

- -

-5.3.2  Features

- -

- -

-5.3.3  Flight model -

- -

- -

-5.3.4  Initial Position and Orientation -

- -

- -

-5.3.5  Rendering Options -

- -

- -

-5.3.6  Scenery Options Options -

- -

- -

-5.3.7  HUD Options -

- -

- -

-5.3.8  Time options -

- -

- -

-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. - -

- -

-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

- -

-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.) - -

- -

-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 6a1a5a1a5..000000000 Binary files a/Docs/InstallGuide/HTML/hud.gif and /dev/null differ diff --git a/Docs/InstallGuide/HTML/navion.gif b/Docs/InstallGuide/HTML/navion.gif deleted file mode 100644 index a4aafdf2b..000000000 Binary files a/Docs/InstallGuide/HTML/navion.gif and /dev/null differ diff --git a/Docs/InstallGuide/HTML/panel.gif b/Docs/InstallGuide/HTML/panel.gif deleted file mode 100644 index 87ab2d3aa..000000000 Binary files a/Docs/InstallGuide/HTML/panel.gif and /dev/null differ diff --git a/Docs/InstallGuide/HTML/start.gif b/Docs/InstallGuide/HTML/start.gif deleted file mode 100644 index 5d652cf10..000000000 Binary files a/Docs/InstallGuide/HTML/start.gif and /dev/null differ diff --git a/Docs/InstallGuide/PDF/getstart.pdf b/Docs/InstallGuide/PDF/getstart.pdf deleted file mode 100644 index f6aed7d36..000000000 Binary files a/Docs/InstallGuide/PDF/getstart.pdf and /dev/null differ diff --git a/Docs/InstallGuide/SOURCE/arizona.eps b/Docs/InstallGuide/SOURCE/arizona.eps deleted file mode 100644 index 34714c854..000000000 --- a/Docs/InstallGuide/SOURCE/arizona.eps +++ /dev/null @@ -1,2121 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: jpeg2ps V1.5 by Thomas Merz -%%Title: arizona.jpg -%%CreationDate: Wed Jun 02 03:07:11 1999 -%%BoundingBox: 20 20 662 521 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -%%EndProlog -%%Page: 1 1 -/languagelevel where {pop languagelevel 2 lt}{true} ifelse { - (JPEG file 'arizona.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 -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 2624e74c8..000000000 Binary files a/Docs/Scenery/DLG/dlg3sdts.wp.gz and /dev/null differ diff --git a/Docs/Scenery/DLG/dug-2.wp6.gz b/Docs/Scenery/DLG/dug-2.wp6.gz deleted file mode 100755 index 695978af0..000000000 Binary files a/Docs/Scenery/DLG/dug-2.wp6.gz and /dev/null differ 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/Include/Makefile.am b/Include/Makefile.am deleted file mode 100644 index be657140e..000000000 --- a/Include/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -EXTRA_DIST = \ - auto_ptr.hxx \ - config.h.in \ - cmdargs.h \ - compiler.h \ - fg_callback.hxx \ - fg_constants.h \ - fg_memory.h \ - fg_traits.hxx \ - fg_typedefs.h \ - fg_stl_config.h \ - fg_zlib.h \ - general.hxx diff --git a/Include/auto_ptr.hxx b/Include/auto_ptr.hxx deleted file mode 100644 index 732129227..000000000 --- a/Include/auto_ptr.hxx +++ /dev/null @@ -1,89 +0,0 @@ -/************************************************************************** - * auto_ptr.hxx -- A simple auto_ptr definition. - * - * 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 _AUTO_PTR_HXX -#define _AUTO_PTR_HXX - -#include "fg_stl_config.h" - -//----------------------------------------------------------------------------- -// -// auto_ptr is initialised with a pointer obtained via new and deletes that -// object when it itself is destroyed (such as when leaving block scope). -// auto_ptr can be used in any way that a normal pointer can be. -// -// This class is only required when the STL doesn't supply one. -// -template class auto_ptr { -private: - X* ptr; - mutable bool owns; - -public: - typedef X element_type; - - explicit auto_ptr(X* p = 0) : ptr(p), owns(p) {} - - auto_ptr(const auto_ptr& a) : ptr(a.ptr), owns(a.owns) { - a.owns = 0; - } - -#ifdef _FG_MEMBER_TEMPLATES - template auto_ptr(const auto_ptr& a) - : ptr(a.ptr), owns(a.owns) { - a.owns = 0; - } -#endif - - auto_ptr& operator = (const auto_ptr& a) { - if (&a != this) { - if (owns) - delete ptr; - owns = a.owns; - ptr = a.ptr; - a.owns = 0; - } - } - -#ifdef _FG_MEMBER_TEMPLATES - template auto_ptr& operator = (const auto_ptr& a) { - if (&a != this) { - if (owns) - delete ptr; - owns = a.owns; - ptr = a.ptr; - a.owns = 0; - } - } -#endif - - ~auto_ptr() { - if (owns) - delete ptr; - } - - X& operator*() const { return *ptr; } - X* operator->() const { return ptr; } - X* get() const { return ptr; } - X* release() const { owns = false; return ptr; } -}; - -#endif /* _AUTO_PTR_HXX */ - diff --git a/Include/cmdargs.h b/Include/cmdargs.h deleted file mode 100644 index fd7127b21..000000000 --- a/Include/cmdargs.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// CMDLINE Argument External Definitions. A hack to make command line -// argument values visible to affected program locations. -// -// When implementing this feature my design intent was that program -// options should be set according to the following rules of -// option hierarchy. -// -// 1. Command line options have top priority. -// 2. Environmental options over ride default options. -// 3. All options must have a meaningful state. On a given platform, -// some option setting is most likely to be desired by that community. -// -// CHotchkiss 10 Feb 98 -// -// $Id$ - - -#ifndef _CMDARGS_H -#define _CMDARGS_H - -// buffers here are all MAXPATH in length. IS THIS DEFINE UNIVERSAL? - -extern char acArgbuf[]; -extern int debugArgValue; -extern int priorityArgValue; -extern char rootArgbuf[]; -extern int viewArg; -extern char logArgbuf[]; - -// These are used by initialization and RE initialization routines -// (none right now) to set up for running (or from warm reset.) - -extern const char *DefaultRootDir; -extern const char *DefaultAircraft; -extern const char *DefaultDebuglog; -extern const int DefaultViewMode; - -#endif -// end of cmdargs.h - - diff --git a/Include/compiler.h b/Include/compiler.h deleted file mode 100644 index 95fd8afcb..000000000 --- a/Include/compiler.h +++ /dev/null @@ -1,296 +0,0 @@ -/************************************************************************** - * compiler.h -- C++ Compiler Portability Macros - * - * 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 _COMPILER_H -#define _COMPILER_H - -// What this file does. -// (1) Defines macros for some STL includes which may be affected -// by file name length limitations. -// (2) Defines macros for some features not supported by all C++ compilers. -// (3) Defines 'explicit' as a null macro if the compiler doesn't support -// the explicit keyword. -// (4) Defines 'typename' as a null macro if the compiler doesn't support -// the typename keyword. -// (5) Defines bool, true and false if the compiler doesn't do so. -// (6) Defines FG_EXPLICIT_FUNCTION_TMPL_ARGS if the compiler -// supports calling a function template by providing its template -// arguments explicitly. -// (7) Defines FG_NEED_AUTO_PTR if STL doesn't provide auto_ptr<>. -// (8) Defines FG_NO_ARROW_OPERATOR if the compiler is unable -// to support operator->() for iterators. -// (9) Defines FG_USE_EXCEPTIONS if the compiler supports exceptions. -// Note: no FlightGear code uses exceptions. -// (10) Define FG_NAMESPACES if the compiler supports namespaces. -// (11) FG_MATH_FN_IN_NAMESPACE_STD -- not used?? -// (12) Define FG_HAVE_STD if std namespace is supported. -// (13) Defines FG_CLASS_PARTIAL_SPECIALIZATION if the compiler -// supports partial specialization of class templates. -// (14) Defines FG_HAVE_STD_INCLUDES to use ISO C++ Standard headers. -// (15) Defines FG_HAVE_STREAMBUF if of are present. -// (16) Define FG_MATH_EXCEPTION_CLASH if math.h defines an exception class -// that clashes with the one defined in . - -#ifdef __GNUC__ -# if __GNUC__ == 2 -# if __GNUC_MINOR__ < 8 - - // g++-2.7.x -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_STDEXCEPT -# define STL_STRING -# define STL_STRSTREAM - -# define FG_NEED_AUTO_PTR -# define FG_NO_DEFAULT_TEMPLATE_ARGS -# define FG_INCOMPLETE_FUNCTIONAL -# define FG_NO_ARROW_OPERATOR - -# elif __GNUC_MINOR__ >= 8 - - // g++-2.8.x and egcs-1.x -# define FG_EXPLICIT_FUNCTION_TMPL_ARGS -# define FG_NEED_AUTO_PTR -# define FG_MEMBER_TEMPLATES -# define FG_NAMESPACES -# define FG_HAVE_STD -# define FG_HAVE_STREAMBUF -# define FG_CLASS_PARTIAL_SPECIALIZATION - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_STDEXCEPT -# define STL_STRING -# define STL_STRSTREAM - -# endif -# else -# error Time to upgrade. GNU compilers < 2.7 not supported -# endif -#endif - -// -// Metrowerks -// -#if defined(__MWERKS__) -/* - CodeWarrior compiler from Metrowerks, Inc. -*/ -# define FG_HAVE_TRAITS -# define FG_HAVE_STD_INCLUDES -# define FG_HAVE_STD -# define FG_NAMESPACES - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_STDEXCEPT -# define STL_STRING - -// Temp: -# define bcopy(from, to, n) memcpy(to, from, n) - -// -rp- please use FG_MEM_COPY everywhere ! -# define FG_MEM_COPY(to,from,n) memcpy(to, from, n) - -// -dw- currently used glut has no game mode stuff -# define GLUT_WRONG_VERSION -#endif - -// -// Microsoft compilers. -// -#ifdef _MSC_VER -# if _MSC_VER == 1200 // msvc++ 6.0 -# define FG_NAMESPACES -# define FG_HAVE_STD -# define FG_HAVE_STD_INCLUDES -# define FG_HAVE_STREAMBUF - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_STDEXCEPT -# define STL_STRING -# define STL_STRSTREAM - -# pragma warning(disable: 4786) // identifier was truncated to '255' characters -# pragma warning(disable: 4244) // conversion from double to float -# pragma warning(disable: 4305) // - -# elif _MSC_VER == 1100 // msvc++ 5.0 -# error MSVC++ 5.0 still to be supported... -# else -# error What version of MSVC++ is this? -# endif -#endif - -#ifdef __BORLANDC__ -# if defined(HAVE_SGI_STL_PORT) - -// Use quotes around long file names to get around Borland's include hackery - -# define STL_ALGORITHM "algorithm" -# define STL_FUNCTIONAL "functional" - -# define FG_MATH_EXCEPTION_CLASH - -# else - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_STDEXCEPT -# define STL_STRSTREAM - -# define FG_INCOMPLETE_FUNCTIONAL - -# endif // HAVE_SGI_STL_PORT - -# define STL_IOSTREAM -# define STL_STRING -# define FG_NO_DEFAULT_TEMPLATE_ARGS -# define FG_NAMESPACES -// # define FG_HAVE_STD - -#endif // __BORLANDC__ - -// -// Native SGI compilers -// - -#if defined ( sgi ) && !defined( __GNUC__ ) -# define FG_HAVE_NATIVE_SGI_COMPILERS - -# define FG_EXPLICIT_FUNCTION_TMPL_ARGS -# define FG_NEED_AUTO_PTR -# define FG_MEMBER_TEMPLATES -# define FG_NAMESPACES -# define FG_HAVE_STD -# define FG_CLASS_PARTIAL_SPECIALIZATION - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_STDEXCEPT -# define STL_STRING -# define STL_STRSTREAM - -#endif // Native SGI compilers - - -#if defined ( sun ) -# include -# if defined ( __cplusplus ) - // typedef unsigned int size_t; - extern "C" { - extern void *memmove(void *, const void *, size_t); - } -# else - extern void *memmove(void *, const void *, size_t); -# endif // __cplusplus -#endif // sun - -// -// No user modifiable definitions beyond here. -// - -#ifdef FG_NEED_EXPLICIT -# define explicit -#endif - -#ifdef FG_NEED_TYPENAME -# define typename -#endif - -#ifdef FG_NEED_MUTABLE -# define mutable -#endif - -#ifdef FG_NEED_BOOL - typedef int bool; -# define true 1 -# define false 0 -#endif - -#ifdef FG_EXPLICIT_FUNCTION_TMPL_ARGS -# define FG_NULL_TMPL_ARGS <> -#else -# define FG_NULL_TMPL_ARGS -#endif - -#ifdef FG_CLASS_PARTIAL_SPECIALIZATION -# define FG_TEMPLATE_NULL template<> -#else -# define FG_TEMPLATE_NULL -#endif - -// FG_NO_NAMESPACES is a hook so that users can disable namespaces -// without having to edit library headers. -#if defined(FG_NAMESPACES) && !defined(FG_NO_NAMESPACES) -# define FG_NAMESPACE(X) namespace X { -# define FG_NAMESPACE_END } -# define FG_USING_NAMESPACE(X) using namespace X -# else -# define FG_NAMESPACE(X) -# define FG_NAMESPACE_END -# define FG_USING_NAMESPACE(X) -#endif - -# ifdef FG_HAVE_STD -# define FG_USING_STD(X) using std::X -# define STD std -# else -# define FG_USING_STD(X) -# define STD -# endif - -// Additional implementation from SGI STL 3.11 -// Adapter function objects: pointers to member functions -#ifdef FG_INCOMPLETE_FUNCTIONAL - -template -class const_mem_fun_ref_t -#ifndef __BORLANDC__ - : public unary_function<_Tp,_Ret> -#endif // __BORLANDC__ -{ -public: - explicit const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {} - _Ret operator()(const _Tp& __r) const { return (__r.*_M_f)(); } -private: - _Ret (_Tp::*_M_f)() const; -}; - -template -inline const_mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)() const) - { return const_mem_fun_ref_t<_Ret,_Tp>(__f); } - -#endif // FG_INCOMPLETE_FUNCTIONAL - -#endif // _COMPILER_H diff --git a/Include/config.h.in b/Include/config.h.in deleted file mode 100644 index 4b854da56..000000000 --- a/Include/config.h.in +++ /dev/null @@ -1,197 +0,0 @@ -/* Include/config.h.in. Generated automatically from configure.in by autoheader. */ - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define if you don't have vprintf but do have _doprnt. */ -#undef HAVE_DOPRNT - -/* Define if you have the vprintf function. */ -#undef HAVE_VPRINTF - -/* Define as the return type of signal handlers (int or void). */ -#undef RETSIGTYPE - -/* Define to `unsigned' if doesn't define. */ -#undef size_t - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if you can safely include both and . */ -#undef TIME_WITH_SYS_TIME - -/* Define if your declares struct tm. */ -#undef TM_IN_SYS_TIME - -/* Define if the X Window System is missing or not being used. */ -#undef X_DISPLAY_MISSING - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define to eliminate all trace of debugging messages such as for a - release build */ -#undef FG_NDEBUG - -/* Define if you don't have vprintf but do have _doprnt. */ -#undef HAVE_DOPRNT - -/* Define if you have the vprintf function. */ -#undef HAVE_VPRINTF - -/* Define to package name */ -#undef PACKAGE - -/* Define as the return type of signal handlers (int or void). */ -#undef RETSIGTYPE - -/* Define to `unsigned' if doesn't define. */ -#undef size_t - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if you can safely include both and . */ -#undef TIME_WITH_SYS_TIME - -/* Define if your declares struct tm. */ -#undef TM_IN_SYS_TIME - -/* Define to version number */ -#undef VERSION - -/* Define if compiling on a Winbloze (95, NT, etc.) platform */ -#undef WIN32 - -/* Define if the X Window System is missing or not being used. */ -#undef X_DISPLAY_MISSING - -/* Define if you have the GetLocalTime function. */ -#undef HAVE_GETLOCALTIME - -/* Define if you have the bcopy function. */ -#undef HAVE_BCOPY - -/* Define if you have the ftime function. */ -#undef HAVE_FTIME - -/* Define if you have the getitimer function. */ -#undef HAVE_GETITIMER - -/* Define if you have the getrusage function. */ -#undef HAVE_GETRUSAGE - -/* Define if you have the gettimeofday function. */ -#undef HAVE_GETTIMEOFDAY - -/* Define if you have the memcpy function. */ -#undef HAVE_MEMCPY - -/* Define if you have the mktime function. */ -#undef HAVE_MKTIME - -/* Define if you have the rand function. */ -#undef HAVE_RAND - -/* Define if you have the random function. */ -#undef HAVE_RANDOM - -/* Define if you have the rint function. */ -#undef HAVE_RINT - -/* Define if you have the setitimer function. */ -#undef HAVE_SETITIMER - -/* Define if you have the signal function. */ -#undef HAVE_SIGNAL - -/* Define if you have the strstr function. */ -#undef HAVE_STRSTR - -/* Define if you have the header file. */ -#undef HAVE_FCNTL_H - -/* Define if you have the header file. */ -#undef HAVE_GETOPT_H - -/* Define if you have the header file. */ -#undef HAVE_GFC_GDBF_H - -/* Define if you have the header file. */ -#undef HAVE_GPC_H - -/* Define if you have the header file. */ -#undef HAVE_MALLOC_H - -/* Define if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_TIME_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_TIMEB_H - -/* Define if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define if you have the header file. */ -#undef HAVE_VALUES_H - -/* Define if you have the header file. */ -#undef HAVE_WINBASE_H - -/* Define if you have the header file. */ -#undef HAVE_WINDOWS_H - -/* Define if you have the GL library (-lGL). */ -#undef HAVE_LIBGL - -/* Define if you have the GLU library (-lGLU). */ -#undef HAVE_LIBGLU - -/* Define if you have the GLcore library (-lGLcore). */ -#undef HAVE_LIBGLCORE - -/* Define if you have the ICE library (-lICE). */ -#undef HAVE_LIBICE - -/* Define if you have the MesaGL library (-lMesaGL). */ -#undef HAVE_LIBMESAGL - -/* Define if you have the MesaGLU library (-lMesaGLU). */ -#undef HAVE_LIBMESAGLU - -/* Define if you have the SM library (-lSM). */ -#undef HAVE_LIBSM - -/* Define if you have the X11 library (-lX11). */ -#undef HAVE_LIBX11 - -/* Define if you have the Xext library (-lXext). */ -#undef HAVE_LIBXEXT - -/* Define if you have the Xi library (-lXi). */ -#undef HAVE_LIBXI - -/* Define if you have the Xmu library (-lXmu). */ -#undef HAVE_LIBXMU - -/* Define if you have the Xt library (-lXt). */ -#undef HAVE_LIBXT - -/* Define if you have the glut library (-lglut). */ -#undef HAVE_LIBGLUT - -/* Define if you have the m library (-lm). */ -#undef HAVE_LIBM - -/* Define if you have the socket library (-lsocket). */ -#undef HAVE_LIBSOCKET diff --git a/Include/fg_callback.hxx b/Include/fg_callback.hxx deleted file mode 100644 index e66e62580..000000000 --- a/Include/fg_callback.hxx +++ /dev/null @@ -1,176 +0,0 @@ -/************************************************************************** - * fg_callback.hxx -- Wrapper classes to treat function and method pointers - * as objects. - * - * 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_CALLBACK_HXX -#define _FG_CALLBACK_HXX - -// -dw- need size_t for params() function -#ifdef __MWERKS__ -typedef unsigned long size_t; -#endif - - -//----------------------------------------------------------------------------- -// -// Abstract base class for all FlightGear callbacks. -// -class fgCallback -{ -public: - virtual ~fgCallback() {} - - virtual fgCallback* clone() const = 0; - virtual void* call( void** ) = 0; - - size_t params() const { return n_params; } - -protected: - fgCallback( size_t params ) - : n_params(params) {} - -protected: - // The number of parameters to pass to the callback routine. - size_t n_params; - -private: -}; - -//----------------------------------------------------------------------------- -// -// Callback for invoking a file scope function. -// -class fgFunctionCallback : public fgCallback -{ -public: - // Pointer to function taking no arguments and returning void. - typedef void (*Proc0v)(); - - // A callback instance to invoke the function 'p' - fgFunctionCallback( Proc0v p ); - - // Create a clone on the heap. - virtual fgCallback* clone() const; - -private: - void* call( void** in ); - inline void* call0v( void** ); - -private: - // Not defined. - fgFunctionCallback(); - -private: - - typedef void* (fgFunctionCallback::*DoPtr)( void** ); - DoPtr doPtr; - Proc0v proc0v; -}; - -inline -fgFunctionCallback::fgFunctionCallback( Proc0v p ) - : fgCallback(0), - doPtr(&fgFunctionCallback::call0v), - proc0v(p) -{ - // empty -} - -inline fgCallback* -fgFunctionCallback::clone() const -{ - return new fgFunctionCallback( *this ); -} - -inline void* -fgFunctionCallback::call( void** in ) -{ - return (this->*doPtr)( in ); -} - -inline void* -fgFunctionCallback::call0v( void** ) -{ - (*proc0v)(); - return (void*) NULL; -} - -//----------------------------------------------------------------------------- -// -// Callback for invoking an object method. -// -template< class T > -class fgMethodCallback : public fgCallback -{ -public: - // Pointer to method taking no arguments and returning void. - typedef void (T::*Method0v)(); - - // A callback instance to invoke method 'm' of object 'o' - fgMethodCallback( T* o, Method0v m ) - : fgCallback(0), - object(o), - method0v(m), - doPtr(&fgMethodCallback::call0v) {} - - // Create a clone on the heap. - fgCallback* clone() const; - -private: - // - void* call( void** in ); - - // - void* call0v( void** ); - -private: - // Not defined. - fgMethodCallback(); - -private: - T* object; - Method0v method0v; - - typedef void * (fgMethodCallback::*DoPtr)( void ** ); - DoPtr doPtr; -}; - -template< class T > inline fgCallback* -fgMethodCallback::clone() const -{ - return new fgMethodCallback( *this ); -} - -template< class T > inline void* -fgMethodCallback::call( void** in ) -{ - return (this->*doPtr)( in ); -} - - -template< class T > inline void* -fgMethodCallback::call0v( void** ) -{ - (object->*method0v)(); - return (void*) NULL; -} - -#endif // _FG_CALLBACK_HXX - diff --git a/Include/fg_constants.h b/Include/fg_constants.h deleted file mode 100644 index c925c7843..000000000 --- a/Include/fg_constants.h +++ /dev/null @@ -1,172 +0,0 @@ -// fg_constants.h -- various constant definitions -// -// Written by Curtis Olson, started July 1997. -// -// 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$ - - -#ifndef _FG_CONSTANTS_H -#define _FG_CONSTANTS_H - - -/* -#ifndef __cplusplus -# error This library requires C++ -#endif -*/ - - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "Include/compiler.h" - -#ifdef FG_HAVE_STD_INCLUDES -# include -#else -# ifdef FG_MATH_EXCEPTION_CLASH -# define exception C_exception -# endif -# include -#endif - -// This should be defined via autoconf in configure.in -#ifndef VERSION -#define VERSION "\"not defined\"" -#endif - - -// Make sure PI is defined in its various forms - -// PI, only PI, and nothing but PI -#ifdef M_PI -# define FG_PI M_PI -#else -# define FG_PI 3.14159265358979323846 -#endif - -// 2 * PI -#define FG_2PI 6.28318530717958647692 - -// PI / 2 -#ifdef M_PI_2 -# define FG_PI_2 M_PI_2 -#else -# define FG_PI_2 1.57079632679489661923 -#endif - -// PI / 4 -#define FG_PI_4 0.78539816339744830961 - -#ifndef M_E -# define M_E 2.7182818284590452354 -#endif - -// ONE_SECOND is pi/180/60/60, or about 100 feet at earths' equator -#define ONE_SECOND 4.848136811E-6 - - -// Radius of Earth in kilometers at the equator. Another source had -// 6378.165 but this is probably close enough -#define EARTH_RAD 6378.155 - - -// Earth parameters for WGS 84, taken from LaRCsim/ls_constants.h - -// Value of earth radius from [8] -#define EQUATORIAL_RADIUS_FT 20925650. // ft -#define EQUATORIAL_RADIUS_M 6378138.12 // meter -// Radius squared -#define RESQ_FT 437882827922500. // ft -#define RESQ_M 40680645877797.1344 // meter - -// Value of earth flattening parameter from ref [8] -// -// Note: FP = f -// E = 1-f -// EPS = sqrt(1-(1-f)^2) -// - -#define FP 0.003352813178 -#define E 0.996647186 -#define EPS 0.081819221 -#define INVG 0.031080997 - -// Time Related Parameters - -#define MJD0 2415020.0 -#define J2000 (2451545.0 - MJD0) -#define SIDRATE .9972695677 - - -// Conversions - -// Degrees to Radians -#define DEG_TO_RAD 0.017453292 // deg*pi/180 = rad - -// Radians to Degrees -#define RAD_TO_DEG 57.29577951 // rad*180/pi = deg - -// Arc seconds to radians // (arcsec*pi)/(3600*180) = rad -#define ARCSEC_TO_RAD 4.84813681109535993589e-06 - -// Radians to arc seconds // (rad*3600*180)/pi = arcsec -#define RAD_TO_ARCSEC 206264.806247096355156 - -// Feet to Meters -#define FEET_TO_METER 0.3048 - -// Meters to Feet -#define METER_TO_FEET 3.28083989501312335958 - -// Meters to Nautical Miles, 1 nm = 6076.11549 feet -#define METER_TO_NM 0.00053995680 - -// Nautical Miles to Meters -#define NM_TO_METER 1852.0000 - -// Radians to Nautical Miles, 1 nm = 1/60 of a degree -#define NM_TO_RAD 0.00029088820866572159 - -// Nautical Miles to Radians -#define RAD_TO_NM 3437.7467707849392526 - -// For divide by zero avoidance, this will be close enough to zero -#define FG_EPSILON 0.0000001 - - -// Timing constants for Flight Model updates -#define DEFAULT_TIMER_HZ 20 -#define DEFAULT_MULTILOOP 6 -#define DEFAULT_MODEL_HZ (DEFAULT_TIMER_HZ * DEFAULT_MULTILOOP) - - -// Field of view limits -#define FG_FOV_MIN 0.1 -#define FG_FOV_MAX 179.9 - - -// Maximum nodes per tile -#define FG_MAX_NODES 2000 - - -#endif // _FG_CONSTANTS_H - - diff --git a/Include/fg_memory.h b/Include/fg_memory.h deleted file mode 100644 index 711eb107b..000000000 --- a/Include/fg_memory.h +++ /dev/null @@ -1,59 +0,0 @@ -// fg_memory.h -- memcpy/bcopy portability declarations -// -// 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_MEMORY_H -#define _FG_MEMORY_H - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#ifdef HAVE_MEMCPY - -# ifdef HAVE_MEMORY_H -# include -# endif - -# define fgmemcmp memcmp -# define fgmemcpy memcpy -# define fgmemzero(dest,len) memset(dest,0,len) - -#elif defined(HAVE_BCOPY) - -# define fgmemcmp bcmp -# define fgmemcpy(dest,src,n) bcopy(src,dest,n) -# define fgmemzero bzero - -#else - -/* - * Neither memcpy() or bcopy() available. - * Use substitutes provided be zlib. - */ - -# include -# define fgmemcmp zmemcmp -# define fgmemcpy zmemcpy -# define fgmemzero zmemzero - -#endif - -#endif // _FG_MEMORY_H - - diff --git a/Include/fg_stl_config.h b/Include/fg_stl_config.h deleted file mode 100644 index 100160e69..000000000 --- a/Include/fg_stl_config.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/Include/fg_traits.hxx b/Include/fg_traits.hxx deleted file mode 100644 index 1547bcaa8..000000000 --- a/Include/fg_traits.hxx +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _FG_TRAITS_HXX -#define _FG_TRAITS_HXX - -#include "Include/compiler.h" - -#ifndef FG_HAVE_TRAITS - -// Dummy up some char traits for now. -template struct char_traits{}; - -FG_TEMPLATE_NULL -struct char_traits -{ - typedef char char_type; - typedef int int_type; - typedef streampos pos_type; - typedef streamoff off_type; - - static int_type eof() { return EOF; } -}; -#endif // FG_HAVE_TRAITS - -#endif // _FG_TRAITS_HXX diff --git a/Include/fg_typedefs.h b/Include/fg_typedefs.h deleted file mode 100644 index 048842d6e..000000000 --- a/Include/fg_typedefs.h +++ /dev/null @@ -1,117 +0,0 @@ -/* -// Alterations: Copyright C. Hotchkiss 1996 -// -// $Log$ -// Revision 1.2 1999/04/22 18:45:42 curt -// Borland tweaks. -// -// Revision 1.1.1.1 1999/04/05 21:32:40 curt -// Start of 0.6.x branch. -// -// Revision 1.2 1998/05/13 18:23:46 curt -// fg_typedefs.h: updated version by Charlie Hotchkiss -// general.h: moved fg_root info to fgOPTIONS structure. -// -// Revision 1.1 1998/05/11 18:26:12 curt -// Initial revision. -// -// Rev 1.4 11 Nov 1997 15:34:28 CHOTCHKISS -// Expanded definitions. -// -// Rev 1.3 20 Jan 1997 9:21:26 CHOTCHKISS -// Minor additions. -// -// Rev 1.2 12 Nov 1996 15:06:52 CHOTCHKISS -// Dropped PC Write print format control lines. -// -// Rev 1.1 20 Nov 1995 15:59:02 CHOTCHKISS -// Additions and improvements. Memcheck compatibilities. -// -// Rev 1.0 06 Apr 1995 14:00:32 CHOTCHKISS -// Initial revision. -  -*/ -/* -// TYPEDEFS.H - General purpose definition file -// Copyright (C) 1992 Paradigm Systems. All rights reserved. -// -// Function -// ======== -// This file contains the general purpose definitions common to the -// all Paradigm applications. By defining synonyms for the physical -// data types to be manipulated, portability between memory models -// and machines is maximized. -// -// Note that this file follows the system include files and before -// any application include files. -*/ - -#if !defined(_TYPEDEFS) -#define _TYPEDEFS - -// -// Define the types to be used to manipulate 8-, 16-, and 32-bit -// data. -// -typedef unsigned int BIT ; // Use for defining Borland bit fields -typedef char CHAR ; // 8-bit signed data -typedef const char COCHAR; -typedef unsigned char UCHAR ; // 8-bit unsigned data -typedef unsigned char BYTE; -typedef int INT ; // 16-bit signed data -typedef unsigned int UINT ; // 16-bit unsigned data -typedef const int COINT; // 16=bit constant int -typedef const UINT COUINT; -typedef long LONG ; // 32-bit signed data -typedef unsigned long ULONG ; // 32-bit unsigned data - -typedef unsigned short UWORD; // Unsigned 16 bit quantity (WIN=SHORT) -#if !defined(WIN32) -typedef signed short WORD; // Signed 16 bit quantity -#endif -typedef BYTE UBYTE; // Used in some 3rd party code -#ifndef WIN32 -typedef int BOOLEAN; // -#endif - -typedef float FLOAT ; // 32-bit floating point data -typedef double DOUBLE ; // 64-bit floating point data -typedef long double LDOUBLE ; // 80-bit floating point data - -#ifndef __cplusplus -typedef int bool; -typedef int BOOL; -typedef int Bool; -#else -#ifndef WIN32 -#define BOOL int -#endif -#endif - -#define Bool int - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - -#ifndef true // C++ defines bool, true and false. -#define true TRUE -#define false FALSE -#endif - -#ifndef EOF -#define EOF (-1) -#endif - -typedef void(*VFNPTR) ( void ); -typedef void(*VFNINTPTR)( int ); -typedef int (*FNPTR) ( void ); -typedef int (*FNINTPTR) ( int ); -typedef int (*FNUIPTR) ( UINT ); -typedef double( *DBLFNPTR)( void ); -typedef float( *FLTFNPTR)( void ); - -#endif - - /* !defined(_TYPEDEFS) */ diff --git a/Include/fg_zlib.h b/Include/fg_zlib.h deleted file mode 100644 index d0dba9150..000000000 --- a/Include/fg_zlib.h +++ /dev/null @@ -1,82 +0,0 @@ -/************************************************************************** - * fg_zlib.h -- a zlib wrapper to replace zlib calls with normal uncompressed - * calls for systems that have problems building zlib. - * - * 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 _FG_ZLIB_H -#define _FG_ZLIB_H - - -#ifdef HAVE_CONFIG_H -# include -#endif - - -#ifdef AVOID_USING_ZLIB - - #include - - #define fgFile FILE * - - /* fgFile fgopen(char *filename, const char *flags) */ - #define fgopen(P, F) (fopen((P), (F))) - - /* int fgseek(fgFile *file, long offset, int whence) */ - #define fgseek(F, O, W) (fseek((F), (O), (W))) - - /* fgread(fgFile file, void *buf, int size); */ - #define fgread(F, B, S) (fread((B), (S), 1, (F))) - - /* int fggets(fgFile fd, char *buffer, int len) */ - #define fggets(F, B, L) (fgets((B), (L), (F))) - - /* int fgclose(fgFile fd) */ - #define fgclose(F) (fclose((F))) -#else - - #include - - #define fgFile gzFile - - /* fgFile fgopen(char *filename, const char *flags) */ - #define fgopen(P, F) (gzopen((P), (F))) - - /* int fgseek(fgFile *file, long offset, int whence) */ - #define fgseek(F, O, W) (gzseek((F), (O), (W))) - - /* fgread(fgFile file, void *buf, int size); */ - #define fgread(F, B, S) (gzread((F), (B), (S))) - - /* int fggets(fgFile fd, char *buffer, int len) */ - #define fggets(F, B, L) (gzgets((F), (B), (L))) - - /* int fgclose(fgFile fd) */ - #define fgclose(F) (gzclose((F))) - -#endif /* #ifdef AVOID_USING_ZLIB #else #endif */ - - -#endif /* _FG_ZLIB_H */ - - diff --git a/Include/general.hxx b/Include/general.hxx deleted file mode 100644 index 9d7fecb6d..000000000 --- a/Include/general.hxx +++ /dev/null @@ -1,76 +0,0 @@ -// general.hxx -- a general house keeping data structure definition for -// various info that might need to be accessible from all -// parts of the sim. -// -// 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 _GENERAL_HXX -#define _GENERAL_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -// #define FANCY_FRAME_COUNTER -#ifdef FANCY_FRAME_COUNTER -#define FG_FRAME_RATE_HISTORY 10 -#endif - - -// the general house keeping structure definition -class FGGeneral { - // Info about OpenGL - char *glVendor; - char *glRenderer; - char *glVersion; - - // Last frame rate measurement - int frame_rate; -#ifdef FANCY_FRAME_COUNTER - double frames[FG_FRAME_RATE_HISTORY]; -#endif - -public: - - inline void set_glVendor( char *str ) { glVendor = str; } - inline char* get_glRenderer() const { return glRenderer; } - inline void set_glRenderer( char *str ) { glRenderer = str; } - inline void set_glVersion( char *str ) { glVersion = str; } - inline double get_frame_rate() const { return frame_rate; } -#ifdef FANCY_FRAME_COUNTER - inline double get_frame(int idx) const { return frames[idx]; } - inline void set_frame( int idx, double value ) { frames[idx] = value; } - inline void set_frame_rate( double rate ) { frame_rate = rate; } -#else - inline void set_frame_rate( int rate ) { frame_rate = rate; } -#endif -}; - -// general contains all the general house keeping parameters. -extern FGGeneral general; - - -#endif // _GENERAL_HXX - - 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/Simulator/Aircraft/Makefile.am b/Simulator/Aircraft/Makefile.am deleted file mode 100644 index 9620f85e1..000000000 --- a/Simulator/Aircraft/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -noinst_LIBRARIES = libAircraft.a - -libAircraft_a_SOURCES = aircraft.cxx aircraft.hxx - -INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib -I$(top_builddir)/Simulator diff --git a/Simulator/Aircraft/aircraft.cxx b/Simulator/Aircraft/aircraft.cxx deleted file mode 100644 index e48aefbb6..000000000 --- a/Simulator/Aircraft/aircraft.cxx +++ /dev/null @@ -1,68 +0,0 @@ -// aircraft.cxx -- various aircraft routines -// -// Written by Curtis Olson, started May 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 "aircraft.hxx" -#include -#include - -// This is a record containing all the info for the aircraft currently -// being operated -fgAIRCRAFT current_aircraft; - - -// Initialize an Aircraft structure -void fgAircraftInit( void ) { - FG_LOG( FG_AIRCRAFT, FG_INFO, "Initializing Aircraft structure" ); - - current_aircraft.fdm_state = &cur_fdm_state; - current_aircraft.controls = &controls; -} - - -// Display various parameters to stdout -void fgAircraftOutputCurrent(fgAIRCRAFT *a) { - FGInterface *f; - - f = a->fdm_state; - - FG_LOG( FG_FLIGHT, FG_DEBUG, - "Pos = (" - << (f->get_Longitude() * 3600.0 * RAD_TO_DEG) << "," - << (f->get_Latitude() * 3600.0 * RAD_TO_DEG) << "," - << f->get_Altitude() - << ") (Phi,Theta,Psi)=(" - << f->get_Phi() << "," - << f->get_Theta() << "," - << f->get_Psi() << ")" ); - - FG_LOG( FG_FLIGHT, FG_DEBUG, - "Kts = " << f->get_V_equiv_kts() - << " Elev = " << controls.get_elevator() - << " Aileron = " << controls.get_aileron() - << " Rudder = " << controls.get_rudder() - << " Power = " << controls.get_throttle( 0 ) ); -} - - diff --git a/Simulator/Aircraft/aircraft.hxx b/Simulator/Aircraft/aircraft.hxx deleted file mode 100644 index 1ef175ad1..000000000 --- a/Simulator/Aircraft/aircraft.hxx +++ /dev/null @@ -1,61 +0,0 @@ -//************************************************************************* -// aircraft.hxx -- define shared aircraft parameters -// -// Written by Curtis Olson, started May 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 _AIRCRAFT_HXX -#define _AIRCRAFT_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include -#include - - -// Define a structure containing all the parameters for an aircraft -typedef struct{ - FGInterface *fdm_state; - FGControls *controls; -} fgAIRCRAFT ; - - -// current_aircraft contains all the parameters of the aircraft -// currently being operated. -extern fgAIRCRAFT current_aircraft; - - -// Initialize an Aircraft structure -void fgAircraftInit( void ); - - -// Display various parameters to stdout -void fgAircraftOutputCurrent(fgAIRCRAFT *a); - - -#endif // _AIRCRAFT_HXX - - diff --git a/Simulator/Airports/Makefile.am b/Simulator/Airports/Makefile.am deleted file mode 100644 index 250420518..000000000 --- a/Simulator/Airports/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -noinst_LIBRARIES = libAirports.a - -libAirports_a_SOURCES = \ - genapt.cxx genapt.hxx \ - simple.cxx simple.hxx - -INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib -I$(top_builddir)/Simulator diff --git a/Simulator/Airports/genapt.cxx b/Simulator/Airports/genapt.cxx deleted file mode 100644 index f4cbec060..000000000 --- a/Simulator/Airports/genapt.cxx +++ /dev/null @@ -1,296 +0,0 @@ -// -// genapt.cxx -- generate airport scenery from the given definition file -// -// 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 STL_STRING -#include - -#ifdef __BORLANDC__ -# define exception c_exception -#endif -#include - -#ifdef FG_HAVE_NATIVE_SGI_COMPILERS -# include -#endif - -#include -// #include -#include -#include -#include -#include -#include -#include - -// #include - -#include "genapt.hxx" - -FG_USING_STD(string); -FG_USING_STD(vector); - - -typedef vector < Point3D > container; -typedef container::iterator iterator; -typedef container::const_iterator const_iterator; - - -#define FG_APT_BASE_TEX_CONSTANT 2000.0 - -// Calculate texture coordinates for a given point. -static Point3D calc_tex_coords(const Point3D& node, const Point3D& ref) { - Point3D cp; - Point3D pp; - - cp = Point3D( node[0] + ref.x(), node[1] + ref.y(), node[2] + ref.z() ); - - pp = fgCartToPolar3d(cp); - - pp.setx( fmod(FG_APT_BASE_TEX_CONSTANT * pp.x(), 10.0) ); - pp.sety( fmod(FG_APT_BASE_TEX_CONSTANT * pp.y(), 10.0) ); - - if ( pp.x() < 0.0 ) { - pp.setx( pp.x() + 10.0 ); - } - - if ( pp.y() < 0.0 ) { - pp.sety( pp.y() + 10.0 ); - } - - return(pp); -} - - -// generate the actual base area for the airport -static void -gen_base( const Point3D& average, const container& perimeter, FGTileEntry *t) -{ - GLint display_list; - Point3D cart, cart_trans, tex; - MAT3vec normal; - double dist, max_dist, temp; - int center_num, i; - - fgFRAGMENT fragment; - - max_dist = 0.0; - - FG_LOG( FG_TERRAIN, FG_INFO, - "generating airport base for size = " << perimeter.size() ); - - fragment.init(); - fragment.tile_ptr = t; - - // find airport base material in the properties list - if ( ! material_mgr.find( APT_BASE_MATERIAL, fragment.material_ptr )) { - FG_LOG( FG_TERRAIN, FG_ALERT, - "Ack! unknown material name = " << APT_BASE_MATERIAL - << " in fgAptGenerat()" ); - } - - FG_LOG( FG_TERRAIN, FG_INFO, - " tile center = " - << t->center.x() << " " << t->center.y() << " " << t->center.z() ); - FG_LOG( FG_TERRAIN, FG_INFO, - " airport center = " - << average.x() << " " << average.y() << " " << average.z() ); - fragment.center = average; - - normal[0] = average.x(); - normal[1] = average.y(); - normal[2] = average.z(); - MAT3_NORMALIZE_VEC(normal, temp); - - display_list = xglGenLists(1); - xglNewList(display_list, GL_COMPILE); - xglBegin(GL_TRIANGLE_FAN); - - // first point center of fan - cart_trans = average - t->center; - t->nodes[t->ncount][0] = cart_trans.x(); - t->nodes[t->ncount][1] = cart_trans.y(); - t->nodes[t->ncount][2] = cart_trans.z(); - center_num = t->ncount; - t->ncount++; - - tex = calc_tex_coords( t->nodes[t->ncount-1], t->center ); - xglTexCoord2f(tex.x(), tex.y()); - xglNormal3dv(normal); - xglVertex3d(t->nodes[t->ncount-1][0], - t->nodes[t->ncount-1][1], - t->nodes[t->ncount-1][2]); - - // first point on perimeter - const_iterator current = perimeter.begin(); - cart = fgGeodToCart( *current ); - cart_trans = cart - t->center; - t->nodes[t->ncount][0] = cart_trans.x(); - t->nodes[t->ncount][1] = cart_trans.y(); - t->nodes[t->ncount][2] = cart_trans.z(); - t->ncount++; - - i = 1; - tex = calc_tex_coords( t->nodes[i], t->center ); - dist = cart.distance3Dsquared(average); - if ( dist > max_dist ) { - max_dist = dist; - } - xglTexCoord2f(tex.x(), tex.y()); - xglVertex3dv(t->nodes[i].get_n()); - ++current; - ++i; - - const_iterator last = perimeter.end(); - for ( ; current != last; ++current ) { - cart = fgGeodToCart( *current ); - cart_trans = cart - t->center; - t->nodes[t->ncount][0] = cart_trans.x(); - t->nodes[t->ncount][1] = cart_trans.y(); - t->nodes[t->ncount][2] = cart_trans.z(); - t->ncount++; - fragment.add_face(center_num, i - 1, i); - - tex = calc_tex_coords( t->nodes[i], t->center ); - dist = cart.distance3Dsquared(average); - if ( dist > max_dist ) { - max_dist = dist; - } - xglTexCoord2f(tex.x(), tex.y()); - xglVertex3dv(t->nodes[i].get_n()); - i++; - } - - // last point (first point in perimeter list) - current = perimeter.begin(); - cart = fgGeodToCart( *current ); - cart_trans = cart - t->center; - fragment.add_face(center_num, i - 1, 1); - - tex = calc_tex_coords( t->nodes[1], t->center ); - xglTexCoord2f(tex.x(), tex.y()); - xglVertex3dv(t->nodes[1].get_n()); - - xglEnd(); - xglEndList(); - - fragment.bounding_radius = sqrt(max_dist); - fragment.display_list = display_list; - - t->fragment_list.push_back(fragment); -} - - -// Load a .apt file and register the GL fragments with the -// corresponding tile -int -fgAptGenerate(const string& path, FGTileEntry *tile) -{ - string token; - string apt_id, apt_name; - char c; - int i = 1; - - // face list (this indexes into the master tile vertex list) - container perimeter; - Point3D p, average; - double avex = 0.0, avey = 0.0, avez = 0.0; - int size; - - // gpc_vertex p_2d, list_2d[MAX_PERIMETER]; - // gpc_vertex_list perimeter_2d; - - fg_gzifstream in( path ); - if ( !in.is_open() ) { - // return immediately assuming an airport file for this tile - // doesn't exist. - return 0; - } - - apt_id = ""; - - // read in each line of the file - in >> skipcomment; - while ( ! in.eof() ) - { - in >> token; - - if ( token == "a" ) { - // airport info record (start of airport) - - if ( apt_id.length() > 0 ) { - // we have just finished reading and airport record. - // process the info - gen_base(average, perimeter, tile); - } - - FG_LOG( FG_TERRAIN, FG_INFO, "Reading airport record" ); - in >> apt_id; - apt_name = ""; - i = 1; - avex = avey = avez = 0.0; - perimeter.erase( perimeter.begin(), perimeter.end() ); - // skip to end of line. - while ( in.get(c) && c != '\n' ) { - apt_name += c; - } - FG_LOG( FG_TERRAIN, FG_INFO, - "\tID = " << apt_id << " Name = " << apt_name ); - } else if ( token == "p" ) { - // airport area bounding polygon coordinate. These - // specify a convex hull that should already have been cut - // out of the base terrain. The points are given in - // counter clockwise order and are specified in lon/lat - // degrees. - in >> p; - avex += tile->nodes[i][0]; - avey += tile->nodes[i][1]; - avez += tile->nodes[i][2]; - perimeter.push_back(p); - ++i; - } else if ( token == "r" ) { - // runway record - // skip for now - while ( in.get(c) && c != '\n' ); - } - - in >> skipcomment; - } - - if ( apt_id.length() > 0 ) { - // we have just finished reading and airport record. - // process the info - size = perimeter.size(); - average = Point3D( avex / (double)size + tile->center.x(), - avey / (double)size + tile->center.y(), - avez / (double)size + tile->center.z() ); - - gen_base(average, perimeter, tile); - } - - return 1; -} - - diff --git a/Simulator/Airports/genapt.hxx b/Simulator/Airports/genapt.hxx deleted file mode 100644 index 911b547c2..000000000 --- a/Simulator/Airports/genapt.hxx +++ /dev/null @@ -1,65 +0,0 @@ -// -// getapt.hxx -- generate airport scenery from the given definition file -// -// 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 _GENAPT_HXX -#define _GENAPT_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include - -#include STL_STRING -#include - -#ifdef __BORLANDC__ -# define exception c_exception -#endif - -#include - -FG_USING_STD(string); -FG_USING_STD(set); - - -// maximum size of airport perimeter structure, even for complex -// airports such as KORD this number is typically not very big. -#define MAX_PERIMETER 20 - -// name of the material to use for the airport base -#define APT_BASE_MATERIAL "grass" - - -// Load a .apt file and register the GL fragments with the -// corresponding tile -int -fgAptGenerate(const string& path, FGTileEntry *tile); - - -#endif /* _AIRPORTS_HXX */ - - diff --git a/Simulator/Airports/old_draw_runways.c b/Simulator/Airports/old_draw_runways.c deleted file mode 100644 index efbb010c9..000000000 --- a/Simulator/Airports/old_draw_runways.c +++ /dev/null @@ -1,83 +0,0 @@ -// Scenery management routines - -/* static void fgSceneryInit_OLD() { */ - /* make scenery */ -/* scenery = fgSceneryCompile_OLD(); - runway = fgRunwayHack_OLD(0.69, 53.07); -} */ - - -/* create the scenery */ -/* GLint fgSceneryCompile_OLD() { - GLint scenery; - - scenery = mesh2GL(mesh_ptr_OLD); - - return(scenery); -} -*/ - -/* hack in a runway */ -/* GLint fgRunwayHack_OLD(double width, double length) { - static GLfloat concrete[4] = { 0.5, 0.5, 0.5, 1.0 }; - static GLfloat line[4] = { 0.9, 0.9, 0.9, 1.0 }; - int i; - int num_lines = 16; - float line_len, line_width_2, cur_pos; - - runway = xglGenLists(1); - xglNewList(runway, GL_COMPILE); - */ - /* draw concrete */ -/* xglBegin(GL_POLYGON); - xglMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, concrete ); - xglNormal3f(0.0, 0.0, 1.0); - - xglVertex3d( 0.0, -width/2.0, 0.0); - xglVertex3d( 0.0, width/2.0, 0.0); - xglVertex3d(length, width/2.0, 0.0); - xglVertex3d(length, -width/2.0, 0.0); - xglEnd(); - */ - /* draw center line */ -/* xglMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, line ); - line_len = length / ( 2 * num_lines + 1); - printf("line_len = %.3f\n", line_len); - line_width_2 = 0.02; - cur_pos = line_len; - for ( i = 0; i < num_lines; i++ ) { - xglBegin(GL_POLYGON); - xglVertex3d( cur_pos, -line_width_2, 0.005); - xglVertex3d( cur_pos, line_width_2, 0.005); - cur_pos += line_len; - xglVertex3d( cur_pos, line_width_2, 0.005); - xglVertex3d( cur_pos, -line_width_2, 0.005); - cur_pos += line_len; - xglEnd(); - } - - xglEndList(); - - return(runway); -} -*/ - -/* draw the scenery */ -/*static void fgSceneryDraw_OLD() { - static float z = 32.35; - - xglPushMatrix(); - - xglCallList(scenery); - - printf("*** Drawing runway at %.2f\n", z); - - xglTranslatef( -398391.28, 120070.41, 32.35); - xglRotatef(170.0, 0.0, 0.0, 1.0); - xglCallList(runway); - - xglPopMatrix(); -} -*/ - - diff --git a/Simulator/Airports/simple.cxx b/Simulator/Airports/simple.cxx deleted file mode 100644 index f9411a198..000000000 --- a/Simulator/Airports/simple.cxx +++ /dev/null @@ -1,128 +0,0 @@ -// -// simple.cxx -- a really simplistic class to manage airport ID, -// lat, lon of the center of one of it's runways, and -// elevation in feet. -// -// 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 - -#include -#include -#include -#include
- -#include STL_STRING -#include STL_FUNCTIONAL -#include STL_ALGORITHM - -#include "simple.hxx" - - -fgAIRPORTS::fgAIRPORTS() { -} - - -// load the data -int fgAIRPORTS::load( const string& file ) { - fgAIRPORT a; - - // build the path name to the airport file - FGPath path( current_options.get_fg_root() ); - path.append( "Airports" ); - path.append( file ); - - airports.erase( airports.begin(), airports.end() ); - - fg_gzifstream in( path.str() ); - if ( !in.is_open() ) { - FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << path.str() ); - exit(-1); - } - - /* - // We can use the STL copy algorithm because the input - // file doesn't contain and comments or blank lines. - copy( istream_iterator(in.stream()), - istream_iterator(), - inserter( airports, airports.begin() ) ); - */ - - // read in each line of the file - -#ifdef __MWERKS__ - - in >> skipcomment; - char c = 0; - while ( in.get(c) && c != '\0' ) { - in.putback(c); - in >> a; - airports.insert(a); - in >> skipcomment; - } - -#else - - in >> skipcomment; - while ( ! in.eof() ) { - in >> a; - airports.insert(a); - in >> skipcomment; - } - -#endif - - return 1; -} - - -// search for the specified id -bool -fgAIRPORTS::search( const string& id, fgAIRPORT* a ) const -{ - const_iterator it = airports.find( fgAIRPORT(id) ); - if ( it != airports.end() ) - { - *a = *it; - return true; - } - else - { - return false; - } -} - - -fgAIRPORT -fgAIRPORTS::search( const string& id ) const -{ - fgAIRPORT a; - this->search( id, &a ); - return a; -} - - -// Destructor -fgAIRPORTS::~fgAIRPORTS( void ) { -} - - diff --git a/Simulator/Airports/simple.hxx b/Simulator/Airports/simple.hxx deleted file mode 100644 index eee9737c9..000000000 --- a/Simulator/Airports/simple.hxx +++ /dev/null @@ -1,118 +0,0 @@ -// -// simple.hxx -- a really simplistic class to manage airport ID, -// lat, lon of the center of one of it's runways, and -// elevation in feet. -// -// 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 _AIRPORTS_HXX -#define _AIRPORTS_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include -#ifdef FG_HAVE_STD_INCLUDES -# include -#elif defined( FG_HAVE_NATIVE_SGI_COMPILERS ) -# include -#elif defined( __BORLANDC__ ) -# include -#else -# include -#endif - -#include STL_STRING -#include - -FG_USING_STD(string); -FG_USING_STD(set); - -#if ! defined( FG_HAVE_NATIVE_SGI_COMPILERS ) -FG_USING_STD(istream); -#endif - - -class fgAIRPORT { -public: - fgAIRPORT( const string& name = "", - double lon = 0.0, - double lat = 0.0, - double ele = 0.0 ) - : id(name), longitude(lon), latitude(lat), elevation(ele) {} - - bool operator < ( const fgAIRPORT& a ) const { - return id < a.id; - } - -public: - string id; - double longitude; - double latitude; - double elevation; -}; - -inline istream& -operator >> ( istream& in, fgAIRPORT& a ) -{ - return in >> a.id >> a.longitude >> a.latitude >> a.elevation; -} - -class fgAIRPORTS { -public: -#ifdef FG_NO_DEFAULT_TEMPLATE_ARGS - typedef set< fgAIRPORT, less< fgAIRPORT > > container; -#else - typedef set< fgAIRPORT > container; -#endif - typedef container::iterator iterator; - typedef container::const_iterator const_iterator; - -private: - container airports; - -public: - - // Constructor - fgAIRPORTS(); - - // Destructor - ~fgAIRPORTS(); - - // load the data - int load( const string& file ); - - // search for the specified id. - // Returns true if successful, otherwise returns false. - // On success, airport data is returned thru "airport" pointer. - // "airport" is not changed if "id" is not found. - bool search( const string& id, fgAIRPORT* airport ) const; - fgAIRPORT search( const string& id ) const; -}; - - -#endif /* _AIRPORTS_HXX */ - - diff --git a/Simulator/Airports/testair.cxx b/Simulator/Airports/testair.cxx deleted file mode 100644 index 97df920ee..000000000 --- a/Simulator/Airports/testair.cxx +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include "airports.hxx" - -fgGENERAL general; - -main() { - fgAIRPORTS a; - fgAIRPORT air; - - general.root_dir = getenv("FG_ROOT"); - - fgInitDebug(); - - a.load("Airports"); - - air = a.search("P13"); - - printf("%s %lf %lf %lf\n", air.id, - air.longitude, air.latitude, air.elevation); -} diff --git a/Simulator/Astro/Makefile.am b/Simulator/Astro/Makefile.am deleted file mode 100644 index 3d3af9f39..000000000 --- a/Simulator/Astro/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -noinst_LIBRARIES = libAstro.a - -libAstro_a_SOURCES = \ - celestialBody.cxx celestialBody.hxx \ - jupiter.cxx jupiter.hxx \ - mars.cxx mars.hxx \ - mercury.cxx mercury.hxx \ - moon.cxx moon.hxx \ - neptune.cxx neptune.hxx \ - pluto.hxx \ - saturn.cxx saturn.hxx \ - sky.cxx sky.hxx \ - solarsystem.cxx solarsystem.hxx \ - star.cxx star.hxx \ - stars.cxx stars.hxx \ - uranus.cxx uranus.hxx \ - venus.cxx venus.hxx - -INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib -I$(top_builddir)/Simulator diff --git a/Simulator/Astro/celestialBody.cxx b/Simulator/Astro/celestialBody.cxx deleted file mode 100644 index 715cd6133..000000000 --- a/Simulator/Astro/celestialBody.cxx +++ /dev/null @@ -1,176 +0,0 @@ -/************************************************************************** - * celestialBody.cxx - * Written by Durk Talsma. Originally started October 1997, for distribution - * with the FlightGear project. Version 2 was written in August and - * September 1998. This code is based upon algorithms and data kindly - * provided by Mr. Paul Schlyter. (pausch@saaf.se). - * - * 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 "celestialBody.hxx" -#include "star.hxx" -#include - -#ifdef FG_MATH_EXCEPTION_CLASH -# define exception c_exception -#endif -#include - -/************************************************************************** - * void CelestialBody::updatePosition(fgTIME *t, Star *ourSun) - * - * Basically, this member function provides a general interface for - * calculating the right ascension and declinaion. This function is - * used for calculating the planetary positions. For the planets, an - * overloaded member function is provided to additionally calculate the - * planet's magnitude. - * The sun and moon have their own overloaded updatePosition member, as their - * position is calculated an a slightly different manner. - * - * arguments: - * fgTIME t: provides the current time. - * Star *ourSun: the sun's position is needed to convert heliocentric - * coordinates into geocentric coordinates. - * - * return value: none - * - *************************************************************************/ -void CelestialBody::updatePosition(FGTime *t, Star *ourSun) -{ - double eccAnom, v, ecl, actTime, - xv, yv, xh, yh, zh, xg, yg, zg, xe, ye, ze; - - updateOrbElements(t); - actTime = fgCalcActTime(t); - - // calcualate the angle bewteen ecliptic and equatorial coordinate system - ecl = DEG_TO_RAD * (23.4393 - 3.563E-7 *actTime); - - eccAnom = fgCalcEccAnom(M, e); //calculate the eccentric anomaly - xv = a * (cos(eccAnom) - e); - yv = a * (sqrt (1.0 - e*e) * sin(eccAnom)); - v = atan2(yv, xv); // the planet's true anomaly - r = sqrt (xv*xv + yv*yv); // the planet's distance - - // calculate the planet's position in 3D space - xh = r * (cos(N) * cos(v+w) - sin(N) * sin(v+w) * cos(i)); - yh = r * (sin(N) * cos(v+w) + cos(N) * sin(v+w) * cos(i)); - zh = r * (sin(v+w) * sin(i)); - - // calculate the ecliptic longitude and latitude - xg = xh + ourSun->getxs(); - yg = yh + ourSun->getys(); - zg = zh; - - lonEcl = atan2(yh, xh); - latEcl = atan2(zh, sqrt(xh*xh+yh*yh)); - - xe = xg; - ye = yg * cos(ecl) - zg * sin(ecl); - ze = yg * sin(ecl) + zg * cos(ecl); - rightAscension = atan2(ye, xe); - declination = atan2(ze, sqrt(xe*xe + ye*ye)); - FG_LOG(FG_GENERAL, FG_INFO, "Planet found at : " - << rightAscension << " (ra), " << declination << " (dec)" ); - - //calculate some variables specific to calculating the magnitude - //of the planet - R = sqrt (xg*xg + yg*yg + zg*zg); - s = ourSun->getDistance(); - - // It is possible from these calculations for the argument to acos - // to exceed the valid range for acos(). So we do a little extra - // checking. - - double tmp = (r*r + R*R - s*s) / (2*r*R); - if ( tmp > 1.0) { - tmp = 1.0; - } else if ( tmp < -1.0) { - tmp = -1.0; - } - - FV = RAD_TO_DEG * acos( tmp ); -}; - -/**************************************************************************** - * double CelestialBody::fgCalcEccAnom(double M, double e) - * this private member calculates the eccentric anomaly of a celestial body, - * given its mean anomaly and eccentricity. - * - * -Mean anomaly: the approximate angle between the perihelion and the current - * position. this angle increases uniformly with time. - * - * True anomaly: the actual angle between perihelion and current position. - * - * Eccentric anomaly: this is an auxilary angle, used in calculating the true - * anomaly from the mean anomaly. - * - * -eccentricity. Indicates the amount in which the orbit deviates from a - * circle (0 = circle, 0-1, is ellipse, 1 = parabola, > 1 = hyperbola). - * - * This function is also known as solveKeplersEquation() - * - * arguments: - * M: the mean anomaly - * e: the eccentricity - * - * return value: - * the eccentric anomaly - * - ****************************************************************************/ -double CelestialBody::fgCalcEccAnom(double M, double e) -{ - double - eccAnom, E0, E1, diff; - - eccAnom = M + e * sin(M) * (1.0 + e * cos (M)); - // iterate to achieve a greater precision for larger eccentricities - if (e > 0.05) - { - E0 = eccAnom; - do - { - E1 = E0 - (E0 - e * sin(E0) - M) / (1 - e *cos(E0)); - diff = fabs(E0 - E1); - E0 = E1; - } - while (diff > (DEG_TO_RAD * 0.001)); - return E0; - } - return eccAnom; -} - - - - - - - - - - - - - - - - - - - - diff --git a/Simulator/Astro/celestialBody.hxx b/Simulator/Astro/celestialBody.hxx deleted file mode 100644 index 3deccc09f..000000000 --- a/Simulator/Astro/celestialBody.hxx +++ /dev/null @@ -1,195 +0,0 @@ -/************************************************************************** - * celestialBody.hxx - * Written by Durk Talsma. Originally started October 1997, for distribution - * with the FlightGear project. Version 2 was written in August and - * September 1998. This code is based upon algorithms and data kindly - * provided by Mr. Paul Schlyter. (pausch@saaf.se). - * - * 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 _CELESTIALBODY_H_ -#define _CELESTIALBODY_H_ - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#include